WSL中添加自签证书
问题描述
问题背景为在wsl中使用go mod tidy安装项目依赖库时, 部分库是公司内部库, 放在artifactory这个仓库中, 按照artifactory的操作文档, 设置goproxy
go env -w GOPROXY=https://goproxy.cn,https://user@trip.com:passwordxxx@artifactory.release.ctripcorp.com/artifactory/api/go/trip-golang-prod,direct
go mod tidy命令报错: x509: certificate signed by unknown authority
报错原因是WSL中缺少artifactory.release.ctripcorp.com的证书, 使用curl命令访问网站时, 同样报错说获取不到证书
curl https://artifactory.release.ctripcorp.com
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
根本原因
在使用https(非http)的方式建立访问连接时, 客户端会校验服务器返回的证书是否合法, 如果不合法, 就会报错证书认证失败, 无法访问
客户端判断证书是否合法的方式为两种, 第一种是从公认的第三方证书颁发者中验证, 第二种是从本地已有的证书中验证, 像'https://www.baidu.com'这种知名网站就是其他CA组织颁发的证书
而'https://artifactory.release.ctripcorp.com'是公司内部地址, 使用的证书是自签证书(自己颁发给自己的), 访问时若本地没有该证书, 则就会访问失败. 而在浏览器中能访问的原因是因为公司window电脑默认就装了这个自签证书, 而在WSL中是没装的, 因此就需要手动在WSL中安装该证书
解决方法
非标准的解决方法
问题核心为通过https协议访问需要证书的验证, 那么最简单的方法就是把https换成http协议, 免去了证书验证这一步, 但主要看服务器端支不支持http的方式, 在这个案例中我尝试了修改goproxy替换为http, 但是go mod还是会失败, 访问被拒绝, 原因为服务端不支持http
go get git.dev.sh.ctripcorp.com/ctripgo/credis2
go: git.dev.sh.ctripcorp.com/ctripgo/cat2@v1.0.8: refusing to pass credentials to insecure URL: http://cx.gong%40trip.com:xxxxx@artifactory.release.ctripcorp.com/artifactory/api/go/trip-golang-prod/git.dev.sh.ctripcorp.com/ctripgo/cat2/@v/v1.0.8.mod
标准的解决方法
第一步: 从浏览器中下载证书
上文提到从浏览器中可以成功访问目标地址, 因为浏览器中已经存在该证书, 所以可以从浏览器中下载该证书, 再发送到WSL中, 这里以Edge浏览器为例, 具体操作为:
在浏览器访问目标地址, 查看证书的"颁发给"和"颁发者"

在"设置"中找到证书管理, 找到访问目标对应的证书, 这里使用的是根证书, 给ctripcorp.com这个根域名颁发的, 其所有子域名都使用该证书

选择第一个格式(.cer)导出到文件ca_ctrip.cer(命名可自定义)

第二步: 将证书导入WSL的系统信任库中
Windows和Linux的证书格式不一样, 因此需要在WSL中将上述windows证书文件(ca_ctrip.cer)转为.crt格式
openssl x509 -inform der -in ca_ctrip.cer -out ca_ctrip.crt
在Ubuntu/Debian系统将证书文件复制到 /usr/local/share/ca-certificates/ 目录, CentOS/RedHat系统复制到 /etc/pki/ca-trust/source/anchors/
sudo cp ca.crt /usr/local/share/ca-certificates/
更新证书信任库
-
Ubuntu/Debian:
sudo update-ca-certificates -
CentOS/RedHat:
sudo update-ca-trust
发送HTTPS请求验证证书是否有效
curl https://artifactory.release.ctripcorp.com
最终请求成功, 使用go mod tidy也没有报错了, 正常安装了内部系统中的库

浙公网安备 33010602011771号