【问题标题】:Trust Self-signed SSL/TLS Certificate for Secure Inter-service Communication用于安全服务间通信的信任自签名 SSL/TLS 证书
【发布时间】:2020-04-18 01:04:16
【问题描述】:

我们有一个在服务器上运行的微服务编排。 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

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

【问题讨论】:

  • 我的猜测是自签名服务器证书不是自签名 CA。您可能需要一个自签名 CA 并使用它来签署您的服务器证书。
  • 我可以在下面生成 CA(证书颁发机构)和服务器证书:simba.com/products/SEN/doc/Client-Server_user_guide/content/…。但是我应该在 Nginx SSL 配置中包含哪一个,以及服务中的哪一个(实际上是 nginx 的客户端)是值得信任的?
  • 我不明白你的设置,但如果 Python 引发了异常,那么它可能需要 CA 以便它可以验证另一端的服务器证书。
  • @richard-smith 与服务器证书关联的 CA 证书已包含在服务的 /etc/ssl/certs/ 中,但服务仍认为 ssl 连接仍然失败并显示 SSL: CERTIFICATE_VERIFY_FAILED]
  • @RichardSmith 我编辑了问题以提供更多细节和澄清。

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-03-19
    • 2014-06-07
    • 2018-10-08
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多