Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >修复 SSL Certificate Problem,如何定位及解决问题

修复 SSL Certificate Problem,如何定位及解决问题

原创
作者头像
Lone神
修改于 2021-11-01 03:59:17
修改于 2021-11-01 03:59:17
11.7K0
举报
文章被收录于专栏:技术问答汇总技术问答汇总

在开发过程中,使用 curl 进行请求或 git 克隆远程仓库时,可能会经常遇见一些 https 证书相关的错误,我们整理了一些常见的错误以及解决方案的汇总,保持更新,也欢迎你在评论中提供其他更好的方案。

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

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

如何定位和分析错误信息

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

代码语言:txt
AI代码解释
复制
# 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)。

代码语言:txt
AI代码解释
复制
# 使用 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 文件的位置来解决该问题:

代码语言:txt
AI代码解释
复制
# 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,可以尝试用类似的思路来解决:

代码语言:txt
AI代码解释
复制
# 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) 的影响,可以尝试以下的方法来解决。

代码语言:txt
AI代码解释
复制
# 编辑文件 /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 的潜在问题
代码语言:txt
AI代码解释
复制
sudo certbot renew --force-renewal --preferred-chain "ISRG Root X1"

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

相关资料


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。

作者:Lone神 / 自由工程师

文章备份地址(保持更新):https://whycode.yousails.com/d/1-ssl-certificate-problem

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Git提示error setting certificate verify locations解决办法
问题描述 C:\Users\admin>git clone https://github.com/Kiterepo/dns-over-https Cloning into 'clojure-getting-started'... fatal: unable to access 'https://github.com/Kiterepo/dns-over-https': error setting certificate verify locations: CAfile: D:/ProgramFlie/Gi
Huramkin
2018/09/17
11.7K0
【实践】如何在本地环境用GO实现HTTPS链接?
本篇文章是基于实操,如何在本地环境用GO实现HTTPS链接。原理部分请参考文章《【深度知识】HTTPS协议原理和流程分析》。
辉哥
2019/05/15
2.5K0
【实践】如何在本地环境用GO实现HTTPS链接?
nginx配置证书和私钥进行SSL通信验证
正常项目的私钥和服务端证书会放在项目中或者外挂到linux服务器某个路径下,现在的需求是客户手动创建的新的证书,替换后项目证书仍然生效,且功能能正常使用。
刘大猫
2025/01/26
2350
有关 TLS/SSL 证书的一切
TLS 握手其中关键的一步,就是 Server 端要向 Client 端证明自己的身份。感觉有关 TLS 的内容,介绍握手的原理的有很多,但是介绍证书的并不多,证书是 TLS/SSL 非常关键的一环。本文就尝试说明,证书是用来干什么的,Google 是如何防止别人冒充 Google 的,证书为什么会频繁出问题,等等。
公众号: 云原生生态圈
2024/05/06
1K0
有关 TLS/SSL 证书的一切
CICD(一) GitLab的搭建与使用
GitLab的搭建与使用 GitLab介绍 开源免费 差异化的版本管理,离线同步机器强大的分支管理功能 便捷的GUIO操作界面以及强大的权限管理 集成度很高,能够集成绝大多数的开发工具 支持内置HA,保证在高并发的情况下实现高可用性 Gitlab的服务构成 Nginx: 静态web服务器 GitLab-workhourse:轻量级的反向代理服务器 Git-shell: 用于处理Git命令以及修稿authorized keys列表 logrotate:日志文件管理 Postgresql:数据库 Redis:
alexhuiwang
2020/09/24
9490
CICD(一) GitLab的搭建与使用
go https 笔记
理解为运行在SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议所构建的安全层之上的HTTP协议
solate
2019/07/22
8640
解决报错:SSL certificate problem: certificate has expired
今天的想法挺简单的,就是想编译一下x264的,但是同步官网代码时,遇到了如下报错:
liuzhen007
2022/04/06
3.1K0
pem 文件详解
.DER:用二进制DER编码的证书;.PEM:用ASCLL(BASE64)编码的证书; .CER:存放公钥,没有私钥; .PFX:存放公钥和私钥(pem 后缀的证书都是base64编码;der 后缀的证书都是二进制格式;crt .cer 后缀的文件都是证书文件(编码方式不一定,有可能是.pem,也有可能是.der);.pfx 主要用于windows平台,浏览器可以使用,也是包含证书和私钥,获取私钥需要密码才可以)
用户8418197
2022/02/17
21.7K0
SSL证书的区别和申请办法
从2017年开始意味着浏览器迁移HTTPS的重要开始,因为Chrome 56版本讲HTTP标记为非安全的网站。证书是用于SSL安全通信信道鉴权,它可以防止中间人攻击。证书有一条信任链,证书的真实安全身份由签发者提供保证,这一个信任关系常见的有2~4级,根证书的机构就是那些知名机构,这些知名机构被安装于世界上几乎所有主流的浏览器。一个证书通过工具查看到证书的拥有者和签发者。
mariolu
2019/04/08
3K0
Linux服务器上Tomcat配置SSL证书并自动续期
2.lets encrypt官网地址:https://letsencrypt.org
JaneYork
2023/10/11
6230
Linux服务器上Tomcat配置SSL证书并自动续期
OpenSSL 转换证书格式
工作中我相信你一定会遇到处理数字证书的时候。各种平台,各种语言,它们采用的证书格式与标准都不相同,多多少少存在一些差异。实际上证书仍然是那个证书,只是格式发生了变化。 公私钥 分开存储 公私钥合并为一个文件 有些采用二进制文件 有些事二进制文件做了BASE64编码 有些证书做了签名 有些证书加入了密码 不同组织有不同的编码。例如微软喜欢使用 x509 下面内容节节选自《Netkiller Cryptography 手札》 接下来几天我们将讨论密钥证书相关话题。 文章出处: http://www.netk
netkiller old
2018/03/05
4.2K0
git clone报错 server certificate verification failed. CAfile: none CRLfile: none
当使用命令 git pull 出现错误信息如下: server certificate verification failed. CAfile: none CRLfile: none 解决方案:
战神伽罗
2022/05/11
4.3K0
如何使用SSL证书
SSL证书是用于在WEB服务器与浏览器以及客户端之间建立加密链接的加密技术,通过配置和应用SSL证书来启用HTTPS协议,来保护互联网数据传输的安全,全球每天有数以亿计的网站都是通过HTTPS来确保数据安全,保护用户隐私。
用户8418197
2021/09/05
3.5K0
生成本地CA根证书、p12流程 EC篇
上述命令将生成一个 EC 私钥文件 root.key,使用 prime256v1 曲线参数。
Raindew
2023/10/14
8250
CA证书介绍与格式转换
PKCS 公钥加密标准(Public Key Cryptography Standards, PKCS),此一标准的设计与发布皆由RSA资讯安全公司(英语:RSA Security)所制定,PKCS 目前共发布过 15 个标准。更多公钥加密标准
Miloce
2022/09/28
5K0
git 提示error setting certificate verify locations 解决方案
Unable to access 'xxxxx(这里是git地址)'  error setting certificate verify locations:  CAfile:xxx(cer的地址)
凯哥Java
2022/12/16
1.2K0
git 提示error setting certificate verify locations 解决方案
生成本地CA根证书、p12流程
安装 OpenSSL:首先,确保你的系统上安装了 OpenSSL 工具。如果尚未安装,你可以通过 Homebrew 或从 OpenSSL 官方网站下载并安装。
Raindew
2023/10/14
1.5K0
再谈加密-RSA非对称加密的理解和使用
枕边书
2018/01/04
2.7K0
系统安全加密验证签名之Openssl命令
描述:OpenSSL是一个开源项目,它是安全套接字层密码库(Secrue socket layer)和传输层安全(transport layer security,TLS)协议的实现,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议(SSL/TLS工具集),并提供丰富的应用程序供测试或其它目的使用。
全栈工程师修炼指南
2022/09/29
4.4K0
系统安全加密验证签名之Openssl命令
如何在Tomcat中做TLS客户端认证
常见的https网站做的是服务端认证(server authentication),浏览器通过证书判断你所访问的https://baidu.com是否真的是百度,而不是其他人伪造的网站。同时还对流量加密,防止别人窃听你的流量。
颇忒脱
2019/04/19
2.9K0
如何在Tomcat中做TLS客户端认证
相关推荐
Git提示error setting certificate verify locations解决办法
更多 >
LV.0
Yousails工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档