怎么在服务器上部署DigiCert的根CA证书

2018-03-16, 发表于【行业常识】

为了提升兼容性, 微信支付的服务器上部署了DigiCert的交叉证书. 客户端的执行环境中需要安装(Baltimore CyberTrust Root.crt DigiCert Global Root CA.crt)中的任意一个, 即可。

DigiCert根CA证书兼容性列表如下:

DigiCert Global Root CA 
证书序列号 08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a
证书有效期 2006.11.10-2031.11.10
Windows兼容 Windows 7+
Java兼容 1.6.05及以上
证书下载 PEM格式 DER格式
Baltimore CyberTrust Root CA
证书序列号 02:00:00:b9
证书有效期 2000.5.13-2025.5.13
Windows兼容 Windows XP及以上
Java兼容 1.4.2及以上
证书下载 PEM格式 DER格式

下面针对几种主流的开发语言, 介绍如何安装新的根证书:

1.JAVA

Java使用JSSE包中的信任管理器来校验远端服务器的证书是否合法, TrustStore文件中保存了根证书信任列表. JRE 1.4.2及以上版本自带的TrustStore文件(lib/security/cacerts)中均内置了DigiCert的根证书。

◆ 如果你使用的JRE版本为1.4.2及以上, 且使用默认的TrustStore文件(lib/security/cacerts), 通常不需要做额外配置, 就能支持新的服务器证书。

◆ 如果你使用的JRE版本低于1.4.2 , 或者在系统属性javax.net.ssl.trustStore中指定了自定义的TrustStore, 那么需要使用JAVA自带的证书管理工具 Keytool导入DigiCert的根证书. 具体的命令为:

windows系统

查看

keytool.exe -list -keystore  cacerts  -storepass changeit (digicert证书的别名为: digicertglobalrootca 或者 baltimorecybertrustca)

新增

keytool.exe -importcert -keystore cacerts -storepass changeit -noprompt  -file ./ DigiCert_Global_Root_CA.der -alias " digicertglobalrootca" (证书格式需要为der)

linux

查看

keytool -list -keystore  cacerts  -storepass changeit (digicert证书的别名为: digicertglobalrootca 或者 baltimorecybertrustca)

新增

keytool -importcert -keystore cacerts -storepass changeit -noprompt  -file ./ DigiCert_Global_Root_CA.der -alias " digicertglobalrootca (证书格式需要为der)

2.C\C++

使用C++开发的应用程序, 通常使用libcurl库发起https请求, libcurl支持多种SSL\TLS引擎, 如 OpenSSL, SChanel, NSS等。

更详细的内容,可参考:https://curl.haxx.se/docs/ssl-compared.html

◆使用OpenSSL时, 参考如下操作:

步骤一: 查看openssl根证书信任文件路径.  执行命令行 openssl version –a ,输出结果中的 OPENSSLDIR就是根证书信任文件路径

$ openssl version -a
OpenSSL 1.0.1e-fips 11 Feb 2013
built on: Tue Mar 24 14:14:19 CST 2015
platform: linux-x86_64
options:  bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) 
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS 
		-D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 
		-DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,
		-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector 
		--param=ssp-buffer-size=4 -m64 -mtune=generic -Wa,
		--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 
		-DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 
		-DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM 
		-DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM 
		-DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/etc/pki/tls"
engines:  rdrand dynamic

步骤二: 按照验证证书的方式二配置host,然后使用以下命令行, 确认操作系统内置的根证书中, 是否支持DigiCert证书

$ openssl s_client -connect api.mch.weixin.qq.com:443  -verify_return_error  -CApath $OPENSSLDIR

正常的输出为:

keytool.exe -importcert -keystore cacerts -storepass changeit -noprompt  -file ./ DigiCert_Global_Root_CA.der -alias " digicertglobalrootca"
(证书格式需要为der)
keytool -list -keystore  cacerts  -storepass changeit
(digicert证书的别名为: digicertglobalrootca 或者 baltimorecybertrustca)
keytool -importcert -keystore cacerts -storepass changeit -noprompt  -file ./ DigiCert_Global_Root_CA.der -alias " digicertglobalrootca
(证书格式需要为der) 
keytool.exe -list -keystore  cacerts  -storepass changeit
(digicert证书的别名为: digicertglobalrootca 或者 baltimorecybertrustca)
depth=3 C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root
verify return:1
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = GeoTrust RSA CA 2018
verify return:1
depth=0 C = CN, L = Shenzhen, O = Tencent Technology (Shenzhen) Company Limited, OU = R&D, CN = payapp.weixin.qq.com
verify return:1
CONNECTED(00000003)
---
Certificate chain

 0 s:/C=CN/L=Shenzhen/O=Tencent Technology (Shenzhen) Company Limited/OU=R&D/CN=payapp.weixin.qq.com
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=GeoTrust RSA CA 2018
 1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=GeoTrust RSA CA 2018
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
 2 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
   i:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root

缺少DigiCert根证书时, 可能输出的错误信息为:

depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify error:num=20:unable to get local issuer certificate
verify return:0
CONNECTED(00000003)
---

步骤三: 安装根证书。几种常见的linux发行版本的操作命令如下:

操作系统

操作

命令行

Ubuntu, Debian

查看根证书

 

确认操作系统上,是否存在以下文件: 

  1. /etc/ssl/certs/DigiCert_Global_Root_CA.pem
  2. /etc/ssl/certs/Baltimore_CyberTrust_Root.pem

安装根证书

  1. 复制根证书文件到 /usr/local/share/ca-certificates/
  2. 安装根证书:  sudo update-ca-certificates

(更多的命令行参数及说明, 请查看: man update-ca-certificates)

 

CentOs,

Red Hat Enterprise Linux

查看根证书

 

确认/etc/pki/tls/certs/ca-bundle.crt文件中, 是否存在以下内容: 

  1. DigiCert Global Root CA

Serial Number:  08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a

  1. Baltimore CyberTrust Root

Serial Number: 0x20000b9

安装根证书

  1. 安装根证书管理包软件:  yum install ca-certificates
  2. 打开根证书动态配置开关:  update-ca-trust force-enable
  3. 将DigiCert的根证书文件复制到: /etc/pki/ca-trust/source/anchors/
  4. 安装根证书:  update-ca-trust extract

 (更多的命令行参数及说明, 请查看: man update-ca-trust)

◆ 使用Schannel时, 参考如下操作:

Windows系统上的libcurl使用的TLS引擎是Schannel, 根证书的导入可以参考C#章节。

3.C#

在windows服务器上的C#开发语言或者, 通常使系统自带Schannel(别名: Secure Channel 或者 WinSSL)发起HTTPS请求, 权威机构的根证书由Windows操作系统集中管理。

可通过以下步骤来确认操作系统中是否内置了根证书 :

步骤一: 打开mmc(在搜索程序中输入mmc,然后回车)进入如下界面:

步骤二: 在”文件”中选择 “添加/删除管理单元”:

步骤三: 在“添加/删除管理单元”中选择”证书”, 双击后选择 “计算机账户”和”本地计算机”:

选择证书, 点击添加:

步骤四: 点击完成后, 可以看到如下界面. 右键单击”受信任的根证书颁发机构”:

步骤五: 选中查找证书, 搜索”证书序列号”为“08 3b e0 56 90 42 46 b1 a1 75 6a c9 59 91 c7 4a” 或者” 02 00 00 b9” 如果有结果输出, 则表明操作系统中已经内置了DigiCert的根CA证书

如果操作系统中, 没有内置DigiCert根CA证书的话. 可以通过以下步骤安装:

步骤一:双击根证书文件,“安装证书”:

步骤二:在弹出证书导入向导中,如右图所示, 点击下一步:

步骤三:在“选择证书存储”对话框中选择“受信任的根证书颁发机构”,点击确定

步骤四:点击“完成”,系统提示”导入成功”。导入成功后, 可以按照前面介绍方法确认系统中DigiCert根证书

4.其它语言

请参考对应的TLS/SSL库相关手册。