web-dev-qa-db-ja.com

Opensslを使用してサーバーから証明書を取得する

リモートサーバーの証明書を取得しようとしています。これを使用して、キーストアに追加し、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フラグを使うことができると言っていますが、助けにはならないようです。私は無駄に複数のパスを試してみました。

どこに問題があるのか​​教えてください。

281
nasty pasty

ここでもっと複雑なことがわかりました。このローリングを得るには、もっと多くの詳細を提供する必要がありました。それは、クライアント認証を必要とする接続と、証明書がダンプされた段階を継続するためのさらなる情報を必要とするという事実と関係があると思います。

これが私の作業中のコマンドです。

openssl s_client -connect Host:port -key our_private_key.pem -showcerts \
                 -cert our_server-signed_cert.pem

うまくいけば、これはいくつかのより多くの情報を行うことができます誰のための正しい方向へのナッジです。

36
nasty pasty

SNIとは

リモートサーバがSNIを使用している(つまり、単一のIPアドレスで複数のSSLホストを共有している)場合は、正しい証明書を取得するために正しいホスト名を送信する必要があります。

openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null

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
374
Ari Maniatis

私は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ファイルのインポートはうまくいきました。

60
David Jaquay

これを行うための最も簡単なコマンドラインには、キーストアに追加するための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 は証明書を人間が読める形式で出力します。

28
Florian

リモートサーバーの証明書を取得するには、opensslツールを使用できます。BEGIN CERTIFICATEEND 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を実行します。

21
kenorb

PEM形式でリモートサーバーから証明書を抽出するためのワンライナー。今回はsedを使用します。

openssl s_client -connect www.google.com:443 2>/dev/null </dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
18
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
5
akond

次の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'") }'

必要な変数を上書きするだけです。

4

サーバーの証明書ではなく、証明書チェーンのみを印刷するには

# 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
4

サーバーが電子メールサーバー(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形式)

1
SHoko

AWS CloudFront にアクセスするときにここで良いアドバイスに従おうとしたが失敗した私のような他の人の利益のために、トリックは-servername domain.name..を追加することです。

ソース: https://serverfault.com/a/780450/8972

1
Amos Shapira