私は現在、NginXリバースプロキシを介してメールサーバーのクライアント証明書認証を設定しているときに、粘り強い問題に取り組んでいます。
セットアップは、クライアント証明書がなくてもほとんどの部分で機能しているようです。しかし、それらのチェックを有効にして、openssl s_client
でテストを実行すると、常に次のようになります。
Verify return code: 2 (unable to get issuer certificate)
私のnginx.confの関連部分は次のとおりです。
ssl on;
ssl_certificate /etc/ssl/certs/server_cert.pem;
ssl_certificate_key /etc/ssl/private/server_key.pem;
ssl_client_certificate /etc/ssl/certs/IntermediateCA_chain.crt;
ssl_crl /etc/ssl/crl.pem;
ssl_verify_client on;
ファイルIntermediateCA_chain.crtはPEM形式であり、IntermediateCAの証明書とその後のRootCAの証明書の両方で構成されます。
サイドノート:私がするとき
openssl x509 -text -noout -in IntermediateCA_chain.crt
IntermediateCAの証明書のみが表示されます。チェーンが表示されることを期待していました。それは正しい振る舞いですか?
次のコマンドで接続をテストします。
openssl s_client -connect server:995 -cert mycert.pem\
-key mykeyfile.pem -debug -CAfile IntermediateCA_chain.pem
その結果
[...]
0b50 - b3 c3 3b 17 66 8e 52 b3-ad 7f 14 ..;.f.R....
depth=1 DC = top, DC = ad, CN = Intermediate CA
verify error:num=2:unable to get issuer certificate
issuer= C = DE, O = My Company, CN = My Companies Root CA, emailAddress = [email protected]
read from 0x10f6a10 [0x10fe333] (5 bytes => 5 (0x5))
[...]
考えられるIntermediateCA_chain.pemのすべてのバリエーション(IntermediateCA.pem、RootCA.pem、IntermediateCA_chein.pem)を両側で試しました。
使用された-CAfile
によってわずかに変化し、サーバーのログには何も表示されないため(文字通り何も-接続試行などなし)、障害はクライアント側にあるように見えます。サーバー側またはクライアント側のIntermediateCA_chain.pemが正しく読み取られていないように見えます。このエラーにより、opensslはIntermediateCAとそれによって発行された証明書を検証できなくなったようです。誰かが私がこの謎を解くのを手伝ってくれる?
問題は解決しました。
それが他の誰かを助けるかもしれないというわずかな可能性のための理由と解決策を投稿します:
最初のエラー(verify error:num=2:unable to get issuer certificate
)は、クライアント側で使用された-CAfile
の形式に起因していました。これはx509PEM形式であり、RootCAの証明書によるIntermediateCAの証明書のチェーンが含まれていました。問題は、それがまたそれぞれの証明書ブロックの後に各CAのCRL(証明書失効リスト)を含んでいたことでした。それらを削除すると、このエラーが解決しました。
その後、nginx.confの個々のオプションをオンにすることで診断したわかりにくい「SSLエラー」しか発生しませんでした(ヒントをありがとう@mofoe!)。 nginx.conf内のssl_crl
には、IntermediateCAのCRL(x509 PEM形式!)だけでなく、Root-CAのCRLも含める必要があることがわかりました。これら2つを1つのCRLファイルに結合すると、2番目のエラーが解決され、サーバーは予期されたメールサーバーのウェルカムメッセージで応答しました。