仮想ホスト上でsslクライアント検証を強制したいのですが。しかし、「必要なSSL証明書は送信されませんでした」というエラーが表示され、そこから何かを取得しようとしました。
これが私のテスト設定です:
# defaults
ssl_certificate /etc/certs/server.cer;
ssl_certificate_key /etc/certs/privkey-server.pem;
ssl_client_certificate /etc/certs/allcas.pem;
server {
listen 1443 ssl;
server_name server1.example.com;
root /tmp/root/server1;
ssl_verify_client off;
}
server {
listen 1443 ssl;
server_name server2.example.com;
root /tmp/root/server2;
ssl_verify_client on;
}
最初のサーバーは200 HTTPコードで応答しますが、2番目は「400 Bad Request、No required SSL certificate was sent、nginx/1.0.4」を返します。
おそらく、同じIPでssl_verify_clientを使用することは不可能でしょうか?これらのサーバーを別のIPにバインドする必要がありますが、問題は解決しますか?
私は同様の問題に遭遇しましたが、サーバーブロック間ではなく、サーバーブロック内のロケーションブロック間で_ssl_verify_clients
_を区別しようとしています。おそらく、デフォルトのssl config要素を2つのサーバーに移動することで問題を解決できます(それを複製するか、すべてを1つのサーバーブロックに入れ、複数のサブドメインを受け入れ、場所を使用します)。
ロケーションベースのソリューションの場合、次のように動作します。使用する
_ssl_verify_client optional;
_
サーバーブロックで、さまざまな場所でifステートメントを使用します。例:
if ($ssl_client_verify != SUCCESS) { return 403; }
私はこれを実行して、管理者にwebappへのアクセスを許可し、それでもgithubにクライアントのssl証明書を与えずにgithubからのwebhookを許可する必要がありました。
同じIPアドレスとポートで複数の名前ベースの仮想ホスト(SNIを使用)を使用したいが、これらのホストのssl_verify_client
設定が異なる場合は、少なくともnginx> = 1.0.9にアップグレードする必要があります。
以前のnginxバージョンでは、デフォルトの仮想ホストのssl_verify_client
設定は、同じIP +ポートの組み合わせの他のすべての名前ベースの仮想ホストに使用されていました。他のいくつかのSSLオプション(ssl_verify_depth
、ssl_prefer_server_ciphers
)も同様に処理されました。絶対にアップグレードできない場合は、別のIPまたはポートを使用することで回避できます。
1.0.9のnginx changelog からのメモ:
*) Bugfix: the "ssl_verify_client", "ssl_verify_depth", and
"ssl_prefer_server_ciphers" directives might work incorrectly if SNI
was used.
ブラウザにCA "/etc/certs/allcas.pem"によって署名されたクライアント証明書(PKCS12形式)をロードしましたか? Firefoxでは、[設定]-> [詳細設定]-> [暗号化]-> [証明書の表示]-> [証明書]に移動して、クライアント証明書を確認できます。
デフォルトで「オフ」の場合、パラメーター「ssl_verify_client」の値。 SSLクライアント証明書が必須ではない場合は、値「optional」を使用することもできます。
私はnginxの専門家ではありませんが、SSLおよび仮想ホストを使用するApacheで同様の問題が発生しました。問題は、サーバーがSSLネゴシエーションと仮想ホストの選択を処理する順序です。最初のステップは暗号化された接続を確立することであり、それが完了した後にのみ、サーバーは要求しているホスト名を認識します。そして、それがわかるまで、デフォルト設定を使用します-この場合、最初のホストであり、SSL接続を確立するためにクライアント証明書を必要とします。
だから、短い答え-この場合、別々のポートまたは別々のIPアドレスのどちらかを持っている方が良いでしょう。