1つの仮想サーバーでssl_verify_client = ONを使用し、別の仮想サーバーでssl_verify_client = OFFを使用する方法


9

仮想ホスト上で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にバインドする必要がありますが、問題は解決しますか?

回答:


4

私は同様の問題に遭遇しましたがssl_verify_clients、サーバーブロック間ではなく、サーバーブロック内のロケーションブロック間を区別しようとしています。おそらく、デフォルトのssl configを2つのサーバーに移動することで問題を解決できます(複製するか、必ず1つをすべて1つのサーバーブロックに入れ、複数のサブドメインを受け入れ、場所を使用します)。

ロケーションベースのソリューションの場合、次のように見えます。使用する

ssl_verify_client optional;

サーバーブロックで、さまざまな場所でifステートメントを使用します。例:

if ($ssl_client_verify != SUCCESS) { return 403; }

私はこれを実行して、管理者にWebアプリケーションへのアクセスを許可し、それでもgithubにクライアントのssl証明書を与えずにgithubからのwebhookを許可する必要がありました。


2

同じIPアドレスとポートで複数の名前ベースの仮想ホスト(SNIを使用)を使用するがssl_verify_client、これらのホストの設定が異なる場合は、少なくともnginx> = 1.0.9にアップグレードする必要があります。

以前のnginxバージョンではssl_verify_client、デフォルトの仮想ホストの設定は、同じIP +ポートの組み合わせで他のすべての名前ベースの仮想ホストに使用されていました。他のいくつかのSSLオプション(ssl_verify_depthssl_prefer_server_ciphers)も同じ方法で処理されました。絶対にアップグレードできない場合は、別のIPまたはポートを使用することで回避できます。

1.0.9 のnginx変更ログからのメモ:

*) Bugfix: the "ssl_verify_client", "ssl_verify_depth", and
   "ssl_prefer_server_ciphers" directives might work incorrectly if SNI
   was used.

nginxのソース内の関連する変更: r4034トランク内、r4246 1.0ブランチインチ


0

ブラウザにCA "/etc/certs/allcas.pem"によって署名されたクライアント証明書(PKCS12形式)をロードしましたか?Firefoxでは、[設定]-> [詳細設定]-> [暗号化]-> [証明書の表示]-> [証明書]に移動して、クライアント証明書を確認できます。

デフォルトで「オフ」の場合、パラメーター「ssl_verify_client」の値。SSLクライアント証明書が必須ではない場合は、値「optional」を使用することもできます。


私はcurl --cert ...を使用していますが、同じ結果が得られます。
Alexander Artemenko

nginxのエラーログに興味深いものはありますか?(おそらく/var/log/nginx/error.log)
user1025596

0

私はnginxの専門家ではありませんが、SSLおよび仮想ホストを使用するApacheで同様の問題が発生しました。問題は、サーバーがSSLネゴシエーションと仮想ホストの選択を処理する順序です。最初のステップは暗号化された接続を確立することであり、それが完了した後でのみ、サーバーは要求しているホスト名を認識します。そして、それがわかるまで、デフォルト設定を使用します。この場合、最初のホストであり、SSL接続を確立するためにクライアント証明書が必要です。

だから、短い答え-この場合、別々のポートまたは別々のIPアドレスのどちらかを持っている方が良いでしょう。


-1

私は同じ問題に遭遇し、解決策を見つけました。

default_server2番目のサーバーのフラグを追加してみてください

listen 443 ssl default_server;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.