CA証明書のみでキーストアなしでSSLContextを使用する 質問する

CA証明書のみでキーストアなしでSSLContextを使用する 質問する

Jersey クライアント アプリケーションで使用するために を設定する必要がありますjavax.net.ssl.SSLContext。必要なのは、カスタム ルート CA 証明書を受け入れるコンテキストだけです。キーストア ファイルを生成して CA 証明書をインポートする方法がないというのは本当でしょうか?

ベストアンサー1

キーストア ファイルを生成して CA 証明書をインポートする方法がないというのは本当ですか?

キーストア ファイルを使用せずにこれを行う方法はありますが、信頼する CA 証明書を何らかの方法でロードする必要があるため、何らかの方法でファイルまたはリソースをロードする必要があります。

(もちろん、TrustManagerCertification Path APIをまったく使用せずに、すべての呼び出しをCertification Path KeyStoreAPIを使用する独自の実装を行うこともできますが、コードの複雑さが増すだけで、軽減されることはありません。Java PKI プログラマーズ ガイドこれを正しく行うには、

キーストア ファイルが本当に必要ない場合は、KeyStoreメモリ内の API を使用して証明書を直接読み込むことができます。

次のようなものが機能するはずです (テストされていません):

InputStream is = new FileInputStream("cacert.crt");
// You could get a resource as a stream instead.

CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate caCert = (X509Certificate)cf.generateCertificate(is);

TrustManagerFactory tmf = TrustManagerFactory
    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null); // You don't need the KeyStore instance to come from a file.
ks.setCertificateEntry("caCert", caCert);

tmf.init(ks);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);

(すべてを閉じて例外を処理することを忘れないでください。)

この方法で証明書をロードする方が便利なのか、KeyStoreキーストア ファイルから同様のインスタンスに証明書をロードする方が便利なのかは、ユーザーが決めることになります。

おすすめ記事