openssl:一部のバージョンではローカル発行者証明書を取得できません。

openssl:一部のバージョンではローカル発行者証明書を取得できません。

OpenSSL 1.0.2g(OS XのMacPorts)を使用してGoogleの証明書を確認できます(OS Xでは、通常はキーチェーンに証明書バンドルを保存するため、証明書バンドルを指定する必要があります)。

$ echo Q |  /opt/local/bin/openssl s_client   -connect www.google.com:443 -servername www.google.com -verify 6 -CAfile test/cabundle.crt > /dev/null 
verify depth is 6
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = www.google.com
verify return:1
DONE

すべてが大丈夫です。システムバージョン(0.9.8zg)を使用すると、まったく同じCAバンドルを保持エラーが発生します。

$ echo Q |  /usr/bin/openssl s_client   -connect www.google.com:443 -servername www.google.com -verify 6 -CAfile test/cabundle.crt > /dev/null 
verify depth is 6
depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
verify error:num=27:certificate not trusted
verify return:1
depth=1 /C=US/O=Google Inc/CN=Google Internet Authority G2
verify return:1
depth=0 /C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
verify return:1
DONE

CAバンドルを手動で指定するため、どこで問題が発生するのかわかりません。

答え1

~からhttps://trac.macports.org/ticket/47805

問題は、AppleがGoogle(および他のウェブサイト)証明書の信頼アンカーとして使用されていたYosemiteの1024ビットルートを削除したことです。通常、チェーンの中間証明書の1つがOS Xの信頼できるルートCA(Googleの場合はGeoTrust Global CA)ではないため、証明書の有効性には影響しません。

ただし、1.0.2より前のOpenSSLはこれを検出できず(仲介者が信頼できるルートCAであることを確認して)、常に信頼チェーンを最後まで追いつきました。この場合、証明書チェーンの終わりが実際に信頼できないため、証明書を確認できません。 OpenSSL 1.0.2はこの問題を解決するためにスイッチを追加しましたが(openssl s_clientの-trusted_firstによって有効になっています)、このオプションは各ソフトウェアで個別に有効にする必要があります。

関連情報