kafka双向ssl身份验证



我正在尝试设置双向ssl身份验证。我的要求是经纪人应该只认证特定的客户。

我的组织有一个CA,它以pkcs12格式颁发所有证书。我遵循的步骤如下。

  1. 获取代理的证书,并在代理密钥库中进行配置
ssl.keystore.location=/home/kafka/certificate.p12
ssl.keystore.password=xxxxx
ssl.client.auth=required
  1. 为客户端获取证书并在客户端密钥库中进行配置
ssl.keystore.location=/home/kafka/certificate.p12
ssl.keystore.password=xxxxx
  1. 使用keytool命令从客户端证书中提取公共证书
keytool -export -file cert -keystore certificate.p12 -alias "12345" -storetype pkcs12 -storepass xxxxx
  1. 将证书导入broker信任库。broker信任库仅包含客户端12345证书
keytool -keystore truststore.p12 -import -file cert -alias 12345 -storetype pkcs12 -storepass xxxxx -noprompt
  1. 在代理中配置了信任库
ssl.truststore.location=/home/kafka/truststore.p12
ssl.truststore.password=xxxxx
  1. 在客户端中配置了信任库。客户端信任库包含CA证书
ssl.truststore.location=/etc/pki/java/cacerts
ssl.truststore.password=xxxxx

当我运行代理和客户端时,我希望代理对客户端进行身份验证并建立ssl连接。而是引发以下错误。

[2021-06-03 23:32:06,864] ERROR [AdminClient clientId=adminclient-1] Connection to node -1 (abc.com/10.129.140.212:9093) failed authentication due to: SSL handshake failed (org.apache.kafka.clients.NetworkClient)
[2021-06-03 23:32:06,866] WARN [AdminClient clientId=adminclient-1] Metadata update failed due to authentication error (org.apache.kafka.clients.admin.internals.AdminMetadataManager)
org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed
Caused by: javax.net.ssl.SSLProtocolException: Unexpected handshake message: server_hello

我尝试了各种方法,但似乎都不起作用。当我用仅包含CA证书的/etc/pki/java/cacerts信任库文件替换broker信任库时那么它工作得很好。但是它将认证具有CA颁发的证书的任何客户端。

问题出在哪里?

默认格式为jks,

使用keytool创建一个带有证书和密钥的Java KeyStore(JKS(,供Kafka使用。系统将提示您为生成的文件创建新密码,并输入上一步中PKCS12文件的密码。请保留新的JKS密码,以便在下面的配置中使用。

$keytool-importkeystore-srckeystore server.p12-destkeystore kafka.server.keystore.jks-srcstoretype pkcs12-别名myserver.internal.net

注意:忽略keytool的以下警告是安全的。

JKS密钥库使用专有格式。建议迁移到PKCS12,它是一种工业标准格式;keytool-importkeystore-srckeystore server.p12-destkeystore kafka.server.keystore.jks-srcstoretype pkcs12";

最新更新