更新时间:2025-08-21 GMT+08:00

制作和替换Kafka JKS格式的SSL证书

SSL证书的作用是在客户端和Kafka实例进行数据传输时对数据加密传输,提高了数据的安全性。

Kafka客户端连接开启密文接入且Kafka安全协议为“SASL_SSL”的Kafka实例时,您可以使用分布式消息服务Kafka版提供的证书,也可以使用自己制作的证书。如果使用自己制作的证书,请参考本章节将分布式消息服务Kafka版提供的证书替换为自己的证书。

制作并替换证书为白名单特性,需要联系后台管理人员开通后方可使用。所有region都可以通过白名单开通此特性。

步骤一~步骤四主要介绍如何制作适用于未开启证书域名校验场景的SSL证书,并完成证书替换操作。如果您需要制作适用于开启证书域名校验场景的SSL证书,请参考(可选)制作和替换开启证书域名校验的SSL证书

约束与限制

替换证书将重启实例,请谨慎操作。

前提条件

  • 已准备一台Linux系统的服务器,并安装Java Development Kit 1.8.111或以上版本,配置JAVA_HOME与PATH环境变量。
  • 实例已开启Kafka SASL_SSL。
  • (可选)如果制作开启证书域名校验的SSL证书,请在Kafka实例详情页的“连接信息”中获取连接地址。

步骤一:制作证书

  1. 登录Linux系统的服务器,执行以下命令,生成server.keystore.jks证书。

    keytool -genkey -keystore server.keystore.jks -alias localhost -validity 3650 -keyalg RSA

    按照提示信息输入keystore密码,并记录此密码,此密码在后续步骤中会使用。

    密码需要满足如下要求:

    • 8~32个字符。
    • 至少包含以下字符中的3种:大写字母、小写字母、数字、特殊字符`~!@#$%^&*()-_=+\|[{}]:'",<.>/?和空格,并且不能以-开头。
    • 非弱密码(如果不能确定哪些是弱密码,请在替换证书对话框中输入密码,系统会自动判定是否为弱密码)。

    按照提示信息输入证书拥有者的信息,包含姓名、单位、组织名称、所在城市、所在省、所在国家,示例如下。

    [root@ecs-kafka ~]# keytool -genkey -keystore server.keystore.jks -alias localhost -validity 3650 -keyalg RSA
    Enter keystore password:  
    Re-enter new password: 
    What is your first and last name?
      [Unknown]:  Tom
    What is the name of your organizational unit?
      [Unknown]:  test
    What is the name of your organization?
      [Unknown]:  test01
    What is the name of your City or Locality?
      [Unknown]:  nj
    What is the name of your State or Province?
      [Unknown]:  js
    What is the two-letter country code for this unit?
      [Unknown]:  xx
    Is CN=Tom, OU=test, O=test01, L=nj, ST=js, C=xx correct?
      [no]:  y

  2. 执行以下命令,创建CA的认证证书。

    openssl req -new -x509 -keyout ca-key -out ca-cert -days 3650

    按照提示信息输入PEM密码,并记录此密码,此密码在后续步骤中会使用。

    密码需要满足如下要求:4~1024个字符。

    按照提示信息输入证书拥有者的信息,包含所在国家、所在省、所在城市、组织名称、单位、姓名、邮箱,示例如下。

    [root@ecs-kafka ~]# openssl req -new -x509 -keyout ca-key -out ca-cert -days 3650
    Generating a RSA private key
    ............................................................................................................................................+++++
    ..........+++++
    writing new private key to 'ca-key'
    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:
    -----
    You are about to be asked to enter information that will be incorporated into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [XX]:xx
    State or Province Name (full name) []:js
    Locality Name (eg, city) [Default City]:nj
    Organization Name (eg, company) [Default Company Ltd]:test01
    Organizational Unit Name (eg, section) []:test
    Common Name (eg, your name or your server's hostname) []:Tom 
    Email Address []:xx
    [root@ecs-kafka ~]#

  3. 执行以下命令,通过CA创建一个服务器的Truststore证书,有了Truststore证书才可以进行证书有效性的检测。

    keytool -keystore server.truststore.jks -alias CARoot -import -file ca-cert

    按照提示信息输入服务器证书的Truststore密码,并记录此密码。此密码在后续步骤中会使用。

    密码需要满足如下要求:

    • 8~32个字符。
    • 至少包含以下字符中的3种:大写字母、小写字母、数字、特殊字符`~!@#$%^&*()-_=+\|[{}]:'",<.>/?和空格,并且不能以-开头。
    • 非弱密码(如果不能确定哪些是弱密码,请在替换证书对话框中输入密码,系统会自动判定是否为弱密码)。
    出现如下提示信息时,输入“y”。
    Trust this certificate?

  4. 执行以下命令,通过CA创建一个客户端的Truststore证书。

    keytool -keystore client.truststore.jks -alias CARoot -import -file ca-cert

    按照提示信息输入客户端证书的Truststore密码,并记录此密码。此密码用于客户端连接Kafka实例时,配置文件中“ssl.truststore.password”参数的值。

    密码需要满足如下要求:

    • 8~32个字符。
    • 至少包含以下字符中的3种:大写字母、小写字母、数字、特殊字符`~!@#$%^&*()-_=+\|[{}]:'",<.>/?和空格,并且不能以-开头。
    • 非弱密码(如果不能确定哪些是弱密码,请在替换证书对话框中输入密码,系统会自动判定是否为弱密码)。
    出现如下提示信息时,输入“y”。
    Trust this certificate?

  5. 执行以下命令,为服务器证书签名。

    1. 导出服务器证书“server.cert-file”。
      keytool -keystore server.keystore.jks -alias localhost -certreq -file server.cert-file

      按照提示信息输入1中设置的keystore密码。

    2. 通过CA给服务器证书进行签名处理。
      openssl x509 -req -CA ca-cert -CAkey ca-key -in server.cert-file -out server.cert-signed -days 3650 -CAcreateserial

      按照提示信息输入2中设置的PEM密码。

    3. 导入CA证书到服务器keystore。
      keytool -keystore server.keystore.jks -alias CARoot -import -file ca-cert

      按照提示信息输入1中设置的keystore密码。

      出现如下提示信息时,输入“y”。
      Trust this certificate?
    4. 将已签名的服务器证书导入到服务器keystore。
      keytool -keystore server.keystore.jks -alias localhost -import -file server.cert-signed

      按照提示信息输入1中设置的keystore密码。

  6. 导出证书“server.keystore.jks”、“server.truststore.jks”和“client.truststore.jks”到本地PC机。

    “server.keystore.jks”和“server.truststore.jks”在后续步骤“替换证书”时,用来替换“Keystore文件”和“Truststore文件”。请将“client.truststore.jks”存放到客户端指定位置中,并记录其存放路径,此路径将作为客户端连接Kafka实例时,配置文件中“ssl.truststore.location”参数的值。
    图1 证书目录

步骤二:替换证书

  1. 登录Kafka控制台
  2. 在管理控制台左上角单击,选择Kafka实例所在的区域。
  3. 单击待替换证书的实例名称,进入实例详情页面。
  4. 在“连接信息 > SSL证书”后,单击“替换”,弹出“替换SSL证书”对话框。

    图2 连接信息

  5. 参考表1,设置替换SSL证书的参数。

    图3 替换SSL证书
    表1 替换SSL证书参数说明

    参数名称

    说明

    Key密码

    输入制作证书中设置的keystore密码

    Keystore密码

    输入制作证书中设置的keystore密码

    Keystore文件

    导入“server.keystore.jks”证书。

    Truststore密码

    输入服务端证书的Truststore密码

    Truststore文件

    导入“server.truststore.jks”证书。

  6. 单击“确定”,弹出“替换SSL证书”对话框。
  7. 单击“确认”,完成证书的替换。

    在“实例管理 > 后台任务管理”页面,替换SSL证书任务的“状态”为“成功”时,表示替换证书成功。

    证书替换成功后,在实例详情页单击“下载”,下载的证书为分布式消息服务Kafka版提供的证书,并非您自己制作的证书。

步骤三:修改客户端配置文件

替换证书后,需要在客户端的“consumer.properties”和“producer.properties”文件中,分别修改“ssl.truststore.location”和“ssl.truststore.password”参数。

security.protocol=SASL_SSL
ssl.truststore.location=/opt/kafka_2.12-2.7.2/config/client.truststore.jks
ssl.truststore.password=axxxb
ssl.endpoint.identification.algorithm=
表2 配置文件参数说明

参数名称

说明

ssl.truststore.location

client.truststore.jks证书的存放路径。

ssl.truststore.password

客户端证书的Truststore密码

ssl.endpoint.identification.algorithm

证书域名校验开关,为空则表示关闭。这里需要保持关闭状态,必须设置为空

步骤四:验证证书是否生效

参考使用客户端连接Kafka(密文接入),生产和消费消息。如果成功,表示替换的证书已生效。

(可选)制作和替换开启证书域名校验的SSL证书

开启证书域名校验后,变更连接实例的地址,例如:内网连接地址变为公网连接地址、公网连接地址变为内网连接地址、扩容代理数量后连接地址增加等,可能会导致客户端连接实例失败。

  1. 登录Linux系统的服务器,执行以下命令,生成server.keystore.jks证书。

    keytool -genkey -keystore server.keystore.jks -alias localhost -validity 3650 -keyalg RSA -ext SAN=IP:xxx.xxx.xx.xx,IP:xxx.xxx.xx.xx,IP:xxx.xxx.xx.xx

    上述命令中的IP地址为Kafka实例连接地址中的IP地址,从前提条件中获取。注意:Kafka实例的连接地址包含IP地址:端口号,例如:192.168.10.10:9093,192.168.10.11:9093,192.168.10.12:9093,上述命令需要修改为:

    keytool -genkey -keystore server.keystore.jks -alias localhost -validity 3650 -keyalg RSA -ext SAN=IP:192.168.10.10,IP:192.168.10.11,IP:192.168.10.12
    1. 执行上述命名后,按照提示信息输入keystore密码,并记录此密码,此密码在后续步骤中会使用。

      密码需要满足如下要求:

      • 8~32个字符。
      • 至少包含以下字符中的3种:大写字母、小写字母、数字、特殊字符`~!@#$%^&*()-_=+\|[{}]:'",<.>/?和空格,并且不能以-开头。
      • 非弱密码(如果不能确定哪些是弱密码,请在替换证书对话框中输入密码,系统会自动判定是否为弱密码)。
    2. 按照提示信息输入证书拥有者的信息,包含姓名、单位、组织名称、所在城市、所在省、所在国家,示例如下。
      [root@ecs-kafka ~]# keytool -genkey -keystore server.keystore.jks -alias localhost -validity 3650 -keyalg RSA -ext SAN=IP:192.168.10.10,IP:192.168.10.11,IP:192.168.10.12
      Enter keystore password:  
      Re-enter new password: 
      What is your first and last name?
        [Unknown]:  Tom
      What is the name of your organizational unit?
        [Unknown]:  test
      What is the name of your organization?
        [Unknown]:  test01
      What is the name of your City or Locality?
        [Unknown]:  nj
      What is the name of your State or Province?
        [Unknown]:  js
      What is the two-letter country code for this unit?
        [Unknown]:  xx
      Is CN=Tom, OU=test, O=test01, L=nj, ST=js, C=xx correct?
        [no]:  y
    3. 按照提示信息按“Enter”,设置key密码与keystore密码一致。
      Enter key password for <localhost>
              (RETURN if same as keystore password):

  2. 执行以下命令,生成CA私钥。

    openssl genrsa -out ca.key 2048

  3. 执行以下命令,生成CA证书。

    openssl req -new -x509 -key ca.key -out ca.crt -days 3650 -subj "/CN=KafkaTestCA"

  4. 执行以下命令,生成服务端证书。

    keytool -keystore server.keystore.jks -alias localhost -certreq -file server.csr -storepass xxx

    “storepass”表示指定密钥库的密码,输入1.a中设置的keystore密码。

  5. 使用CA为服务端证书签名。

    1. 执行以下命令,创建“sans.ext”文件。
      touch sans.ext
    2. 执行以下命令,编辑“sans.ext”文件,添加以下内容。
      vim sans.ext

      添加以下内容。

      subjectAltName=IP:xxx.xxx.xx.xx,IP:xxx.xxx.xx.xx,IP:xxx.xxx.xx.xx

      IP地址为Kafka实例连接地址中的IP地址,从前提条件中获取。

    3. 执行以下命令,使用CA为服务端证书签名。
      openssl x509 -req -CA ca.crt -CAkey ca.key -in server.csr -out server.crt -days 3650 -CAcreateserial -extfile sans.ext
      返回信息如下:
      [root@ecs-kafka ~]# openssl x509 -req -CA ca.crt -CAkey ca.key -in server.csr -out server.crt -days 3650 -CAcreateserial -extfile sans.ext
      Signature ok
      subject=C=xx, ST=js, L=nj, O=test01, OU=test, CN=Tom
      Getting CA Private Key

  6. 导入CA证书到服务器keystore。

    keytool -keystore server.keystore.jks -alias CARoot -import -file ca.crt -storepass xxx -noprompt

    “storepass”表示指定密钥库的密码,输入1.a中设置的keystore密码。

    返回信息如下:
    [root@ecs-kafka ~]# keytool -keystore server.keystore.jks -alias CARoot -import -file ca.crt -storepass xxx -noprompt
    Certificate was added to keystore

  7. 导入服务端证书到服务器keystore。

    keytool -keystore server.keystore.jks -alias localhost -import -file server.crt -storepass xxx -noprompt

    “storepass”表示指定密钥库的密码,输入1.a中设置的keystore密码。

    返回信息如下:

    [root@ecs-kafka ~]# keytool -keystore server.keystore.jks -alias localhost -import -file server.crt -storepass xxx -noprompt
    Certificate reply was installed in keystore

  8. 通过CA创建一个服务器Truststore证书。

    keytool -keystore server.truststore.jks -alias CARoot -import -file ca.crt -storepass xxx -noprompt

    “storepass”表示服务器Truststore证书的密码,根据以下密码要求设置并记录密码,此密码将在后续步骤中使用。

    密码需要满足如下要求:

    • 8~32个字符。
    • 至少包含以下字符中的3种:大写字母、小写字母、数字、特殊字符`~!@#$%^&*()-_=+\|[{}]:'",<.>/?和空格,并且不能以-开头。
    • 非弱密码(如果不能确定哪些是弱密码,请在替换证书对话框中输入密码,系统会自动判定是否为弱密码)。
    返回信息如下:
    [root@ecs-kafka ~]# keytool -keystore server.truststore.jks -alias CARoot -import -file ca.crt -storepass xxx -noprompt
    Certificate was added to keystore

  9. 通过CA创建一个客户端Truststore证书。

    keytool -keystore client.truststore.jks -alias CARoot -import -file ca.crt -storepass xxx -noprompt

    “storepass”表示客户端Truststore证书的密码,根据以下密码要求设置并记录密码,此密码将在后续步骤中使用。

    密码需要满足如下要求:

    • 8~32个字符。
    • 至少包含以下字符中的3种:大写字母、小写字母、数字、特殊字符`~!@#$%^&*()-_=+\|[{}]:'",<.>/?和空格,并且不能以-开头。
    • 非弱密码(如果不能确定哪些是弱密码,请在替换证书对话框中输入密码,系统会自动判定是否为弱密码)。
    返回信息如下:
    [root@ecs-kafka ~]# keytool -keystore client.truststore.jks -alias CARoot -import -file ca.crt -storepass xxx -noprompt
    Certificate was added to keystore

  10. 导出证书“server.keystore.jks”、“server.truststore.jks”和“client.truststore.jks”到本地PC机。

    “server.keystore.jks”和“server.truststore.jks”在后续步骤“替换证书”时,用来替换“Keystore文件”和“Truststore文件”。请将“client.truststore.jks”存放到客户端指定位置中,并记录其存放路径,此路径将作为客户端连接Kafka实例时,配置文件中“ssl.truststore.location”参数的值。

  11. 参考步骤二:替换证书,在Kafka实例控制台替换SSL证书。

    表3 替换SSL证书参数说明

    参数名称

    说明

    Key密码

    输入制作证书中设置的keystore密码

    Keystore密码

    输入制作证书中设置的keystore密码

    Keystore文件

    导入“server.keystore.jks”证书。

    Truststore密码

    输入服务端证书的Truststore密码

    Truststore文件

    导入“server.truststore.jks”证书。

  12. 修改客户端配置文件。

    替换证书后,需要在客户端的“consumer.properties”和“producer.properties”文件中,分别修改“ssl.truststore.location”和“ssl.truststore.password”参数。
    security.protocol=SASL_SSL
    ssl.truststore.location=/opt/kafka_2.12-2.7.2/config/client.truststore.jks
    ssl.truststore.password=axxxb
    ssl.endpoint.identification.algorithm=https
    表4 配置文件参数说明

    参数名称

    说明

    ssl.truststore.location

    client.truststore.jks证书的存放路径。

    ssl.truststore.password

    客户端证书的Truststore密码

    ssl.endpoint.identification.algorithm

    证书域名校验开关,设置为“https”,表示开启证书域名校验。

  13. 验证证书是否生效。

    参考使用客户端连接Kafka(密文接入),生产和消费消息。如果成功,表示替换的证书已生效。