使用自签名SSL证书

时间:2016-03-13 16:30:37

标签: ssl nginx go https self-signed

我正在尝试使用此证书,在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/

1 个答案:

答案 0 :(得分:3)

该错误消息来自go CheckSignatureFrom方法。看起来它需要将basicConstraints中的CA标记设置为true,并且如果keyUsage字段存在(它在您链接的示例中,但它不是我见过的大多数指令使用自签名证书)它必须包含keyCertSign值。

当我遇到类似的问题时,我创建了一个独立于服务器证书的CA.这是一个更多的工作,但它不是一个“黑客”;如果将自签名证书设置为正确识别为其自己的CA,那么这是一个更黑客的解决方案。