OkHttp javax.net.ssl.SSLPeerUnverifiedException: nom d'hôte domain.com non vérifié
J'ai essayé pendant des jours pour obtenir ce travail. J'essaie de me connecter à mon serveur sur https avec un certificat auto-signé. Je ne pense pas qu'il y est une quelconque des pages ou des exemples que je n'ai pas lu à ce jour.
Ce que j'ai fait:
- Créé bks fichier de clés en suivant ce tutoriel: http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html
Il utilise openssl s_client -connect domain.com:443
pour obtenir le certificat du serveur. Puis crée un bks fichier de clés à l'aide de château gonflable.
-
De lecture créé fichier de clés à partir des matières premières dossier de l'ajouter à sslfactory et puis à OkHttpClient. Comme ceci:
public ApiService() { mClient = new OkHttpClient(); mClient.setConnectTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS); mClient.setReadTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS); mClient.setCache(getCache()); mClient.setCertificatePinner(getPinnedCerts()); mClient.setSslSocketFactory(getSSL()); } protected SSLSocketFactory getSSL() { try { KeyStore trusted = KeyStore.getInstance("BKS"); InputStream in = Beadict.getAppContext().getResources().openRawResource(R.raw.mytruststore); trusted.load(in, "pwd".toCharArray()); SSLContext sslContext = SSLContext.getInstance("TLS"); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trusted); sslContext.init(null, trustManagerFactory.getTrustManagers(), null); return sslContext.getSocketFactory(); } catch(Exception e) { e.printStackTrace(); } return null; } public CertificatePinner getPinnedCerts() { return new CertificatePinner.Builder() .add("domain.com", "sha1/theSha=") .build(); }
-
Cela pour une raison quelconque, cela génère toujours un
SSLPeerUnverifiedException
avec ou sans le fichier de clés. Et avec ou sans laCertificatePinner
.javax.net.ssl.SSLPeerUnverifiedException: Hostname domain.com not verified: 0 W/System.err﹕ certificate: sha1/theSha= W/System.err﹕ DN: 1.2.840.113549.1.9.1=#1610696e666f40626561646963742e636f6d,CN=http://domain.com,OU=development,O=domain,L=Valencia,ST=Valencia,C=ES W/System.err﹕ subjectAltNames: [] W/System.err﹕ at com.squareup.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.java:124) W/System.err﹕ at com.squareup.okhttp.Connection.connect(Connection.java:143) W/System.err﹕ at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:185) W/System.err﹕ at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128) W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:341) W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330) W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248) W/System.err﹕ at com.squareup.okhttp.Call.getResponse(Call.java:273) W/System.err﹕ at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:230) W/System.err﹕ at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:201) W/System.err﹕ at com.squareup.okhttp.Call.execute(Call.java:81) ...
Ce que je fais mal?
source d'informationauteur just_user
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème, cependant j'ai besoin de ma demande de travailler sur plusieurs environnements intermédiaires, qui avaient tous une auto-signé certs. Pour aggraver les choses, ils pourraient modifier ces certificats à la volée.
Pour résoudre ce problème, lors de la connexion à la mise en scène seulement, j'ai ajouté un SSLSocketFactory de confiance qui tous les certs. Cette correction de l'erreur java, mais il m'a laissé avec les okhttp exception dans ce billet.
Pour éviter cette erreur, j'ai besoin d'ajouter un plus de personnalisation à mon okHttpClient. Cette correction de l'erreur pour moi.
J'ai finalement obtenu ce travail avec un mélange de réponses multiples.
Tout d'abord, les certificats a été faite à tort, vous ne savez pas comment. Mais en les créant à l'aide du script dans cette réponse fait leur travail. Ce qui était nécessaire était un serveur de certificat et une clé. Ensuite, le client avait besoin d'un autre certificat.
Pour utiliser le certificat android, et j'ai converti le .fichier pem à un .crt fichier comme ceci:
Android, et j'ai ajouté le certificat de mon OkHttp client comme suit:
La dernière partie avec
new AdditionalKeyStore()
est pris de très bien réponse écrite. Ce qui ajoute un fichier de clés de secours.J'espère que cela peut aider quelqu'un d'autre! C'est le moyen le plus simple pour obtenir HTTPS travailler avec un certificat auto-signé que j'ai trouvé. D'autres moyens comprennent un BouncyCastle keystore qui semble excessif pour moi.
Ce problème est résolu par la mise en
setHostNameVerifier
àokHttpBuilder
. Assurez-vous de vérifier la méthode doit retourner true.Exemple:
Veuillez vérifier si le CN nom du client sur le cert est ajouté à l'autre nom de l'Objet. J'ai eu le même problème