2016-07-03 1 views
1

J'essaie de comprendre un morceau de code qui ne remplace pas HostnameVerifier et SSLSocketFactory pour HttpsURLConnection. Le code actuel est capable de faire la demande SSL, ce qui est un peu déroutant pour moi. Comment fonctionne l'implémentation par défaut des classes HostnameVerifier et SSLSocketFactory? Vérifie-t-il le certificat CA et le nom d'hôte ou contourne-t-il tous ces contrôles ensemble?Comportement de HttpsURLConnectioin avec l'implémentation par défaut de HostnameVerifier et SSLSocketFactory

De même, existe-t-il un comportement spécial si la requête contient localhost? L'URL ressemble à ceci
https://localhost:/

Merci pour votre aide.

Répondre

2

Il vérifie le certificat CA par rapport aux certificats CA approuvés dans le magasin sécurisé du JDK jre/lib/security/cacerts ou de tout ce que vous avez configuré.

Il vérifie également que tous les certificats de la chaîne sont approuvés, et pas seulement le signataire immédiat. Par défaut, il ne vérifie pas les certificats révoqués en ligne, mais vous pouvez l'activer dans le fichier de règles java.security.

Il vérifie également le nom d'hôte par rapport au certificat. Il prend en charge des CN supplémentaires et des CN génériques.

question complémentaire concernant localhost:

localhost est juste un nom d'hôte comme un autre. Il doit être listé dans le certificat. Mais vous ne trouverez pas de CA officiel pour vous donner ce certificat, je suppose :-)

Si vous voulez jouer avec votre vrai cert sur localhost, vous l'adressez avec un nom d'hôte différent. Si vous voulez exécuter par un cert pour foo.bar.com, ajoutez à votre fichier hosts (Win: %WINDOWS%\system32\drivers\etc\hosts, Unix /etc/hosts) la ligne:

127.0.0.1 foo.bar.com 

feu Maintenant votre navigateur et connectez-vous https://foo.bar.com. Il se connectera à votre serveur local et affichera une requête HTTP cryptée SSL. Cette requête contient le nom d'hôte de l'URL, pas le vrai nom d'hôte. J'ai été oversimplyfying: Le navigateur reçoit le certificat SSL du serveur et compare le CN contre le nom d'hôte qu'il vient d'appeler. Si cela correspond, il vérifiera si le certificat peut être approuvé (ne me claquez pas sur la commande, peut-être qu'il vérifiera d'abord le niveau de confiance).

Voici où vous échouez: Le certificat fourni par le serveur ne contient pas l'hôte local CN, et ainsi, le client annulera la connexion. Dans votre cas, le client est la demande HttpSSL. Pour que le client pense que tout va bien, vous pouvez faire deux choses: - simuler le nom d'hôte et ajouter l'autorité de certification dans le fichier de clés certifiées cacerts. - implémenter un nom d'hôte et un validateur de certificat, qui vous permet de passer à travers. En ce qui concerne le tutoriel, un certificat auto-signé est utilisé, vous devrez convaincre le navigateur de l'accepter en remplaçant l'avertissement lors du premier accès.

+0

Quelle est la configuration que je devrais rechercher? Je ne suis pas sûr où le magasin de confiance par défaut est défini pour JDK. – user1549994

+0

"Il prend en charge des CN supplémentaires et des CN génériques.".que voulez-vous dire par CNs wildcard. Localhost est-il considéré comme un caractère générique CN? La requête en cours d'envoi utilise l'hôte local mais le certificat renvoyé par le serveur ne contient pas "localhost". – user1549994

+0

Un CERT générique contient un astérisque et fonctionne pour tous les sous-domaines de ce domaine: '* .foo.com' fonctionne pour' bar.foo.com', 'baz.foo.com' etc. Si vous voulez jouer avec localhost, ajoutez-le au certificat. Vois ma réponse. – thst