关于ssl:修复-SSL-Certificate-Problem如何定位最佳实践及常见问题的处理策略

40次阅读

共计 3912 个字符,预计需要花费 10 分钟才能阅读完成。

在开发过程中,应用 curl 进行申请或 git 克隆近程仓库时,可能会常常遇见一些 https 证书相干的谬误,咱们整顿了一些常见的谬误以及解决方案的汇总,放弃更新,也欢送你在评论中提供其余更好的计划。

常识补充:SSL / TLS 是什么?

传输层平安协定(Transport Layer Security,缩写:TLS)及其前身 SSL(Secure Sockets Layer),是客户端(Web 浏览器)与服务器端(Web sever)之间 🔐 加密通信的平安标准协议,目标是为互联网通信提供平安及数据完整性保障,目前曾经成为互联网窃密通信的工业规范。

  • SSL 最新的技术利用趋势及供应商(SSL certificate authority)的市场散布,能够点击查阅。
  • SSL 证书在线查看工具:What’s My Chain Cert? | SSL Certificate Checker – Diagnostic Tool | DigiCert.com
  • 如果你想为 Server 站点构建收费的 SSL 证书,能够思考应用 Let’s Encrypt:Let’s Encrypt | Certbot

如何定位和剖析错误信息

Tips: 设置 debug 模式有助于你追踪和定位具体问题实在起因所在(GIT_CURL_VERBOS 仅在 http/s 传输协定下无效)

# On Linux
export GIT_CURL_VERBOSE=1
export GIT_TRACE_PACKET=1
export GIT_TRACE=1

# On Window
set GIT_TRACE_PACKET=1
set GIT_TRACE=1 
set GIT_CURL_VERBOSE=1

# 如果以后机器有装置 python,能够疾速查看证书门路,辅助定位解决问题
python -c "import ssl; print(ssl.get_default_verify_paths())" 

# 应用 openssl 查看站点的证书状况
openssl s_client -showcerts -connect

常见问题

问题:SSL certificate problem: unable to get local issuer certificate

起因

如果应用 自签名证书(self-signed certificate)无奈被认证时,git 或者 curl 等客户端程序无奈信赖该 server 的证书,且在 Window 环境中,会因为环境配置的问题导致该类问题的呈现。

解决方案:

遇到该类问题,长期的全局解决计划是去禁用证书验证, ⚠️ 要留神这种做法会有潜在的平安危险(可能引发中间人攻打 MitM attacks)。

# 应用 git 操作的全局解决措施
# http.sslBackend: Name of the SSL backend to use (e.g. "openssl" or "schannel"). 
# This option is ignored if cURL lacks support for choosing the SSL backend at runtime.
git config --global http.sslBackend schannel

# 或者
# http.sslVerify: A boolean to enable/disable verification of the server certificate used by the SSL/TLS connection.
# ⚠️ Do NOT do this!
git config --global http.sslVerify false

# 亦能够间接设置环境变量运行 git 操作
GIT_SSL_NO_VERIFY=true git clone https://username@git.example.com/scm/repository.git

# Git Config Option Ref: https://git-scm.com/docs/git-config

如果能够从 server 端拿到 certificate.pem 文件,能够尝试通知 git 程序,CA(Certificate Authority)bundle 文件的地位来解决该问题:

# Convert the file into the X.509 format
# openssl-x509, x509 - Certificate display and signing utility
# https://www.openssl.org/docs/man1.0.2/man1/x509.html
openssl x509 -in certificate.pem -out certificate.crt
git config --system http.sslCAInfo /path/certificate.crt

# 或者能够批改 .gitconfig 的配置我的项目,而后重新安装一下 git
git config --global -e

[http "https://your.domain.com"]
  # MUST be PEM format
  # Some situations require both the CAPath AND CAInfo 
  sslCAInfo = /path/to/selfCA/self-signed-certificate.crt
  sslCAPath = /path/to/selfCA/
  sslVerify = true

  # Must be PEM format and include BEGIN CERTIFICATE / END CERTIFICATE, 
  # not just the BEGIN PRIVATE KEY / END PRIVATE KEY for Git to recognise it.
  sslCert = /path/to/privatekey/myprivatecert.pem

  # Even if your PEM file is password protected, set this to false.
  # Setting this to true always asks for a password even if you don't have one.
  # When you do have a password, even with this set to false it will prompt anyhow. 
  sslCertPasswordProtected = 0

Tips:CA bundle 是一个蕴含根证书和两头证书的文件,与理论证书文件形成了残缺的证书链。能够通过以下形式来获取 bundle 文件:cURL:https://curl.se/docs/caextract.html

如何获取自签名证书的办法不在这里赘述。

其余客户端程序也会遇到相似问题,比方 pip / conda / node,能够尝试用相似的思路来解决:

# curl code:
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);

# python package
pip config set global.cert path/to/ca-bundle.crt

# conda package
conda config --set ssl_verify path/to/ca-bundle.crt

另外,有一些极少数的状况,被防火墙或杀毒禁止也会呈现该问题,能够尝试敞开这些软件来验证是否能够解决。

相干问题:fatal: unable to access ‘https://company.domain/project.git’: SSL certificate problem: certificate has expired

如果你是在 2021 年 9 月之后遇到该问题,有可能是受到了 Let’s Encrypt DST Root CA X3 Expiration (September 2021) 的影响,能够尝试以下的办法来解决。

  • Ubuntu 14.04 LTS (Trusty Tahr) or Ubuntu 16.04.6 LTS (Xenial Xerus) 运行环境:
# 编辑文件 /etc/ca-certificates.conf, 找到该证书并正文
!mozilla/DST_Root_CA_X3.crt

# 或者间接命令行解决
sudo sed -i -e 's/mozilla\/DST_Root_CA_X3\.crt/!mozilla\/DST_Root_CA_X3\.crt/g' /etc/ca-certificates.conf

# 保留文件后运行命令
sudo rm /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt
sudo update-ca-certificates
  • Mac OS X 10.13.6 (High Sierra) 下面, cURL(and therefore Git) 依赖于 /etc/ssl/cert.pem 去解决根证书认证,你能够手动移除 DST Root CA X3
  • 如果你有应用 certbot 也须要降级到最新版本,renew 站点证书去移除 DST Root CA X3 的潜在问题
sudo certbot renew --force-renewal --preferred-chain "ISRG Root X1"

在 Window 环境中,你能够尝试把 git 降级到最新版本,会解决该问题。

相干材料

  • KSE Manual – User Interface Overview
  • Git for Windows: SSL certificate problem: certificate has expired
  • DST Root CA X3 Expiration (September 2021) – Let’s Encrypt

本文应用「署名 4.0 国内 (CC BY 4.0)」许可协定,欢送转载、或从新批改应用,但须要注明起源。

作者:Lone 神 / 自在工程师
文章备份地址(放弃更新):https://whycode.yousails.com/…

正文完
 0