我正在尝试使用此证书,在nginx反向代理后面的InfluxDB休息端点和用GoLang编写的简单客户端之间建立连接。
我开始使用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:password!1@192.168.223.128: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证书并使用它来签署我的常规证书,但这看起来似乎比我应该做的更多。
编辑(解决方案):
在探索创建我自己的CA证书以签署这些后,我能够让一切正常。现在我有一个CA证书,我将用它来签署我的其他证书,我将在盒子上安装这个CA证书,这样他们就知道它是一个值得信赖的证书。
对我如何解决这个问题有帮助的部分:
我正在使用我试图避免使用的开源flowxdb客户端。它目前使用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 :(得分:3)
该错误消息来自go CheckSignatureFrom方法。看起来它需要将basicConstraints
中的CA标记设置为true,并且如果keyUsage
字段存在(它在您链接的示例中,但它不是我见过的大多数指令使用自签名证书)它必须包含keyCertSign
值。
当我遇到类似的问题时,我创建了一个独立于服务器证书的CA.这是一个更多的工作,但它不是一个“黑客”;如果将自签名证书设置为正确识别为其自己的CA,那么这是一个更黑客的解决方案。