リモートサーバーの証明書を取得しようとしています。これを使用して、キーストアに追加し、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フラグを使うことができると言っていますが、助けにはならないようです。私は無駄に複数のパスを試してみました。
どこに問題があるのか教えてください。
ここでもっと複雑なことがわかりました。このローリングを得るには、もっと多くの詳細を提供する必要がありました。それは、クライアント認証を必要とする接続と、証明書がダンプされた段階を継続するためのさらなる情報を必要とするという事実と関係があると思います。
これが私の作業中のコマンドです。
openssl s_client -connect Host:port -key our_private_key.pem -showcerts \
-cert our_server-signed_cert.pem
うまくいけば、これはいくつかのより多くの情報を行うことができます誰のための正しい方向へのナッジです。
リモートサーバがSNIを使用している(つまり、単一のIPアドレスで複数のSSLホストを共有している)場合は、正しい証明書を取得するために正しいホスト名を送信する必要があります。
openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null
リモートサーバーが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
私はAriの答えに同意しますが(そしてそれを支持しました:)、私はそれをWindows上のJavaで動作させるために追加のステップを実行する必要がありました(それがデプロイされる必要がある)。
openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der
openssl x509 -outform DER
変換を追加する前に、私は証明書のフォーマットについて文句を言うWindowsのkeytoolからエラーを得ていました。 .derファイルのインポートはうまくいきました。
これを行うための最も簡単なコマンドラインには、キーストアに追加するためのPEM出力、および人間が読める形式の出力が含まれています。SNIもサポートされています。
openssl s_client -servername example.com -connect example.com:443 \
</dev/null 2>/dev/null | openssl x509 -text
-servername オプションはSNIサポートを有効にし、 openssl x509 -text は証明書を人間が読める形式で出力します。
リモートサーバーの証明書を取得するには、openssl
ツールを使用できます。BEGIN CERTIFICATE
とEND CERTIFICATE
の間にあれば、コピーして証明書ファイル(CRT)に貼り付けることができます。
これを示すコマンドは次のとおりです。
ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
チェーンからすべての証明書を返すには、次のようにg
(global)を追加するだけです。
ex +'g/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq
そうすれば、証明書ファイル(file.crt
)をキーチェーンにインポートして信頼できるようにすることができるので、Javaは文句を言うべきではありません。
OS Xでは、ファイルをダブルクリックするか、キーチェーンアクセスにドラッグアンドドロップすると、login/Certificatesに表示されます。次に、インポートされた証明書をダブルクリックして 常にSSLを信頼する にします。
CentOS 5では、それらを/etc/pki/tls/certs/ca-bundle.crt
ファイルに追加(および実行:Sudo update-ca-trust force-enable
)するか、CentOS 6ではそれらを/etc/pki/ca-trust/source/anchors/
にコピーしてSudo update-ca-trust extract
を実行することができます。
Ubuntuでは、それらを/usr/local/share/ca-certificates
にコピーしてSudo update-ca-certificates
を実行します。
PEM形式でリモートサーバーから証明書を抽出するためのワンライナー。今回はsed
を使用します。
openssl s_client -connect www.google.com:443 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
Host=gmail-pop.l.google.com
PORT=995
openssl s_client -servername $Host -connect $Host:$PORT < /dev/null 2>/dev/null | openssl x509 -outform pem
次のbashスクリプトを使ってサーバーのルート証明書を取得して保存できます。
CERTS=$(echo -n | openssl s_client -connect $Host_NAME:$PORT -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p')
echo "$CERTS" | awk -v RS="-----BEGIN CERTIFICATE-----" 'NR > 1 { printf RS $0 > "'$SERVER_ROOT_CERTIFICATE'"; close("'$SERVER_ROOT_CERTIFICATE'") }'
必要な変数を上書きするだけです。
サーバーの証明書ではなく、証明書チェーンのみを印刷するには
# MYHOST=myhost.com
# MYPORT=443
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}'
centOS/RHEL 6/7でCAの信頼を更新する方法
# update-ca-trust enable
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >/etc/pki/ca-trust/source/anchors/myca.cert
# update-ca-trust extract
centOS/RHEL 5の場合:
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >>/etc/pki/tls/certs/ca-bundle.crt
サーバーが電子メールサーバー(MS ExchangeまたはZimbra)の場合、starttls
およびsmtp
フラグを追加する必要があります。
openssl s_client -starttls smtp -connect Host_EMAIL:SECURE_PORT 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > CERTIFICATE_NAME.pem
どこで、
Host_EMAILは、mail-server.comなどのサーバードメインです。
SECURE_PORTは、587または465などの通信ポートです。
CERTIFICATE_NAME出力のファイル名(BASE 64/PEM形式)
AWS CloudFront にアクセスするときにここで良いアドバイスに従おうとしたが失敗した私のような他の人の利益のために、トリックは-servername domain.name..
を追加することです。