检查密钥库中的证书是否有效
我试图启用 Kafka 的 Helm chart 的 TLS,但失败了。
无法找到预期的Java密钥库文件(JKS)!在使用Kafka Bitnami Helm图表启用TLS加密时,它们是必需的。
我认为这个错误(或者这种方法是错的),但是我决定自己分析上一次使用openssl和keytool创建密钥库的脚本,并验证一下我所存储的KeyStore是否正确。
政策与行动计划
-
- 提取Keystore中的服务器证书
-
- 提取Keystore中的私钥
- 通过openssl的server s_client子命令来验证是否可以进行实际通信。
提取服务器证书
$ keytool -keystore kafka-0.keystore.jks -export -alias localhost -rfc -file signed_exported.crt
Enter keystore password:
Certificate stored in file <signed_exported.crt>
提取私钥
首先,找到私钥的别名。
$ keytool -list -v -keystore kafka-0.keystore.jks -storepass cooder01
:
Alias name: localhost
Creation date: Jan 10, 2021
Entry type: PrivateKeyEntry
Certificate chain length: 2
:
看起来localhost是密钥对的别名。虽然有点麻烦,但可以通过以下方法完成。
创建一个 pkcs12 格式的密钥库。
$ keytool -importkeystore -srckeystore kafka-0.keystore.jks -destkeystore keystore.p12 -deststoretype PKCS12 -srcalias localhost -deststorepass PASSWORD -destkeypass PASSWORD
从 pkcs12 密钥库中导出私钥。
openssl pkcs12 -in keystore.p12 --nodes -nocerts -out key.pem
启动服务器
可以使用OpenSSL工具启动服务器。使用导出的证书和私钥来启动服务器。
openssl s_server -cert signed_exported.crt -key key.pem
正在本地运行。
$ lsof -i:4433 -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
openssl 19336 ushio 3u IPv6 460263 0t0 TCP *:4433 (LISTEN)
启动客户端
我本以为这会失败(因为是自证明书),果然失败了。如预料的那样。
$ openssl s_client -connect localhost:4433
:
Start Time: 1610343426
Timeout : 7200 (sec)
Verify return code: 21 (unable to verify the first certificate)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
那么,我只需找到添加CA证书的选项,然后按照以下步骤连接应该就可以了。
$ openssl s_client -connect localhost:4433 -CAfile ca.crt.exported
Start Time: 1610344811
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
hello
服务器也收到了。
Shared ciphers:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA
Signature Algorithms: ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA512:Ed25519:Ed448:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA+SHA256:RSA+SHA384:RSA+SHA512:ECDSA+SHA224:RSA+SHA224:DSA+SHA224:DSA+SHA256:DSA+SHA384:DSA+SHA512
Shared Signature Algorithms: ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA512:Ed25519:Ed448:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA+SHA256:RSA+SHA384:RSA+SHA512:ECDSA+SHA224:RSA+SHA224
Supported Elliptic Groups: X25519:P-256:X448:P-521:P-384
Shared Elliptic groups: X25519:P-256:X448:P-521:P-384
CIPHER is TLS_AES_256_GCM_SHA384
Secure Renegotiation IS supported
hello
总结
OpenSSL工具可以轻松创建和测试简易服务器和客户端,非常方便。