解决证书信任问题:各种环境导入SSL证书链

解决证书信任问题:各种环境导入SSL证书链

1.为什么要导入证书链

当服务端的SSL证书(下称:My证书)使用的是自签名证书、或者是证书兼容性较差,在客户端或API调用方(角色相当于是客户端)的受信任证书库中没有包含信任My证书的证书签发机构证书时,客户端可能出现以下报错:

浏览器提示此网站的安全证书存在问题,用户可通过选择“继续浏览此网站”访问网站,影响使用体验。
在这里插入图片描述

Java程序报错:

  • unable to find valid certification path to requested target
  • PKIX path building failed

这时如果不解决这个问题,接口直接无法调用,业务将受到影响。
在这里插入图片描述
为什么会出现这种情况?
要解释这个问题,需要解释一下SSL证书是怎么被客户端使用证书链校验有效性的。

a.服务器证书 server.pem 的签发者为中间证书机构 inter,inter 根据证书 inter.pem 验证 server.pem 确实为自己签发的有效证书;
b.中间证书 inter.pem 的签发 CA 为 root,root 根据证书 root.pem 验证 inter.pem 为自己签发的合法证书;
c.客户端内置信任 CA 的 root.pem 证书,因此服务器证书 server.pem 的被信任。
在这里插入图片描述
以上证书链的解释来自https://blog.csdn.net/zxh2075/article/details/80738583

也就是说,如果向客户端的受信任证书库中导入My证书对应的根CA证书root.pem,就可以解决SSL证书不被客户端信任的问题。

2.导入证书链前的准备工作

下面以https://www.baidu.com 和Chrome浏览器为例,获取SSL证书的根CA证书:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到,www.baidu.com SSL证书是由根CA GlobalSign签发,在右下角导出其证书。
在这里插入图片描述
保存的格式用pem/crt就可以,后续将以导入crt格式的根CA证书root.crt为例。

3.各种环境导入证书链

下面将列举如何将根CA证书导入到常见的操作系统和运行环境中。

3.1.Linux+curl等Linux命令

curl访问https网站时,会调用Linux受信任证书库(CentOS 7下为/etc/pki/tls/certs/ca-bundle.crt)校验SSL证书的有效性。
如下图,以curl命令举例,若无法校验目标https链接的有效性,会产生报错:
curl:Peer's certificate issuer has been marked as not trusted by the user
遇到这种情况需要往Linux受信任证书库文件中写入根CA证书,可以将第2点中获取到的root.crt文件上传到Linux系统的硬盘中,执行以下命令导入:

cat /root/root.crt >> /etc/pki/tls/certs/ca-bundle.crt

在这里插入图片描述

3.2.Linux+JDK/JRE环境

Java运行环境中的受信任证书库文件在:
$JAVA_HOME/jre/lib/security/cacerts
有些情况下同一个目录下会有另一个受信任证书库文件$JAVA_HOME/jre/lib/security/jssecacerts
一般会优先调用jssecacerts文件,所以保险起见推荐将根CA证书库分别都导入到这两个文件中。
3.2.1.备份JDK所在目录

毕竟需要手工操作JDK内的文件,建议先备份一下JDK目录以防万一。

cd /usr/java/
tar -zcvf jdk1.6.0_01_日期.tar.gz  jdk1.6.0_01
3.2.2.将root.crt文件上传到服务器中

下文以文件路径为/root/root.crt讲解

3.2.3.导入证书

证书导入cacerts命令:

keytool -import  -keystore cacerts -file /root/root.crt -alias root2023
#命令讲解
keytool -import  -keystore 【证书库,一般linux下直接写cacerts或jssecacerts即可,如果导入不成功也可以写完整的文件路径】 -file 【crt/pem证书文件路径】 -alias 【证书别名,用于在证书库中查询\操作这张证书】

在这里插入图片描述
输入证书库的默认密码changeit
在这里插入图片描述
输入yes
回车导入证书:
在这里插入图片描述

导入证书之后,推荐确认一下证书库文件的修改时间,修改时间为今天的话说明导入成功了:
在这里插入图片描述
也可以用keytool查看刚刚导入的别名为root2023的证书:

keytool -list -keystore cacerts -alias root2023

在这里插入图片描述

【注意】若密码没输错的情况下要求输入两次密码,说明keytool创建了一个新的cacerts而不是导入证书到了jre默认的cacerts中,这样导入不生效的,应在-keystore后写完整的cacerts文件路径:
在这里插入图片描述

3.2.4.重启应用服务

重启java程序、tomcat、nginx等服务
一定要确保关闭服务之后,java进程全部退出,否则jvm不重启的话不会重新加载证书库文件

3.3.Windows+JRE/JDK环境

Windows+JRE/JDK环境下,导入证书链的整个过程大致与【3.2.Linux+JDK/JRE环境】相同,推荐先备份一下JDK目录,以下将以root.crt文件上传到服务D盘根目录下为例。

Windows下有别于linux系统的点在于:

大多数情况下Windows需要在cmd命令行界面中先cd到【%JAVA_HOME%/bin/】或【%JAVA_HOME%/jre/bin/】目录下才能执行keytool命令

使用keytool命令的时候一定要写完整的路径,并用双引号包围:

keytool -import -keystore "C:\Program Files\Java\jre1.8.0_361\lib\security\cacerts" -file "D:\root.crt" -alias root2023

在这里插入图片描述
证书库默认密码同样为changeit
在这里插入图片描述
这里如果显示的是中文,应该输入“是”而不是yes
在这里插入图片描述
同理,如果cacerts文件日期为今天,则导入成功
在这里插入图片描述
同样的,成功导入完证书之后需要重启所有java进程。

3.4.Windows操作系统环境

有些程序直接使用Windows操作系统本身的证书库
这种情况下可以直接双击root.crt文件,选择安装证书,并按照默认选项安装即可。
在这里插入图片描述

3.5.Python环境

用记事本打开root.crt文件
将所有内容复制粘贴到python目录下cacert.pem文件内容的最后
以下给出我手上环境的cacert.pem文件目录供参考:

#Windows
C:\Users\administrator\AppData\Local\Programs\Python\Python39\Lib\site-packages\certifi\cacert.pem
#CentOS 7
/usr/local/lib/python3.6/site-packages/certifi/cacert.pem
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值