Comment faire une demande https avec certificat incorrect?
Dire que je veux obtenir https://golang.org
par programmation. Actuellement golang.org (ssl) a un mauvais certificat qui est délivré à *.appspot.com
Donc, 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 obtenir (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 de moi-même (imaginez un certificat auto-émis où je peux valider les empreintes digitales, etc.): comment puis-je faire une demande et de valider/confiance au certificat?
J'ai probablement besoin d'utiliser openssl pour télécharger le certificat, le charger dans mon fichier et de le remplir tls.Config
struct !?
- ce n'est pas un "mauvais" certificat " c'est un certificat avec un autre CN. InsecureSkipVerify n'est pas une utilisation légitime ici. Vous devez définir ServerName dans la tls.Config correspond à ce que vous essayez de vous connecter. Cette StackOverflow post est à l'origine de ce gros trou de sécurité dans le Go du code pour se répandre partout. InsecureSkipVerify ne pas vérifier le certificat du TOUT. Ce que vous voulez est de vérifier que le certificat a été valablement signés par une entité de confiance, même si le CN ne correspond pas au nom d'hôte. Les Tunnels et les NATS peut légitimement à l'origine de ce décalage.
Vous devez vous connecter pour publier un commentaire.
De sécurité remarque: la Désactivation des contrôles de sécurité est dangereuse et doit être évitée
Vous pouvez désactiver les contrôles de sécurité à l'échelle mondiale pour toutes les demandes du client par défaut:
Vous pouvez désactiver le contrôle de sécurité pour un client:
InsecureSkipVerify: true
. Est-ce possible?NameToCertificate
peut aider, voir latls.Config
de la documentation : golang.org/pkg/crypto/tls/#ConfigDialer.Timeout
.Voici un moyen de le faire sans perdre les paramètres par défaut de la
DefaultTransport
, et sans avoir besoin de la faux de la demande par l'utilisateur commentaire.Avertissement: Pour les tests et à des fins de développement uniquement. Autre chose, procéder à vos propres risques!!!
Toutes ces réponses sont fausses! Ne pas utiliser
InsecureSkipVerify
de traiter avec un CN qui ne correspond pas au nom d'hôte. L'Aller développeurs imprudemment ont insisté sur pas la désactivation de nom d'hôte de contrôle (qui a des utilisations légitimes - les tunnels, les nats, de cluster partagé certs, etc...), et aussi d'avoir quelque chose qui ressemble, mais en fait complètement ignore la vérification du certificat. Vous devez savoir que le certificat est valide et signé par un cert en qui vous avez confiance. Mais dans les scénarios courants, vous savez que le CN ne corresponde pas au nom d'hôte de vous connecter avec. Pour ceux qui, ensembleServerName
surtls.Config
. Sitls.Config.ServerName
== remoteServerCN, puis le certificat de vérification de réussir. C'est ce que vous voulez.InsecureSkipVerify
signifie qu'il n'y a PAS d'authentification; et il est mûr pour un Man-In-The-Middle; vaincre le but de l'utilisation de TLS.Il y a une utilisation légitime de
InsecureSkipVerify
: l'utiliser pour vous connecter à un hôte et de saisir son certificat, puis débranchez immédiatement. Si vous configurez votre code pour utiliserInsecureSkipVerify
, c'est généralement parce que vous n'avez pas défini deServerName
correctement (il ne peut venir que d'un env var ou quelque chose - ne pas le ventre sur cette exigence... de le faire correctement).En particulier, si vous utilisez des certificats clients et comptons sur eux pour l'authentification, vous avez essentiellement un faux login qui ne fait pas de connexion, pas plus. Refuser le code qui ne
InsecureSkipVerify
, ou vous apprendrez quel est le problème avec elle à la dure!Si vous souhaitez utiliser les paramètres par défaut à partir de l'adresse http paquet, de sorte que vous n'avez pas besoin de créer un nouveau Transport et Client de l'objet, vous pouvez modifier d'ignorer la vérification de certificat comme ceci:
panic: runtime error: invalid memory address or nil pointer dereference
Généralement, Le Domaine DNS de l'adresse URL DOIT correspondre à l'Objet du Certificat de le certificat.
En des temps anciens, cela pourrait être soit en définissant le domaine du cn du certificat ou par le fait d'avoir le domaine est défini comme un autre Nom de l'Objet.
Soutien pour le cn est déconseillée pour une longue période (depuis 2000 dans RFC 2818) et le navigateur Chrome ne sera même pas regarder le cn est plus tellement aujourd'hui, vous devez avoir la DNS du Domaine de l'URL comme un autre Nom de l'Objet.
RFC 6125 qui interdit à la vérification de la cn si SAN de Domaine DNS est présent, mais pas si SAN pour Adresse IP est présente. RFC 6125 répète également que le cn est obsolète qui a déjà été dit dans la RFC 2818. Et l'Autorité de Certification Navigateur Forum pour être présent qui, en combinaison avec la RFC 6125 signifie essentiellement que le cn ne sera jamais vérifiée pour le nom de Domaine DNS.