vean solucionar que posible plugin observas mixto los las imagenes detectar corregir content contenido como atacantes ssl https go

ssl - solucionar - golang: ¿Cómo hacer una solicitud https con un certificado incorrecto?



plugin contenido mixto wordpress (4)

Digamos que quiero obtener https://golang.org programáticamente. Actualmente golang.org (ssl) tiene un certificado incorrecto que se expide a *.appspot.com Entonces, cuando ejecuto esto:

package main import ( "log" "net/http" ) func main() { _, err := http.Get("https://golang.org/") if err != nil { log.Fatal(err) } }

Me sale (como esperaba)

Get https://golang.org/: certificate is valid for *.appspot.com, *.*.appspot.com, appspot.com, not golang.org

Ahora, quiero confiar en este certificado (imagine un certificado autoemitido donde pueda validar la huella digital, etc.): ¿cómo puedo hacer una solicitud y validar / confiar en el certificado?

Probablemente necesito usar openssl para descargar el certificado, cargarlo en mi archivo y llenar tls.Config struct!


¡Todas estas respuestas son incorrectas! No use InsecureSkipVerify para tratar con un CN que no coincida con el nombre de host. Los desarrolladores de Go decidieron imprudentemente no deshabilitar las comprobaciones de nombres de host (que tienen usos legítimos: túneles, nats, certs de clústeres compartidos, etc.), mientras que también tienen algo que se ve similar pero que ignoran por completo la verificación de certificados. Debe saber que el certificado es válido y está firmado por un certificado en el que confía. Pero en escenarios comunes, usted sabe que el CN ​​no coincidirá con el nombre de host con el que se conectó. Para ellos, establezca ServerName en tls.Config . Si tls.Config.ServerName == remoteServerCN, la verificación del certificado tendrá éxito. Esto es lo que quieres. InsecureSkipVerify significa que NO hay autenticación; y está maduro para un hombre en el medio; derrotando el propósito de usar TLS.

Hay un uso legítimo para InsecureSkipVerify : InsecureSkipVerify para conectarse a un host y obtener su certificado, luego desconectarlo inmediatamente. Si configura su código para usar InsecureSkipVerify , generalmente se debe a que no configuró ServerName correctamente (tendrá que provenir de un env var o algo así - no se angustie por este requisito ... hágalo correctamente).

En particular, si usa certificados de cliente y confía en ellos para la autenticación, básicamente tiene un inicio de sesión falso que en realidad ya no inicia sesión. ¡Rehusa el código que hace InsecureSkipVerify , o aprenderás lo que está mal con él de la manera difícil!


Esta es una forma de hacerlo sin perder la configuración predeterminada de DefaultTransport , y sin necesitar la solicitud falsa según el comentario del usuario.

defaultTransport := http.DefaultTransport.(*http.Transport) // Create new Transport that ignores self-signed SSL httpClientWithSelfSignedTLS := &http.Transport{ Proxy: defaultTransport.Proxy, DialContext: defaultTransport.DialContext, MaxIdleConns: defaultTransport.MaxIdleConns, IdleConnTimeout: defaultTransport.IdleConnTimeout, ExpectContinueTimeout: defaultTransport.ExpectContinueTimeout, TLSHandshakeTimeout: defaultTransport.TLSHandshakeTimeout, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, }


Si desea usar la configuración predeterminada del paquete http, para que no necesite crear un nuevo objeto Transporte y Cliente, puede cambiar para ignorar la verificación del certificado de esta manera:

tr := http.DefaultTransport.(*http.Transport) tr.TLSClientConfig.InsecureSkipVerify = true


Nota de seguridad: la desactivación de las comprobaciones de seguridad es peligrosa y debe evitarse

Puede deshabilitar las comprobaciones de seguridad globalmente para todas las solicitudes del cliente predeterminado:

package main import ( "fmt" "net/http" "crypto/tls" ) func main() { http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true} _, err := http.Get("https://golang.org/") if err != nil { fmt.Println(err) } }

Puede deshabilitar la comprobación de seguridad para un cliente:

package main import ( "fmt" "net/http" "crypto/tls" ) func main() { tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{Transport: tr} _, err := client.Get("https://golang.org/") if err != nil { fmt.Println(err) } }