2016-08-08 19 views
2

Ich habe einen Server, der eine Rest-API hat, die über https läuft. Ich möchte einen Aufruf dieser Rest api in meiner Anwendung machen, die in anderen Port ausgeführt wird, aber da dieses über https Ich erhalteSo senden Sie eine https-Anfrage mit einem Zertifikat golang

Post https://localhost:8080/api/v1/myapi: x509: certificate signed by unknown authority 

Ich habe 2 Dateien pulic_key.pem und private_key, die das verifizieren kann Zertifikat. Wie kann das Zertifikat überprüft werden, während eine Ruheanforderung mit Golang gesendet wird? Ich verwende &http.Client{}, um eine Ruheanforderung zu senden. Hier ist, was ich mache, um das Zertifikat jetzt zu ignorieren.

tr := &http.Transport{ 
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, 
} 

client := &http.Client{Transport: tr} 

Antwort

6

Sie müssen wie auf Ihren Transport CA Ihr Zertifikat hinzuzufügen:

package main 

import (
    "crypto/tls" 
    "io/ioutil" 
    "log" 
    "net/http" 
    "crypto/x509" 
) 

func main() { 
    caCert, err := ioutil.ReadFile("rootCA.crt") 
    if err != nil { 
     log.Fatal(err) 
    } 
    caCertPool := x509.NewCertPool() 
    caCertPool.AppendCertsFromPEM(caCert) 

    client := &http.Client{ 
     Transport: &http.Transport{ 
      TLSClientConfig: &tls.Config{ 
       RootCAs:  caCertPool, 
      }, 
     }, 
    } 

    _, err := client.Get("https://secure.domain.com") 
    if err != nil { 
     panic(err) 
    } 
} 

Aber ich denke, Sie haben einfach nicht CA erstellt Ihre Zertifikate zu machen. Hier ist die Liste der Befehle ohne Erklärung, die Ihnen helfen können, Zertifikate mit Ihrer eigenen CA zu signieren. Für weitere Informationen können Sie es googlen.

  1. Gene CA

    openssl genrsa -out rootCA.key 4096 
    openssl req -x509 -new -key rootCA.key -days 3650 -out rootCA.crt 
    
  2. generieren Zertifikat für secure.domain.com mit erstellt CA unterzeichnet

    openssl genrsa -out secure.domain.com.key 2048 
    openssl req -new -key secure.domain.com.key -out secure.domain.com.csr 
    #In answer to question `Common Name (e.g. server FQDN or YOUR name) []:` you should set `secure.domain.com` (your real domain name) 
    openssl x509 -req -in secure.domain.com.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -days 365 -out secure.domain.com.crt 
    
+0

Ich denke 'ServerName' ist erforderlich in' & tls.Config {} ' –

0

Wenn das Zertifikat selbst signiert ist, diese Option hinzufügen:

TLSClientConfig: &tls.Config{ 
    RootCAs:  caCertPool, 
    InsecureSkipVerify: true, 
}, 
+0

Wenn ich richtig verstehe, wenn Sie' InsecureSkipVerify' hinzufügen, erlauben Sie dem Client, das Zertifikat des Servers anstelle von Ihnen zu überprüfen, und Ihr caCertPool wird ignoriert. Bitte korrigieren Sie mich, falls ich falsch liege. –