2016-08-08 71 views
2

我有一臺服務器,其中有一個運行在https上的其他API。我想對我的應用程序這個REST API這是在不同的端口上運行的呼叫,但因爲這是通過https我得到如何使用證書golang發送https請求

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

我有2個文件pulic_key.pem和PRIVATE_KEY可用於驗證證書。如何使用golang發送休息請求時驗證證書?我正在使用&http.Client{}發送休息請求。這是我現在正在做的忽略證書的做法。

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

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

回答

6

您需要將您的證書的CA添加到您的運輸,如:

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) 
    } 
} 

但我猜你只是還沒有建立CA,使您的證書。以下是無需解釋的命令列表,可幫助您使用自己的CA簽署證書。欲瞭解更多信息,你可以谷歌它。與創建CA簽署secure.domain.com

  1. 生成CA

    openssl genrsa -out rootCA.key 4096 
    openssl req -x509 -new -key rootCA.key -days 3650 -out rootCA.crt 
    
  2. 生成證書

    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

我認爲'ServerName'是'&tls.Config {}' –

0

如果證書是自簽名的,你必須添加此選項:

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

中必需的。如果我正確理解如果您添加'InsecureSkipVerify',您允許客戶端驗證服務器的證書而不是您的,並且您的caCertPool將被忽略。如果我錯了,請糾正我。 –

相關問題