web-dev-qa-db-ja.com

NginxクライアントSSL認証

Nginxを純粋にさまざまな数のWebサーバーへのプロキシとして実行しています。あるクライアントからクライアント証明書の使用を依頼され、プロキシサーバーの1つで実行されているWebサービスに接続する3つの異なるマシンに3つの証明書が提供されました。

関連するnginx設定を見つけてサイト構成を作成する前にこれを行ったことはありません(以下の関連部分)

      server {
        listen                  443 ssl; 
        server_name             service.domain.com;
        ssl_certificate         /etc/nginx/ssl/wildcard/server.crt; 
        ssl_certificate_key     /etc/nginx/ssl/wildcard/server.key; 
        ssl_client_certificate  /etc/nginx/ssl/client.certificates/client_package.cer;
        ssl_verify_client on;

3つのクライアント証明書と、開発中にサイトにアクセスする必要がある開発者(これは自己署名されたもの)が作成した証明書を、上記の1つのファイルに連結しました。

クライアントはサイトにアクセスしようとしましたが、アクセスできません。構成のテストとして、連結した証明書ファイルから開発者証明書を削除し、サイトにアクセスできないことを確認しました。私が彼の証明書を連結ファイルに戻すと、彼(開発者)は再びサイトに正しくアクセスできるようになりました。

エラーログでデバッグレベルのアクセスをオンにし、クライアントが接続しようとすると、次のエラーが発生しました。

2015/08/13 11:57:41 [情報] 27601#0:* 1963クライアントはSPDYの処理中に必要なSSL証明書を送信しませんでした、クライアント:1x.xx.xx.xx、サーバー:service.domain.com、リクエスト: " GET /test.cfm HTTP/1.1 "、ホスト:" service.domain.com "

上記の設定からわかるように、SPDYを有効にしていません(ただし、他のサイトでは有効にしています)。クライアントは、クライアントがクライアント証明書を送信していることを確認します。これが初めてのことなので、戻ってログにクライアント証明書を送信していないと記載する前に、この問題をすべて修正しておきます。

私に送信された証明書に関して:3つすべてが同じ公的認証局によって署名されています。ただし、連結されたファイルにチェーン全体はありません。オンラインで私が見つけたガイドには、ルートCAもあると記載されていますが、それらはすべて自己署名について話しているもので、どれもそうではありません。だから私はそれが当てはまるかわかりません。

同様に明確にするために、プロキシされたサーバーにクライアント証明書を渡そうとはしていません。

nginxバージョン:nginx/1.8.0
opensslバージョン:OpenSSL 1.0.1k 2015年1月8日

さらに情報が必要な場合はお知らせください

7
Drifter104

実際の構成は正しいです。ただし、実際のクライアント証明書をclient_package.cerファイルに含めないようにしてください。このファイルには信頼できるCA証明書のみが含まれている必要があり、実際には完全なチェーンが含まれている必要があります。ルート証明書と中間証明書が提供されていない場合は、それらをクライアントに要求する必要があります。

デフォルトのサーバー設定に関連するいくつかの落とし穴もあります。 これを読んでください で、影響がないことを確認してください。

1
dtoubelis

使用する ssl_trusted_certificateディレクティブの代わりにssl_client_certificate。 docs http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_trusted_certificate を参照してください。

しかし、とにかく、私はすべてのクライアント証明書にONE ROOT CAで署名することをお勧めし、クライアント証明書がそのCAで署名されているかどうかを確認します。

問題が解決した場合は、それを回答として受け入れてください。

0
mvorisek