プログラマーの観点から見ると、X.509 証明書を検証するにはいくつかのことが必要です。
- 「トラスト アンカー」のセット — 信頼する CA のルート証明書。攻撃者が CA 証明書を自分の偽物に置き換えないように、これらは改ざんから保護する必要があります。これらの証明書の公開鍵は、他の証明書のデジタル署名を検証するために使用されます。
- 中間証明書のコレクション。アプリケーションはこれらのコレクションを保持する場合がありますが、証明書を使用する SSL や S/MIME などのほとんどのプロトコルには、追加の証明書を提供する標準的な方法があります。これらを保管するのに特別な注意は必要ありません。それらの整合性は、ルート CA の署名によって保護されています。
- 失効情報。証明書が CA によって発行された場合でも、秘密鍵が開示されたか、エンド エンティティが ID を変更したために、時期尚早に取り消された可能性があります。(たとえば、ある人が転職し、以前の会社名が記載された証明書が取り消された場合。) CRL または OCSP などの Web サービスを使用して、証明書のステータスに関する更新を取得できます。
これらの入力が利用可能になると、組み込みの PKIX サポートを使用して、証明書パスを構築および検証できます。
/* Givens. */
InputStream trustStoreInput = ...
char[] password = ...
List<X509Certificate> chain = ...
Collection<X509CRL> crls = ...
/* Construct a valid path. */
KeyStore anchors = KeyStore.getInstance(KeyStore.getDefaultType());
anchors.load(trustStoreInput, password);
X509CertSelector target = new X509CertSelector();
target.setCertificate(chain.get(0));
PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, target);
CertStoreParameters intermediates = new CollectionCertStoreParameters(chain)
params.addCertStore(CertStore.getInstance("Collection", intermediates));
CertStoreParameters revoked = new CollectionCertStoreParameters(crls);
params.addCertStore(CertStore.getInstance("Collection", revoked));
CertPathBuilder builder = CertPathBuilder.getInstance("PKIX");
/*
* If build() returns successfully, the certificate is valid. More details
* about the valid path can be obtained through the PKIXBuilderResult.
* If no valid path can be found, a CertPathBuilderException is thrown.
*/
PKIXBuilderResult r = (PKIXBuilderResult) builder.build(params);
注意すべき重要なことは、パスが見つからない場合、その理由について多くの情報が得られないということです。これはイライラするかもしれませんが、設計上そうなっています。一般に、多くの潜在的なパスがあります。それらがすべて異なる理由で失敗した場合、パス ビルダーはどのように理由として報告するかを決定しますか?