gogetssl - Golang-TLS con certificado autofirmado
free ssl certificate (4)
Debe utilizar el indicador InsecureSkipVerify, consulte https://groups.google.com/forum/#!topic/golang-nuts/c9zEiH6ixyw .
El código relacionado de esta publicación (en caso de que la página esté fuera de línea):
smtpbox := "mail.foo.com:25"
c, err := smtp.Dial(smtpbox)
host, _, _ := net.SplitHostPort(smtpbox)
tlc := &tls.Config{
InsecureSkipVerify: true,
ServerName: host,
}
if err = c.StartTLS(tlc); err != nil {
fmt.Printf(err)
os.Exit(1)
}
// carry on with rest of smtp transaction
// c.Auth, c.Mail, c.Rcpt, c.Data, etc
Estoy tratando de establecer una conexión TLS con el uso de un certificado de servidor autofirmado.
Genere el certificado con este código de ejemplo: http://golang.org/src/pkg/crypto/tls/generate_cert.go
Mi código de cliente relevante se ve así:
// server cert is self signed -> server_cert == ca_cert
CA_Pool := x509.NewCertPool()
severCert, err := ioutil.ReadFile("./cert.pem")
if err != nil {
log.Fatal("Could not load server certificate!")
}
CA_Pool.AppendCertsFromPEM(severCert)
config := tls.Config{RootCAs: CA_Pool}
conn, err := tls.Dial("tcp", "127.0.0.1:8000", &config)
if err != nil {
log.Fatalf("client: dial: %s", err)
}
Y el código del servidor relevante así:
cert, err := tls.LoadX509KeyPair("./cert.pem", "./key.pem")
config := tls.Config{Certificates: []tls.Certificate{cert}}
listener, err := tls.Listen("tcp", "127.0.0.1:8000", &config)
for {
conn, err := listener.Accept()
if err != nil {
log.Printf("server: accept: %s", err)
break
}
log.Printf("server: accepted from %s", conn.RemoteAddr())
go handleConnection(conn)
}
Como el certificado del servidor está autofirmado, use el mismo certificado para el servidor y para los clientes. CA_Pool, sin embargo, esto no parece funcionar, ya que siempre aparece este error:
client: dial: x509: certificate signed by unknown authority
(possibly because of "x509: invalid signature: parent certificate
cannot sign this kind of certificate" while trying to verify
candidate authority certificate "serial:0")
¿Cuál es mi error?
El problema es que necesita un certificado de CA en la configuración del lado del servidor, y esta CA debe haber firmado el certificado del servidor.
He escrito un código de Go que generate un certificado de CA, pero no ha sido revisado por nadie y es principalmente un juguete para jugar con certificados de clientes. La apuesta más segura es probablemente usar openssl ca
para generar y firmar el certificado. Los pasos básicos serán:
- Generar un certificado de CA
- Generar una clave de Servidor
- Firme la clave del servidor con el certificado de CA
- Agregue el certificado de CA a
tls.Config
RootCAs
del cliente - Configure los
tls.Config
del servidor con la clave del servidor y el certificado firmado.
Finalmente funcionó con el sistema integrado x509.CreateCertificate, el problema fue que no configuré el indicador IsCA: true , solo configuré el x509.KeyUsageCertSign que hizo que la creación del certificado autofirmado funcionara, pero se bloqueó al verificar la cadena de cert.
Kyle, es correcto. Esta herramienta hará lo que quiera y simplifica todo el proceso:
https://github.com/deckarep/EasyCert/releases (solo OSX es compatible ya que usa la herramienta openssl internamente)
y la fuente:
https://github.com/deckarep/EasyCert
Básicamente con esta herramienta generará un paquete de archivos, pero necesitará los tres que genera cuando termine.
- un archivo CA root de cer
- un archivo cer Cerrado
- un archivo de clave de Servidor