javax.net.le protocole ssl.SSLHandshakeException: Reçu alerte fatale: unknown_ca
J'ai pour vous connecter à un serveur via le protocole SSL double authentification. J'ai ajouté ma propre clé privée de plus de certificat à un de magasin de clés.jks et le certificat d'auto-signature de du serveur à un truststore.jks, les deux fichiers sont copiés dans le répertoire /usr/share/tomcat7. La prise en usine utilisée par mon code est fourni par le texte suivant fournisseur de:
@Singleton
public static class SecureSSLSocketFactoryProvider implements Provider<SSLSocketFactory> {
private SSLSocketFactory sslSocketFactory;
public SecureSSLSocketFactoryProvider() throws RuntimeException {
try {
final KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
final InputStream trustStoreFile = new FileInputStream("/usr/share/tomcat7/truststore.jks");
trustStore.load(trustStoreFile, "changeit".toCharArray());
final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
final KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
final InputStream keyStoreFile = new FileInputStream("/usr/share/tomcat7/keystore.jks");
keyStore.load(keyStoreFile, "changeit".toCharArray());
final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, "changeit".toCharArray());
final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
this.sslSocketFactory = sslContext.getSocketFactory();
} catch (final KeyStoreException e) {
Log.error("Key store exception: {}", e.getMessage(), e);
} catch (final CertificateException e) {
Log.error("Certificate exception: {}", e.getMessage(), e);
} catch (final UnrecoverableKeyException e) {
Log.error("Unrecoverable key exception: {}", e.getMessage(), e);
} catch (final NoSuchAlgorithmException e) {
Log.error("No such algorithm exception: {}", e.getMessage(), e);
} catch (final KeyManagementException e) {
Log.error("Key management exception: {}", e.getMessage(), e);
} catch (final IOException e) {
Log.error("IO exception: {}", e.getMessage(), e);
}
}
@Override
public SSLSocketFactory get() {
return sslSocketFactory;
}
}
Quand j'essaie de me connecter à un point de terminaison sur le serveur j'ai le exception cependant:
javax.net.ssl.SSLHandshakeException: Received fatal alert: unknown_ca
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[na:1.7.0_45]
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) ~[na:1.7.0_45]
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1959) ~[na:1.7.0_45]
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077) ~[na:1.7.0_45]
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) ~[na:1.7.0_45]
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) ~[na:1.7.0_45]
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) ~[na:1.7.0_45]
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) ~[na:1.7.0_45]
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) ~[na:1.7.0_45]
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153) ~[na:1.7.0_45]
Une idée de ce que j'ai raté ici?
Avez-vous résoudre ce problème ? Comment avez-vous fait le serveur de confiance en vous , même si elle est auto-signé. ...?
Je suis également se demander ce que le tangible solution à ce problème (xkcd.com/979).
J'ai été en mesure de le résoudre en ajoutant
Je suis également se demander ce que le tangible solution à ce problème (xkcd.com/979).
J'ai été en mesure de le résoudre en ajoutant
useSSL=false
à la chaîne de connexion
OriginalL'auteur Stine | 2015-03-10
Vous devez vous connecter pour publier un commentaire.
Si vous recevez une alerte
unknown_ca
depuis le serveur, le serveur n'a pas comme le certificat que vous avez envoyer le certificat du client, car il n'est pas signé par une autorité de certification qui est approuvé par le serveur de certificats client.Ullrich si le serveur il ne pas aimer ce certificat auto-signé, comment en faire une autorité de certification de confiance ?
Cela peut également se produire si le certificat du client a expiré et que le serveur (correctement!) vérifie la validité du certificat client.
OriginalL'auteur Steffen Ullrich