web-dev-qa-db-ja.com

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

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

18
Remo

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

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

TrustManager AP​​Iをまったく使用せずに、Certification Path APIを使用するためのすべての呼び出しを行う独自のKeyStoreを実装することもできますが、コードの複雑さが増すだけで、 Java PKI Programmer's Guide を正しく理解しておく必要もあります。)

キーストアファイルが本当に必要ない場合は、メモリでKeyStore AP​​Iを使用して、証明書を直接ロードできます。

これらの線に沿って何かが動作するはずです(テストされていません):

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インスタンスに証明書をロードするかは、ユーザーが決定します。

37
Bruno