web-dev-qa-db-fra.com

javax.net.ssl.SSLPeerUnverifiedException: nom d'hôte non vérifié:

J'essaie d'utiliser la connexion HTTPS avec un certificat auto-signé.
J'ai suivi les étapes de création d'un certificat auto-signé comme mentionné ici - Création d'un certificat auto-signé .
Tout fonctionne bien même dans le navigateur, cela ne me montre qu'un message indiquant que mon certificat est signé par une autorité de certification inconnue.
Mais j'ai un problème avec mon nom FQDN (le nom du serveur ne correspond pas) dans le certificat parce que j'ai défini un nom incorrect lors de la génération du certificat.
Je l'ai régénéré et maintenant aucune erreur de ce type.

Je dois utiliser mon serveur sertificate depuis un mobile Android Client, j'ai trouvé un excellent article sur ce problème - tiliser Retrofit avec un certificat SSL auto-signé ou inconnu dans Android J'ai suivi toutes les étapes, mais j'ai malheureusement une erreur (exception).

javax.net.ssl.SSLPeerUnverifiedException: Hostname 195.xx.xx.xx not verified:
    certificate: sha1/qvH7lFeijE/ZXxNHI0B/M+AU/aA=
    DN: 1.2.840.113549.1.9.1=#160e63726f73704078616b65702e7275,CN=195.xx.xx.xx,OU=Departament of Development,O=CROSP Solutions,L=Chernihiv,ST=Chernihiv,C=UA
    subjectAltNames: []
            at com.squareup.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.Java:124)

Comme vous pouvez le voir, le nom d'hôte est le même, mais l'erreur est toujours présente.
S'il vous plaît, aidez à résoudre ce problème, je serai reconnaissant pour toute aide.
Je vous remercie.

SOLUTION PSEUDO

Bien sûr, j'ai recherché avant et trouvé HostName Verifier Solution .
Je l'ai essayé, ça marche. Mais est-il correct d'utiliser cette solution de contournement, j'ai ajouté un certificat dans mon application afin de le lire dynamiquement comme dans l'exemple précédent, est-il toujours utilisé dans ce cas.

La solution avec OkHttp est une ligne. (Si vous avez suivi toutes les étapes du didacticiel).

 okHttpClient.setHostnameVerifier(new NullHostNameVerifier());

Mais je sens toujours que ce n'est pas la meilleure solution, s'il vous plaît des pensées?

16
CROSP

Fait intéressant, si l'hôte de demande est une adresse IP, "CN" n'est pas utilisé pour la faire correspondre; au lieu,

http://tools.ietf.org/html/rfc2818#section-3.1

l'iPAddress subjectAltName doit être présent dans le certificat et doit correspondre exactement à l'IP dans l'URI "

Si vous utilisez le keytool de Java, cela peut être fait par

keytool -genkeypair  -ext SAN=IP:195.xx.xx.xx    ........

NullHostNameVerifier est également correct pour votre cas d'utilisation. Votre client fait confiance à un seul certificat; tant que la connexion utilise ce certificat, vous êtes sécurisé; Le nom d'hôte n'a pas d'importance ici.

19
ZhongYu

Les certificats auto-signés sont idéalement réservés au développement. Vous ne pouvez pas le mettre en ligne, car vous savez qu'il n'est pas vérifié, les applications et les navigateurs ne vous feront pas confiance sans l'approbation de l'autorité de certification.

Donc, ce n'est pas une "solution" pour votre application en direct, mais seulement pour tester si cela fonctionne (et fonctionnera avec un certificat valide, si et quand vous en obtenez un). Parce que vous autorisez tous les noms d'hôtes (ou au moins, les noms d'hôtes codés en dur si vous les limitez à quelques-uns) et les deux sont mauvais.

Envisagez-vous d'avoir à utiliser également un certificat auto-signé dans votre application en direct?

2
Praba