Digamos que eu queira ser https://golang.org
programaticamente. Atualmente, o golang.org (ssl) possui um certificado inválido emitido para o *.appspot.com
So quando executo isso:
package main
import (
"log"
"net/http"
)
func main() {
_, err := http.Get("https://golang.org/")
if err != nil {
log.Fatal(err)
}
}
Eu recebo (como eu esperava)
Get https://golang.org/: certificate is valid for *.appspot.com, *.*.appspot.com, appspot.com, not golang.org
Agora, eu mesmo quero confiar neste certificado (imagine um certificado auto-emitido onde eu possa validar impressões digitais etc.): como posso fazer uma solicitação e validar / confiar no certificado?
Eu provavelmente preciso usar o openssl para baixar o certificado, carregá-lo no meu arquivo e preencher tls.Config
struct!?
Respostas:
Nota de segurança: Desabilitar as verificações de segurança é perigoso e deve ser evitado
Você pode desativar as verificações de segurança globalmente para todas as solicitações do cliente padrão:
Você pode desativar a verificação de segurança para um cliente:
fonte
InsecureSkipVerify: true
. Isso é possível?NameToCertificate
pode ajudar, ver atls.Config
documentação: golang.org/pkg/crypto/tls/#ConfigDialer.Timeout
.Aqui está uma maneira de fazê-lo sem perder as configurações padrão do
DefaultTransport
e sem precisar da solicitação falsa conforme o comentário do usuário.ATUALIZAR
Maneira mais curta:
Maneira correta (a partir do Go 1.13) (fornecida pela resposta abaixo ):
Aviso : Apenas para fins de teste / desenvolvimento. Qualquer outra coisa, proceda por sua conta e risco !!!
fonte
mytransportsettings := &(*http.DefaultTransport.(*http.Transport))
e apenas modificar a configuração do cliente TLSmytransportsettings.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
?Todas essas respostas estão erradas! Não use
InsecureSkipVerify
para lidar com uma CN que não corresponda ao nome do host. Os desenvolvedores do Go imprudentemente foram inflexíveis quanto a não desativar as verificações de nome de host (que têm usos legítimos - túneis, nats, certificados de cluster compartilhado etc.), além de terem algo parecido, mas na verdade ignoram completamente a verificação de certificado. Você precisa saber que o certificado é válido e assinado por um certificado confiável. Mas em cenários comuns, você sabe que o CN não corresponderá ao nome do host ao qual você se conectou. Para aqueles, definidoServerName
notls.Config
. Setls.Config.ServerName
== remoteServerCN, a verificação do certificado será bem-sucedida. Isso é o que você quer.InsecureSkipVerify
significa que não há autenticação; e está maduro para um homem-no-meio; derrotando o propósito de usar TLS.Há um uso legítimo para
InsecureSkipVerify
: use-o para conectar-se a um host e obter seu certificado e, em seguida, desconecte-o imediatamente. Se você configurou seu código para usoInsecureSkipVerify
, geralmente é porque você não o definiuServerName
corretamente (ele precisará vir de um env var ou algo assim - não fique com dor de barriga com esse requisito ... faça-o corretamente).Em particular, se você usa certificados de clientes e confia neles para autenticação, basicamente possui um login falso que na verdade não entra mais. Recuse o código que sim
InsecureSkipVerify
, ou você aprenderá o que há de errado com ele da maneira mais difícil!fonte
A maneira correta de fazer isso se você deseja manter as configurações de transporte padrão é agora (a partir do Go 1.13):
Transport.Clone faz uma cópia profunda do transporte. Dessa forma, você não precisa se preocupar em perder nenhum novo campo que seja adicionado à
Transport
estrutura ao longo do tempo.fonte
Se você deseja usar as configurações padrão do pacote http, para não precisar criar um novo objeto de Transporte e Cliente, pode alterar para ignorar a verificação do certificado da seguinte maneira:
fonte
panic: runtime error: invalid memory address or nil pointer dereference
Geralmente, o domínio DNS da URL DEVE corresponder ao Assunto do certificado do certificado.
Antigamente, isso poderia ser definido pelo domínio como cn do certificado ou tendo o domínio definido como um Nome alternativo do assunto.
O suporte ao cn foi descontinuado por um longo tempo (desde 2000, na RFC 2818 ) e o navegador Chrome nem olha mais para o cn, então hoje você precisa ter o domínio DNS do URL como um nome alternativo do assunto.
RFC 6125, que proíbe a verificação do cn se o SAN for DNS Domain estiver presente, mas não se o SAN for IP Address estiver presente. O RFC 6125 também repete que o cn está obsoleto, o que já foi mencionado na RFC 2818. E o Fórum do Navegador da Autoridade de Certificação, que, combinado com o RFC 6125, significa essencialmente que o cn nunca será verificado quanto ao nome de domínio DNS.
fonte