web-dev-qa-db-ja.com

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

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

8

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

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

_ssl_verify_client optional;_

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

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

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

3
Ethan

同じ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 changelog からのメモ:

*) 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ブランチ内。

2
Sergey Vlasov

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

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

0
user1025596

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

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

0
Jenny D