2017-09-26 2 views
0

私は証明書についてユーザに知らせるカスタムを実装しようとしており、問題があっても引き続きサーバを使用できるようにしています。潜在的にリーフ証明書だけが与えられた証明書チェーンを取得するにはどうすればよいですか?

私はほとんどすべてを引き合いに出し、さまざまな証明書に対してbadssl.comのテストを開始しました。

私はSafariでexpired.badssl.comを訪れたとき、私は証明書を参照してください。

* COMODO RSA Certification Authority 
    * COMODO RSA Domain Validation Secure Server CA 
     * *.badssl.com 

をそして、私のアプリケーションは、完全なチェーンを取得します。

私はwrong.host.badssl.comにアクセスすると、しかし、Safariはまだ3つの証明書を示しているが、自分のアプリケーションには2つだけを見ている:

* DigiCert Global Root CA (Not in the array passed to the method!) 
    * DigiCert SHA2 Secure Server CA 
     * *.badssl.com 

私は「DigiCert SHA2セキュアサーバーCA」から「発行者」の名前を使用することができます仮定何とかルート証明書を見つけるための証明書がありますが、ここではですか?

答えて

3

サーバーのチェーン(または一般に受信チェーン)を検証するために使用されるルート証明書は、ローカルトラストストアにあります。つまり、デフォルトのTrustManagerがローカルトラストストア内にあるか、より正確にはCertPathValidatorがインスタンス化されます。通常はローカルファイルからデフォルトで初期化されたtruststore(証明書エントリを含むKeyStore)にあるPKIXValidatorにデフォルト設定されます。 JRE/lib/security/cacertsを実行し、サブジェクト名でHashMapを使用して前記トラストストアからルートをルックアップすることによって検証を行うバリデーターを実行します。

簡潔に言えば、in RFC 5246 for TLS 1.2(1.1は4346、1.0は2346と同じ)。

もっと詳しく見ると、ケースが実際にあなたと違うわけではないことがわかります。

wrong.host.badssl.com

は、以下からなる証明書チェーン機能:
* https://crt.sh/?id=205900989葉を* .badssl.com DigiCert SHA2 SecServerCAによって発行された
* https://crt.sh/?id=1262388中間DigiCert GlobalRootCAによって発行されたSHA1フィンガープリントA8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436でルート https://crt.sh/?id=853428を使用しています
いる必要になりますJava(少なくともOracle/Sun Java、OpenJDKはそれがどのように構築されたかによって異なる場合があります)を含むすべての一般的なトラストストアを検索します。証明書のワイルドカード名の照合は1つ(最も左側)のDNSラベル(これは2つ必要です)を行わないため、 *.badssl.comに有効な証明書は wrong.host.badssl.comで失敗します。
* https://crt.sh/?id=7176112葉* .badssl.com
* https://crt.sh/?id=1044348ブリッジAddTrust ExternalRoot
によって(2020年まで)2000発行COMODO RSACertAuthによって発行された中間 https://crt.sh/?id=3509153 *
COMODO RSADomainValCAによって発行:

expired.badssl.comは、以下からなる証明書チェーンが機能します は、SHA1フィンガープリント02FAF3E291435468607857694DF5E45B68851868のAddTrustルートhttps://crt.sh/?id=1を使用して送信されます。しかし、COMODO RSAには、Oracle Javaの初めの8u51など、広く受け入れられているSHA1フィンガープリントAFE5D244A8D1194230FF479FE2F897BBCD7A8CB4を持つ独自のルートhttps://crt.sh/?id=1720081(2038年まで)があります。 (AddTrust Externalは、私が簡単にチェックすることができる最古の6u07です。)サファリが交換されたのを見たら、 COMODO RSAのブリッジ証明書がCOMODO RSA)ルート;任意のrelierはこの種のショートカットを行うことが許可されており、私の(ほぼ現在の)Firefox、IE、Chrome/Windowsはすべてこの場合に行います。

(チェックリストのPS:&の貼り付けが簡単で、SHA1の衝突が一部検出されているため、SHA1の指紋を使用しています。なぜなら、署名の相関関係をはるかに困難であり、とにかくのみ第二プレイメージは、実際に問題になるだろうと、私の知る限り、誰がまったくその上の任意の進歩を遂げていないデータではなく、完全な本命。)


質問上記で参照されたRFCのためにあなたのタイトルでは、「葉の証明書のみを与えられました」がTLSで決して出てはいけません。しかし、もしそうならば、これはほぼOpenSSL generate certificate chainの複製であり、同じロジックが適用されます:私が手動で行ったように、CAの監督に従ってください。

+1

そのような場合でも、その質問が重複しているとは確信していません。なぜなら、その質問はopensslでどうやっているのかということです。この質問はJavaで行う方法ですopensslに。 – Trejkaz

+0

@Trejkaz:公正なポイント;修飾された –

関連する問題