2016-03-13 255 views
0

我試圖使用此證書,在nginx反向代理後面的InfluxDB休息端點與我在GoLang中編寫的簡單客戶端之間建立連接。使用自簽名的SSL證書

我開始使用openssl生成的SSL證書,使用在this link上找到的教程,該教程通過創建和自我唱歌證書來運行我。

但我每次我試圖使這個連接時出現此錯誤:

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 "<My Certificate Name>") 

我還沒有找到一種方式來獲得這個解決了,但我會告訴我可以看到與此相關:

至於我可以告訴大家,對於InfluxDB Nginx的規則是很容易寫,並最終看起來像這樣:

# InfluxDB 
server { 
    ssl     on; 
    ssl_protocols   TLSV1.2 TLSV1.1 TLSV1; 
    ssl_certificate  /etc/nginx/server.crt; 
    ssl_certificate_key /etc/nginx/server.key; 
    listen    8086; 

    access_log   /var/log/nginx/influxdb.access.log; 
    error_log    /var/log/nginx/influxdb.error.log; 


    location/{ 
     include /etc/nginx/conf.d/options.conf.inc; 
     include /etc/nginx/conf.d/auth.conf.inc; 
     proxy_pass http://127.0.0.1:8087; 
    } 
    } 

其中options.conf.inc是:

if ($request_method = OPTIONS) { 
    add_header Access-Control-Allow-Origin $served_at; 
    add_header Access-Control-Allow-Methods "GET, OPTIONS"; 
    add_header Access-Control-Allow-Headers "Authorization"; 
    add_header Access-Control-Allow-Credentials "true"; 
    add_header Content-Length 0; 
    add_header Content-Type text/plain; 
    return 200; 
    } 

凡auto.conf.inc是:

add_header Access-Control-Allow-Headers "Authorization"; 
    add_header Access-Control-Allow-Credentials "true"; 
    auth_basic "Restricted"; 
    auth_basic_user_file <pathTo>.htpasswd; 
    error_page 401 /401.html; 

我golang客戶看起來是這樣的:

func main() { 
flag.Parse() 
// Load client cert 
cert, err := tls.LoadX509KeyPair(certFile, keyFile) 
if err != nil { 
    log.Fatal(err) 
} 
// Load CA cert 
caCert, err := ioutil.ReadFile(caFile) 
if err != nil { 
    log.Fatal(err) 
} 
caCertPool := x509.NewCertPool() 
caCertPool.AppendCertsFromPEM(caCert) 
// Setup HTTPS client 
tlsConfig := &tls.Config{ 
    Certificates: []tls.Certificate{cert}, 
    RootCAs:  caCertPool, 
    //  InsecureSkipVerify: true, 
} 
//tlsConfig.BuildNameToCertificate() 
transport := &http.Transport{TLSClientConfig: tlsConfig} 
client := &http.Client{Transport: transport} 
// Do GET something 
resp, err := client.Get("https://fillerBasicAuthCredentials:[email protected]:8086/query?q=show+databases") 
if err != nil { 
    log.Fatal(err) 
} 
defer resp.Body.Close() 
// Dump response 
data, err := ioutil.ReadAll(resp.Body) 
if err != nil { 
    log.Fatal(err) 
} 
log.Println(string(data)) 
} 

正如你可以在我的golang代碼看,是我玩過與tlsConfig對象上的InsecureSkipVerify標誌一起使用。將它設置爲true將使所有的工作都成功,但是由於它首先破壞了許多使用證書的要點,所以看起來本質上是不好的。

我留下的選項似乎是生成一個CA證書並使用它來簽署我的常規證書,但這看起來更像是一種黑客,而不是我應該做的。

EDIT(解決方案):

探索創造我自己的CA證書與我能得到的一切工作簽署這些之後。現在我有一個CA證書,我將用它來簽署我的其他證書,我將在這些盒子上安裝此CA證書,以便他們知道這是一個可信任的證書。

飲片那名有幫助的我是如何解決這個:

我使用,我試圖避免使用一個開源influxdb客戶端。它目前使用golang的net/http包,而不是crypto,這意味着我不能像我的示例那樣指定我的CA證書代碼。我必須將CA證書安裝到我的包裝箱上,以便正確識別它。我發現這篇文章有幫助的文章是[這一個] https://www.happyassassin.net/2015/01/14/trusting-additional-cas-in-fedora-rhel-centos-dont-append-to-etcpkitlscertsca-bundle-crt-or-etcpkitlscert-pem/

+0

根據該消息,似乎你必須去CA證書路線才能使其工作。 –

回答

3

該錯誤消息來自go的CheckSignatureFrom方法。它看起來好像需要將basicConstraints中的CA標誌設置爲true,並且如果keyUsage字段存在(它在您鏈接的示例中,但不在我見過的大多數使用自簽名證書的說明中),它必須包括keyCertSign值。

當我遇到類似的問題時,我創建了一個與服務器證書分開的CA.這是一個更多的工作,但它不是一個「黑客」;如果將自簽名證書設置爲自己的CA,那麼這是一個駭客解決方案。

+0

我能夠通過生成第二個證書,將我的CA證書用於乾淨地工作。我編輯了我的問題以包含其他一些細節。謝謝。 – LAMonday