1. ホーム
  2. java

[解決済み] 致命的な警告を受け取りました: bad_certificate

2022-02-07 01:20:57

質問

SSLソケット接続を設定しようとしています(クライアント側で以下のようにしています)。

  1. Certificte Signing Requestを生成して、署名付きクライアント証明書を取得します。

  2. これで、秘密鍵(CSRで使用)、署名済みクライアント証明書、ルート証明書(帯域外で取得)が揃いました。

  3. 秘密鍵と署名済みクライアント証明書を証明書チェーンに追加し、それをキーマネージャに追加します。 また、ルート証明書をトラストマネージャに追加します。 しかし、不正な証明書エラーが発生しました。

正しい証明書を使用していることは間違いないのですが。署名されたクライアント証明書もトラストマネージャに追加する必要がありますか?それを試してみましたが、まだうまくいきません。

//I add the private key and the client cert to KeyStore ks
FileInputStream certificateStream = new FileInputStream(clientCertFile);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
java.security.cert.Certificate[] chain = {};
chain = certificateFactory.generateCertificates(certificateStream).toArray(chain);
certificateStream.close();
String privateKeyEntryPassword = "123";
ks.setEntry("abc", new KeyStore.PrivateKeyEntry(privateKey, chain),
        new KeyStore.PasswordProtection(privateKeyEntryPassword.toCharArray()));

//Add the root certificate to keystore jks
FileInputStream is = new FileInputStream(new File(filename));
CertificateFactory cf = CertificateFactory.getInstance("X.509");
java.security.cert.X509Certificate cert = (X509Certificate) cf.generateCertificate(is);
System.out.println("Certificate Information: ");
System.out.println(cert.getSubjectDN().toString());
jks.setCertificateEntry(cert.getSubjectDN().toString(), cert);

//Initialize the keymanager and trustmanager and add them to the SSL context
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "123".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(jks);

ここで作成する必要のある証明書チェーンのようなものはありますか?
私はこれらのコンポーネントを持つp12も持っていて、よく似たコードを使って、秘密鍵をキーマネージャに、p12のルート証明書をトラストマネージャに追加したら、動作させることができました。しかし、今、私はp12なしでそれを動作させる必要があります。

EDIT: スタックトレースを要求されました。これで十分だと思います。(注:ファイル名はマスクしてあります)

Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1720)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:954)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1149)
at client.abc2.openSocketConnection(abc2.java:33)
at client.abc1.runClient(abc1.java:63)
at screens.app.abc.validateLogin(abc.java:197)
... 32 more

解決方法は?

ルート証明書もキーストアに追加する必要があります。