bouncycastle wikiページ X.509ルート証明書と認証要求の作成方法は理解できましたが、その後の概念とプログラミングの進め方はよくわかりません。
パーティAが証明書要求を行い、CAからクライアント証明書を取得するとします。一部のパーティBはAの証明書をどのように検証できますか? Aにはどのような証明書が必要ですか?ルート証明書? 「通常の」クライアント証明書?
また、Aが証明書をDERまたはPEM形式でBに正常に送信したと仮定した場合、検証はプログラミングレベルでどのように機能しますか?
どんな助けでも大歓迎です。
よろしく、ロブ
プログラマーの観点からは、X.509証明書を検証するためにいくつかのことが必要です。
これらの入力を使用できる場合は、 組み込みの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);
注意すべき重要なことは、パスが見つからない場合、その理由について多くの情報が得られないということです。これはイライラする可能性がありますが、設計上はそうです。一般に、多くの潜在的なパスがあります。それらがすべて異なる理由で失敗した場合、パスビルダーはどのように理由として何を報告するかを決定しますか?
わかりました。CAの背後にある考え方は次のとおりです。
プログラムレベルでは、X.509証明書を読み取り、CAが誰であるかを判断することにより、これを実装します。そのCAのフィンガープリントを指定すると、データベースでそれを見つけて署名を確認します。それが一致する場合、あなたはあなたの信頼の連鎖を持っています。
これが機能するのは、私が言ったように、CAだけがデジタル署名を作成でき、誰でもそれを検証できるからです。これは、暗号化の概念の正反対です。署名したいデータを「秘密鍵で暗号化」し、「公開鍵で復号化」が取得したデータと等しいことを確認します。