我試圖使用此證書,在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/
根據該消息,似乎你必須去CA證書路線才能使其工作。 –