2015-03-06 12 views
5

Sto creando un server Go TCP (NON http/s) e sto cercando di configurarlo per utilizzare SSL. Ho un certificato SSL gratuito StartCom che sto cercando di utilizzare per realizzare questo. Il mio codice del server è simile al seguente:Configurazione certificato socket SSL SSL Golang

cert, err := tls.LoadX509KeyPair("example.com.pem", "example.com.key") 
    if err != nil { 
     fmt.Println("Error loading certificate. ",err) 
    } 
    trustCert, err := ioutil.ReadFile("sub.class1.server.ca.pem") 
    if err != nil { 
     fmt.Println("Error loading trust certificate. ",err) 
    } 
    validationCert, err := ioutil.ReadFile("ca.pem") 
    if err != nil { 
     fmt.Println("Error loading validation certificate. ",err) 
    } 
    certs := x509.NewCertPool() 
    if !certs.AppendCertsFromPEM(validationCert) { 
     fmt.Println("Error installing validation certificate.") 
    } 
    if !certs.AppendCertsFromPEM(trustCert) { 
     fmt.Println("Error installing trust certificate.") 
    } 

    sslConfig := tls.Config{RootCAs: certs,Certificates: []tls.Certificate{cert}} 

    service := ":5555" 
    tcpAddr, error := net.ResolveTCPAddr("tcp", service) 
    if error != nil { 
     fmt.Println("Error: Could not resolve address") 
    } else { 
     netListen, error := tls.Listen(tcpAddr.Network(), tcpAddr.String(), &sslConfig) 
     if error != nil { 
      fmt.Println(error) 
     } else { 
      defer netListen.Close() 

      for { 
       fmt.Println("Waiting for clients") 
       connection, error := netListen.Accept() 

Ho provato il passaggio intorno l'ordine dei certs, esclusi alcuni certs, ecc ma l'uscita dal openssl s_client -CApath /etc/ssl/certs/ -connect localhost:5555 rimane essenzialmente la stessa, verify error:num=20:unable to get local issuer certificate. Vedere here per l'output completo. Mi sembra che stia facendo qualcosa di sbagliato con i certificati intermedi, ma non ho idea di cosa. Ho lavorato su questo per alcuni giorni, un sacco di googling e SO'ing, ma nulla sembrava adattarsi alla mia situazione. Ho impostato molti certificati in Apache e HAProxy, ma questo mi ha davvero bloccato.

+0

Non utilizzare 'error' come valore di errore, poiché maschera il nome dell'interfaccia incorporata. – JimB

+0

Grazie, lo correggerò! –

risposta

4

Il campo RootCAs è per i client che verificano i certificati del server. Presumo che tu voglia solo presentare un certificato per la verifica, quindi tutto ciò che ti serve dovrebbe essere caricato nella sezione Certificates.

Ecco un esempio minimo:

cert, err := tls.LoadX509KeyPair("example.com.pem", "example.com.key") 
if err != nil { 
    log.Fatal("Error loading certificate. ", err) 
} 

tlsCfg := &tls.Config{Certificates: []tls.Certificate{cert}} 

listener, err := tls.Listen("tcp4", "127.0.0.1:5555", tlsCfg) 
if err != nil { 
    log.Fatal(err) 
} 
defer listener.Close() 

for { 
    log.Println("Waiting for clients") 
    conn, err := listener.Accept() 
    if err != nil { 
     log.Fatal(err) 
    } 
    go handle(conn) 
} 

Anche se non lo si utilizza HTTPS, può essere ancora utile a piedi attraverso la configurazione del server a partire da http.ListenAndServeTLS.

+0

Il certificato intermedio dovrebbe essere aggiunto nel file esempio.com.pem? Quindi è caricato con il certificato principale? –

+0

@kkhugs: Non ho un cert che richiede un pratico intermedio, ma sono abbastanza sicuro che dovresti semplicemente includerli nel tuo 'esempio.com.pem', come faresti in nginx per esempio (i documenti dicono che' I certificati contengono una o più catene di certificati »). – JimB

+0

Grazie, aggiungendo l'intermedio nel file cert e l'utilizzo come suggerito ha funzionato perfettamente! –