Alerte fatale: bad_certificate
J'essaye de configurer une connexion SSL connexion (et je suis effectuez la procédure suivante sur le client)
- - Je générer un Certificte Demande de Signature pour obtenir un signé le certificat du client
- Maintenant, j'ai une clé privée (utilisé lors de la RSE), a signé le certificat du client et le certificat racine (obtenu hors bande).
- - Je ajouter de la clé privée et signé le certificat du client pour un cert de la chaîne et l'ajouter au gestionnaire de clés. et la racine cert pour la confiance manager.
Mais j'ai mal d'erreur de certificat.
Je suis assez sûr que je suis en utilisant le droit certs. Dois-je ajouter de la signature du client cert à la fiducie, le gestionnaire? Essayé, pas de chance encore.
//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);
Est-il une sorte de chaîne de certificat que j'ai besoin de créer ici?
J'ai eu un p12 avec ces composants et à l'utilisation d'assez semblable code, l'ajout de la clé privée à l'keymanager et la racine cert de p12 pour la fiducie, le gestionnaire j'ai pu le faire fonctionner. Mais maintenant j'ai besoin pour le faire fonctionner sans le p12.
EDIT: trace de la Pile a été demandé. Espérons que cela devrait suffire. (NOTE: j'ai masqué les noms de fichiers)
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
source d'informationauteur highflyer
Vous devez vous connecter pour publier un commentaire.
Vous devez ajouter la racine cert pour le fichier de clés.
À condition que le certificat de serveur est signé et valide, vous devez seulement ouvrir la connexion, comme d'habitude:
Notez que l'URL a la HTTPS schéma pour indiquer l'utilisation de SSL.
Si le certificat du serveur est signé, mais vous accédez à l'aide d'une autre adresse IP/nom de domaine que celui dans le certificat, vous pouvez ignorer le nom d'hôte de vérification:
Si le certificat n'est pas signé, alors vous devez ajouter au fichier de clés utilisé par la JVM (commandes utiles).
J'ai eu cette erreur quand j'ai enlevé ces 2 lignes. Si vous savez que votre fichier de clés a le droit certs, assurez-vous que votre code est le bon fichier de clés.
J'ai aussi besoin de cette VM argument:
-Djavax.net.ssl.trustStore=/app/certs/keystore.jk
Voir ici pour plus de détails:
https://stackoverflow.com/a/34311797/1308453