Disons que je veux être https://golang.org
programmé. Actuellement, golang.org (ssl) a un mauvais certificat qui est émis à *.appspot.com
So quand je lance ceci:
package main
import (
"log"
"net/http"
)
func main() {
_, err := http.Get("https://golang.org/")
if err != nil {
log.Fatal(err)
}
}
Je reçois (comme je m'y attendais)
Get https://golang.org/: certificate is valid for *.appspot.com, *.*.appspot.com, appspot.com, not golang.org
Maintenant, je veux faire confiance à ce certificat moi-même (imaginez un certificat auto-émis où je peux valider une empreinte digitale, etc.): comment puis-je faire une demande et valider / faire confiance au certificat?
J'ai probablement besoin d'utiliser openssl pour télécharger le certificat, le charger dans mon fichier et remplir tls.Config
struct!?
Réponses:
Note de sécurité: la désactivation des contrôles de sécurité est dangereuse et doit être évitée
Vous pouvez désactiver globalement les contrôles de sécurité pour toutes les demandes du client par défaut:
Vous pouvez désactiver le contrôle de sécurité pour un client:
la source
InsecureSkipVerify: true
. Est-ce possible?NameToCertificate
pourrait vous aider, consultez latls.Config
documentation: golang.org/pkg/crypto/tls/#ConfigDialer.Timeout
.Voici un moyen de le faire sans perdre les paramètres par défaut du
DefaultTransport
, et sans avoir besoin de la fausse demande selon le commentaire de l'utilisateur.METTRE À JOUR
Chemin plus court:
Bonne manière (à partir de Go 1.13) (fournie par la réponse ci-dessous ):
avertissement : à des fins de test / développement uniquement. Sinon, procédez à vos risques et périls !!!
la source
mytransportsettings := &(*http.DefaultTransport.(*http.Transport))
, puis de modifier simplement la configuration du client TLSmytransportsettings.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
?Toutes ces réponses sont fausses! Ne pas utiliser
InsecureSkipVerify
pour traiter un CN qui ne correspond pas au nom d'hôte. Les développeurs de Go ont été imprudemment catégoriques sur le fait de ne pas désactiver les vérifications de nom d'hôte (qui ont des utilisations légitimes - tunnels, nats, certificats de cluster partagés, etc.), tout en ayant quelque chose qui semble similaire mais qui ignore complètement la vérification des certificats. Vous devez savoir que le certificat est valide et signé par un certificat de confiance. Mais dans les scénarios courants, vous savez que le CN ne correspondra pas au nom d'hôte avec lequel vous vous êtes connecté. Pour ceux -ci , misServerName
surtls.Config
. Sitls.Config.ServerName
== remoteServerCN, la vérification du certificat réussira. Voici ce que tu veux.InsecureSkipVerify
signifie qu'il n'y a PAS d'authentification; et c'est mûr pour un homme du milieu; vaincre l'objectif de l'utilisation de TLS.Il y a une utilisation légitime pour
InsecureSkipVerify
: l'utiliser pour se connecter à un hôte et récupérer son certificat, puis se déconnecter immédiatement. Si vous configurez votre code à utiliserInsecureSkipVerify
, c'est généralement parce que vous ne l'avez pas définiServerName
correctement (il devra provenir d'une variable d'environnement ou quelque chose - ne vous inquiétez pas de cette exigence ... faites-le correctement).En particulier, si vous utilisez des certificats clients et que vous comptez sur eux pour l'authentification, vous avez essentiellement une fausse connexion qui ne se connecte plus. Refusez le code qui le fait
InsecureSkipVerify
, ou vous apprendrez ce qui ne va pas à la dure!la source
La bonne façon de procéder si vous souhaitez conserver les paramètres de transport par défaut est maintenant (à partir de Go 1.13):
Transport.Clone fait une copie complète du transport. De cette façon, vous n'avez pas à vous soucier de manquer de nouveaux champs ajoutés à la
Transport
structure au fil du temps.la source
Si vous souhaitez utiliser les paramètres par défaut du package http, vous n'avez donc pas besoin de créer un nouvel objet Transport et client, vous pouvez modifier pour ignorer la vérification du certificat comme ceci:
la source
panic: runtime error: invalid memory address or nil pointer dereference
En général, le domaine DNS de l'URL DOIT correspondre au sujet du certificat du certificat.
Autrefois, cela pouvait être soit en définissant le domaine comme cn du certificat, soit en définissant le domaine comme un autre nom de sujet.
La prise en charge de cn a été abandonnée pendant longtemps (depuis 2000 dans la RFC 2818 ) et le navigateur Chrome ne regardera même plus le cn.Aujourd'hui, vous devez avoir le domaine DNS de l'URL comme autre nom de sujet.
RFC 6125 qui interdit de vérifier le cn si SAN pour DNS Domain est présent, mais pas si SAN pour IP Address est présent. La RFC 6125 répète également que cn est obsolète, ce qui était déjà dit dans la RFC 2818. Et la présence du forum du navigateur de l'autorité de certification qui, en combinaison avec la RFC 6125, signifie essentiellement que cn ne sera jamais vérifié pour le nom de domaine DNS.
la source