リモート サーバーの証明書を取得して、それをキーストアに追加し、Java アプリケーション内で使用しようとしています。
上級開発者(休暇中:( ) が、これを実行できると教えてくれました:
openssl s_client -connect host.host:9999
生の証明書をダンプして、それをコピーしてエクスポートします。次の出力が表示されます。
depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:
このオプションでも試してみました:
-showcerts
そしてこれも(Debian 上で実行されています):
-CApath /etc/ssl/certs/
しかし、同じエラーが発生します。
この情報源CApath フラグを使用できるとのことですが、役に立たないようです。複数のパスを試しましたが、効果はありませんでした。
どこが間違っているのか教えてください。
ベストアンサー1
SNIで
リモート サーバーが SNI を使用している場合 (つまり、単一の IP アドレスで複数の SSL ホストを共有している場合)、正しい証明書を取得するには正しいホスト名を送信する必要があります。
openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null
のようなエラーが発生した場合は、ドメインがサポートしていない可能性があるためxxx:error:xxx:BIO routines:BIO_lookup_ex:system lib:crypto/bio/bio_addr.c:758:nodename nor servname provided, or not known connect:errno=0
、 なしで同じコマンドを実行してください。www
企業のファイアウォールの背後にいる可能性もありますがSecure Renegotiation IS NOT supported
、その場合、一時的な(ただし危険な)回避策として、-legacy_renegotiation
上記のコマンドに追加できるパラメータがあります。
SNIなし
リモート サーバーが SNI を使用していない場合は、-servername
パラメータをスキップできます。
openssl s_client -showcerts -connect www.example.com:443 </dev/null
サイトの証明書の詳細を表示するには、次のコマンド チェーンも使用できます。
$ echo | \
openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
openssl x509 -text