keytool檢視和匯入證書,使用 jre 發行包中的 cacerts 操作方法

oktokeep發表於2024-08-09

keytool檢視和匯入證書,使用 jre 發行包中的 cacerts 操作方法

接上篇
支付寶呼叫介面openapi CY24螞蟻集團網站新根證書升級說明
https://www.cnblogs.com/oktokeep/p/18331448

本地執行測試類報錯:
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

使用 jre 發行包中的 cacerts
cacerts 檔案是 Java 環境預設使用的信任根證書庫,位於 %JAVA_HOME%/lib/security/目錄下,cacerts 檔案本質是一個JKS (Java KeyStore),可使用 Java 發行包中自帶的 keytool 工具來檢視和修改,預設密碼為“changeit”

關鍵:需要定位到檔案cacerts的當前目錄下: D:\Program Files\Java\jdk1.8.0_11\jre\lib\security
命令如下:
keytool -list -v -keystore cacerts > mycacerts.txt

DEMO1

D:\Program Files\Java\jdk1.8.0_11\jre\lib\security>keytool -list -v -keystore cacerts > mycacerts.txt
輸入金鑰庫口令:  changeit

Warning:
<thawtepremiumserverca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<thawteserverca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<equifaxsecureebusinessca1> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<thawtepersonalfreemailca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<equifaxsecureca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<secomvalicertclass1ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<equifaxsecureglobalebusinessca1> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisignclass3ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisignclass1ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisignclass3g2ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<gtecybertrustglobalca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisigntsaca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<valicertclass2ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisignclass2g2ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<entrustsslca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisignclass1g2ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。

匯出的mycacerts.txt是否包含搜素關鍵字 "DigiCert Global Root G2"
如果沒有查詢到怎麼處理
方案1 : 新增根證書到 cacerts
keytool -keystore cacerts -importcert -alias DigiCertGlobalRootG2With2024 -file D:/alipayG2/DigiCertGlobalRootG2.crt.pem

DigiCertGlobalRootG2.crt.pem檔案的下載地址:https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem

DEMO2

 D:\Program Files\Java\jdk1.8.0_11\jre\lib\security>keytool -keystore cacerts -importcert -alias DigiCertGlobalRootG2With2024 -file D:/alipayG2/DigiCertGlobalRootG2.crt.pem
輸入金鑰庫口令:
所有者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
釋出者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
序列號: 33af1e6a711a9a0bb2864b11d09fae5
生效時間: Thu Aug 01 20:00:00 CST 2013, 失效時間: Fri Jan 15 20:00:00 CST 2038
證書指紋:
         SHA1: DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4
         SHA256: CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F
簽名演算法名稱: SHA256withRSA
主體公共金鑰演算法: 2048 位 RSA 金鑰
版本: 3

擴充套件:

#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  DigitalSignature
  Key_CertSign
  Crl_Sign
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 4E 22 54 20 18 95 E6 E3   6E E6 0F FA FA B9 12 ED  N"T ....n.......
0010: 06 17 8F 39                                        ...9
]
]

是否信任此證書? [否]:  y
證書已新增到金鑰庫中

方案2 : 升級JDK版本
正常情況下 JDK 1.6.05 及以上版本的 cacerts 應已經包含了 DigiCert Global Root CA,JDK 1.8.0 131+ 及以上版本的 cacerts 應已經包含了 DigiCert Global Root G2


匯入之後,重新查詢

DEMO3

D:\Program Files\Java\jdk1.8.0_11\jre\lib\security>keytool -list -v -keystore cacerts > mycacertsV2.txt
輸入金鑰庫口令:  changeit

Warning:
<thawtepremiumserverca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<thawteserverca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<equifaxsecureebusinessca1> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<thawtepersonalfreemailca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<equifaxsecureca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<secomvalicertclass1ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<equifaxsecureglobalebusinessca1> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisignclass3ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisignclass1ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisignclass3g2ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<gtecybertrustglobalca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisigntsaca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<valicertclass2ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisignclass2g2ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<entrustsslca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。
<verisignclass1g2ca> 使用的 1024 位 RSA 金鑰 被視為存在安全風險。此金鑰大小將在未來的更新中被禁用。

匯出的mycacertsV2.txt是否包含搜素關鍵字 "DigiCert Global Root G2",這次搜尋到了,內容如下:

摘要資訊如下:
別名: digicertglobalrootg2with2024
建立日期: 2024-8-8
條目型別: trustedCertEntry

所有者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
釋出者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
序列號: 33af1e6a711a9a0bb2864b11d09fae5
生效時間: Thu Aug 01 20:00:00 CST 2013, 失效時間: Fri Jan 15 20:00:00 CST 2038
證書指紋:
	 SHA1: DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4
	 SHA256: CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F
簽名演算法名稱: SHA256withRSA
主體公共金鑰演算法: 2048 位 RSA 金鑰
版本: 3

再次執行測試類,執行正常不報錯了。

private static AlipayClient ac = null;

    /**
     * Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
     * @return
     */
    public static com.alipay.api.AlipayClient getAlipayClient(){
        if(ac == null){
//            com.alipay.api.AlipayClient alipayClient = new com.alipay.api.DefaultAlipayClient("https://openapi.alipay.com/gateway.do","you appid",prv_key,"JSON","utf-8",pub_key,"RSA2");
            com.alipay.api.AlipayClient alipayClient = new com.alipay.api.DefaultAlipayClient("https://openapi-with-g2-only.alipay.com/gateway.do","you appid",prv_key,"JSON","utf-8",pub_key,"RSA2");
            ac = alipayClient;
        }
        return ac;
    }

最後測試下高版本的jdk C:\Program Files\Java\jdk1.8.0_333 是否包含該根證書。
D:\Program Files\Java\jdk1.8.0_11\jre\lib\security>java -version
java version "1.8.0_421"
Java(TM) SE Runtime Environment (build 1.8.0_421-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.421-b09, mixed mode)

檢視環境變數的配置,JAVA_HOME路徑。

C:\Program Files\Java\jdk1.8.0_333\jre\lib\security>keytool -list -v -keystore cacerts > mycacertsV3.txt
拒絕訪問。

使用PowerShell客戶端來訪問。 >> cmd 出現在列表中,然後按下 Ctrl + Shift + Enter 快捷鍵,開啟管理員許可權的dos命令視窗

DEMO4

C:\Program Files\Java\jdk1.8.0_333\jre\lib\security>keytool -list -v -keystore cacerts > mycacertsV3.txt
輸入金鑰庫口令:  changeit

匯出的mycacertsV3.txt是否包含搜素關鍵字 "DigiCert Global Root G2",這次搜尋到了,內容如下:

別名: digicertglobalrootg2 [jdk]
建立日期: 2016-8-25
條目型別: trustedCertEntry

所有者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
釋出者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
序列號: 33af1e6a711a9a0bb2864b11d09fae5
生效時間: Thu Aug 01 20:00:00 CST 2013, 失效時間: Fri Jan 15 20:00:00 CST 2038
證書指紋:
	 SHA1: DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4
	 SHA256: CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F
簽名演算法名稱: SHA256withRSA
主體公共金鑰演算法: 2048 位 RSA 金鑰
版本: 3

相關文章