信任用于安全服务间通信的自签名SSL / TLS证书

时间:2020-04-18 01:04:16

标签: nginx openssl ssl-certificate microservices self-signed-certificate

我们对服务器上运行的微服务进行了编排。 Nginx服务充当微服务之间的代理。我们希望使用我们的自签名证书在SSL上进行所有通信。

我们想将我们的私有CA添加到每个服务(在Debian Buster上运行),以便在该服务中的任何地方都将其视为有效。我们将生成服务器证书和CA,如下所示:

# Generate Root CA Certificate
openssl genrsa -des3 -out CA-key.pem 2048
openssl req -new -key CA-key.pem -x509 -days 1000 -out CA-cert.pem

# Generate a Signing a Server Certificate
openssl genrsa -des3 -out server-key.pem 2048
openssl req –new –config openssl.cnf –key server-key.pem –out signingReq.csr
openssl x509 -req -days 365 -in signingReq.csr -CA CA-cert.pem -CAkey CA-key.pem -CAcreateserial -out server-cert.pem

但是,我们不能使微服务将证书视为有效并信任它。在微服务中使用Python的请求库发出get请求时,将引发以下异常:

requests.exceptions.SSLError: HTTPSConnectionPool(host='server.name', port=443): Max 
retries exceeded with url: /url/to/microservice2/routed/via/nginx/ (Caused by 
SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate 
verify failed: self signed certificate (_ssl.c:1076)')))

到目前为止我们尝试过的事情:

  • 将证书复制到/ usr / share / ca-certificate /并运行sudo dpkg-reconfigure ca-certificates和/或update-ca-certificates命令。
  • REQUESTS_CA_BUNDLE环境变量设置为/path/to/internal-CA-cert.pem
  • SSL_CERT_FILE环境变量设置为/path/to/internal-CA-cert.pem

唯一可行的解​​决方法是在valid=False中设置requests.get(url, params=params, verify=False, **kwargs),以忽略SSL证书的有效性。但是,这不是我们要为所有微服务和通信实现的烦恼。

1 个答案:

答案 0 :(得分:-1)

解决方案是将自签名服务器证书(用我们自己的CA签名)复制到/usr/local/share/ca-certificates目录中,并使用debian发行版中随附的update-ca-certificates(其他解决方案也可以使用linux版本)。

cp /path/to/certificate/mycert.crt /usr/local/share/ca-certificates/mycert.crt
update-ca-certificates

但是,棘手的是,上述解决方案不足以使python请求库将证书视为有效。要解决此问题,必须将自签名服务器证书附加到cat-certificates.crt,然后将环境变量REQUESTS_CA_BUNDLE设置到该附加文件。

cat /path/to/certificate/mycert.crt >>/etc/ssl/certs/ca-certificates.crt
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt