3

更新された X509 証明書を Chrome / Firefox (およびおそらく他のブラウザー) にインポートしようとすると、インポートしようとしている証明書が、同じ DN を持つ期限切れのユーザー証明書に保存されている同じ秘密鍵を使用していることを認識しません。これがすべての主要なブラウザーの証明書インポート ツールの実装に伴うバグかどうかはわかりませんが、次のような openssl ツールを使用して、秘密鍵のない PKCS12 ファイル内にユーザー証明書を保存することで、この問題を (ある程度) 回避できます。 .

openssl pkcs12 -export -in usercert.pem -nokeys -name "CN: Same Name" -out certonly.p12 (-nokeys はここでのトリックです)

これが機能する理由はわかりませんが、certonly.p12 を Chrome / Firefox にインポートすると、昨年の秘密鍵が添付されます。ただし、別の証明書エントリが作成されるため、古い証明書を手動で削除する必要があります。

したがって、ブラウザでユーザー証明書を更新するには、証明書を PKCS12 形式 (パスフレーズの有無にかかわらず) でパッケージ化する必要があると思います。

ここで、java.security.KeyStore または同様のライブラリを使用して、Java アプリケーションでこれを行う必要があります。実際には、ユーザーの更新された証明書を生成するのは Web アプリケーションであるためです。ブラウザーにインポートする前に、openssl コマンドを自分で使用して pkcs12 に変換するようユーザーに依頼したくありません。私のアプリケーションはこれを自動的に行い、PKCS12 ファイル内に含まれる更新された証明書を提供する必要があります。

私は多くの場所を見てきましたが、これまでJavaを使用してこれを行う方法の具体的な例を見つけることができません. 秘密鍵なしで発行された証明書 (または pkcs7) のみを使用してパスフレーズのない PKCS12 を出力する方法を知っている人はいますか?

次のようなことを試しましたが、うまくいきませんでした。

java.security.cert.Certificate[] chain  = CertificateManager.parsePKCS7(renewed_cert_in_pkcs7);
KeyStore p12 = KeyStore.getInstance("PKCS12");
p12.load(null, null);
p12.setKeyEntry("USER Cert 123", null, "".toCharArray(), chain); 
response.setContentType("application/x-pkcs12");
response.setHeader("Content-Disposition", "attachment; filename=user_certificate_only.p12");
p12.store(response.getOutputStream(), "".toCharArray());
4

0 に答える 0