OpenVPNサーバーを構成すると、openvpn-plugin-auth-pam
プラグインを使用して、証明書ベースの認証またはユーザー名/パスワード認証を有効にできますが、同時に両方を有効にすることはできません。
次のようにユーザー名/パスワード認証を有効にします。
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so login
client-cert-not-required
username-as-common-name
しかし、次の行を追加するとすぐに、証明書認証用に構成されたクライアントが、ログ内の次のメッセージを処理しなくなります。
TLS Error: Auth Username/Password was not provided by peer
TLS Error: TLS handshake failed
証明書認証を使用するクライアントからユーザー名/パスワードを要求しない方法はありますか?
OpenVPNは複数の同時認証方法をサポートしていません。コメントで述べたように、これに対する最善の解決策は、OpenVPNの2つのインスタンスを実行することです。同じボックスで実行するのはより複雑ですが、確実に実行可能です。
ただし、状況に適した回避策がいくつかあるようです。
パスワードが必要な証明書と不要な証明書がわかっている場合、答えは「はい」です。サーバー側で「auth-user-pass-verify」スクリプトを使用して、最初に証明書DNを検証します(--username-as-common-nameも設定した場合、検証スクリプト内の証明書の共通名が自動的にわかります) )。パスワードが入力されたことがわかっている証明書の場合は、pamを使用してユーザー名/パスワードを確認します。証明書にパスワードが含まれていないことがわかっている場合は、スクリプトに「0」を返させてアクセスを許可します。
ユーザーが証明書のパスワードを入力したかどうかを自動的に判断する方法はないことに注意してください。これはopensslハンドシェイクの外にあるため、OpenVPNサーバーには認識されません。
ソース: https://openvpn.net/archive/openvpn-users/2007-12/msg00179.html
また、OpenVPNで生成されたキーペアをローカルLDAPサーバーに統合し、前述のスクリプトを使用して、提供された証明書でLDAPに対する認証を行うか、証明書が提示されなかった場合に提供された資格情報を使用することもできます。