1. 概述
在网络通信中,SSL 协议 通常是应用与客户端之间安全通信的首选方案。除了对数据进行加密外,SSL 还要求在握手阶段交换非对称密钥,以建立安全连接。
通常,应用会通过 X.509 证书 的形式共享这些非对称密钥。因此,在 SSL 握手之前,客户端需要将这些证书导入自己的信任库(truststore)文件中。
本文将介绍几种可以将 .cer
格式的证书导入客户端信任库的工具。
2. 使用 keytool
命令
JDK 自带了一个名为 keytool 的工具,可用于管理 Java 密钥库(JKS)。它最常见的用途之一是为测试 SSL 通信生成自签名的 X.509 证书。
我们也可以将自签名或由 CA 签发的证书导入到 JKS 文件中,并将其作为信任库使用:
keytool -importcert -alias trustme -file baeldung.cer -keystore cacerts
Enter keystore password:
Trust this certificate? [no]: yes
Certificate was added to keystore
这里我们使用 keytool
命令导入了一个名为 baeldung.cer
的自签名证书。该证书可以被导入到任意 Java 密钥库中。例如,上面这个示例是将证书添加到了 JDK 中的 cacerts
密钥库中。
如果查看密钥库中的证书列表,可以看到名为 trustme
的别名:
keytool -list -keystore cacerts
trustme, Oct 31, 2020, trustedCertEntry,
Certificate fingerprint (SHA1): 04:40:6C:B0:06:65:EE:80:9A:90:A5:E9:DA:19:05:4A:AA:F2:CF:A4
3. 使用 openssl
命令
到目前为止,我们讨论的都是将证书导入到 JKS 文件中。但这类密钥库仅适用于 Java 应用。如果需要在其他语言中实现 SSL 库,或在多个语言平台间共享证书,那么更常使用的是 PKCS12 格式的密钥库。
要将证书导入 PKCS12 格式的密钥库,我们可以使用 openssl:
openssl pkcs12 -export -in baeldung.cer -inkey baeldung.key -out baeldung.keystore -name trustme
该命令会将名为 baeldung.cer
的证书导入到名为 baeldung.keystore
的密钥库中,并设置别名为 trustme
。
我们可以通过以下命令查看导入的证书:
openssl pkcs12 -info -in baeldung.keystore
Enter Import Password:
MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
friendlyName: trustme
localKeyID: F4 36 4E 19 E4 E4 E7 65 74 56 FB 50 40 02 68 8B EC F0 4D B3
subject=C = IN, ST = DE, L = DC, O = BA, OU = AU, CN = baeldung.com
issuer=C = IN, ST = DE, L = DC, O = BA, OU = AU, CN = baeldung.com
-----BEGIN CERTIFICATE-----
MIIFkTCCA3mgAwIBAgIUL/OjGExnppeZkiNNh0i2+TPHaCQwDQYJKoZIhvcNAQEL
BQAwWDELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAkRFMQswCQYDVQQHDAJEQzELMAkG
A1UECgwCQkExCzAJBgNVBAsMAkFVMRUwEwYDVQQDDAxiYWVsZHVuZy5jb20wHhcN
MjAxMTAzMTIwMjI5WhcNMjExMTAzMTIwMjI5WjBYMQswCQYDVQQGEwJJTjELMAkG
A1UECAwCREUxCzAJBgNVBAcMAkRDMQswCQYDVQQKDAJCQTELMAkGA1UECwwCQVUx
FTATBgNVBAMMDGJhZWxkdW5nLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBAK/XF/xmqQRJlTx2Vtq70x1KFwkHJEcZOyFbQP7O9RgicvMTAnbZtKpS
BSVjwroklIr4OVK4wmwdaTnlIm22CsFrbn+iBVL00tVs+sBYEcgO5nphVWGFbvHl
Q3PO4vTedSyH1qIyYrrhAn8wYvzdmr2g6tRwBX8K5H948Zb32Xbp5r9aR5M2i8Qz
fc0QasJUM5b71TNt8Qcsru3pFKj5hUMBTNrGCQrr6vrADTcG0YHuVSMeJId7f67h
l0vEY0BmRPnWNwGe+Sg/jqOWH9WWvkk/umkEQNWCQZaXZNZZ8jl5WMKFnmA7sPQ+
UjZPabNOTxhz6fJv5nJu7aMS/6tUWO0SdQ+ctO3HgR42wtBPoEOOuFMP6OqHI4hf
CXFTYg6aLwxFJP7LngfRvETgzVlsb9L/m++JBeoWRqpWaQUEgxDYJGFGA5dwQJaf
f24d042i44X0WqBBoWLjSQd/JFVH5MF17waiYpxFBOgpz3XEM/1j+juJPVut2k96
3ecgR54iKILbibizPUojn7t3AFT1Ug8exdefHdf+QsL8/L5+8/xOYkp/pnglQJJl
W0Lq4Sh9LWiux9XVdY6n2UYf/crgLSHatVkPa26cysdXhiiEPn4yYr2AdYVf0Xr5
W5PULufdi0HW2Eja/TfeXoBQtkdidqP8SMW+DwqafX80s37bZZBvAgMBAAGjUzBR
MB0GA1UdDgQWBBQPHIpCFhAy3kGAbzHpXMjXCMVQRzAfBgNVHSMEGDAWgBQPHIpC
FhAy3kGAbzHpXMjXCMVQRzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUA
A4ICAQBzOK52I7lDX+7CHy6cQ8PnLZjAD4S5qC1P9dMy50E9N6Tmw2TiPbWl9CnU
7a/kVO6xDJDmNMnqRbHmlZclJaTFv6naXSX27PdIWjhwAfLjNa+FO9JNwMgiP25I
ISVjyrA3HwbhFnMs5FyBW9hbxfQ+X2Q2ooa+J3TKU7FImuDRKF3Sdb63+/j0go8S
5/TsoYpQxg86xbWf6IYGYwegd2SPSWUZ0HQSobZ7fRA7Y0EyPKgyqsBbmDtJ+X1g
P8Kep4N1oocc7ZkkX4pNfXTgXib9fUkKMAfRJz8w62z8I1OM61bciW7V2VSp/Y5p
iTihyuwO0aHG+YTnsr3qFrSFQLQUjCeBvx+euQelsGm8W9xM9YfASXiaEwCmb9PO
i/umD70J1e0HFDay9FW6mMoCCEBTZIF9ARqzhHgg9fi9iH2ctrsxadFAlOTFp5+/
p+nxrencfvc4CP6aHoqkE45HpMBoNDAxRMVd/FRzIG2as0q5At873MNFXP6WxmQV
4KGIhteNLyrXk82yHdHfm1EENTI7OEst/Fc8O3fFy9wn0OvoHIuCv1FVCq4Gnjmq
vNnBnGldrYruCNvj5KT6U14FFdK/5Zng0nSky4oMTs49zt392bdYi31SHWeATdw/
PscFRdig2stoI8ku6R+K7XvmseGzPmUW4K2IWU0zdRP2a4YyvA==
-----END CERTIFICATE-----
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Bag Attributes
friendlyName: trustme
localKeyID: F4 36 4E 19 E4 E4 E7 65 74 56 FB 50 40 02 68 8B EC F0 4D B3
Key Attributes: <No Attributes>
✅ 成功将证书导入到了 PKCS12 格式的密钥库中。这意味着这个密钥库现在可以作为 SSL 客户端应用(如 HTTP 客户端库)的信任库文件使用。同样地,它也可以作为 SSL 服务端应用(如 Tomcat)的密钥库使用。
4. 总结
本文介绍了两个常用的 SSL 工具:OpenSSL 和 Java Keytool。我们分别使用 keytool
和 openssl
命令将 .cer
格式的证书导入到了 JKS 和 PKCS12 格式的密钥库中。
选择哪种格式取决于你的应用场景。对于纯 Java 环境,JKS 更常见;而跨语言或需要更高兼容性时,PKCS12 是更稳妥的选择。