如何生成测试用kafka服务端和客户端证书

在前面的例子中,我们介绍了如何配置kafka服务端和客户端的SSL链接。

这个前提必须得有证书,如果已经有证书了,或者有现成的CA,那么可以自行签出证书即可;如果没有证书也没有CA服务器,那么必须生成一套测试用证书。

这里我们介绍如何使用openssl生成一套测试kafak ssl链接的证书,包括服务端和客户端的truststore和keystore,以及作为golang客户端使用的PEM格式证书。

第一步:生成一个CA根证书

1.1 生成一个CA的私钥

# generate ca key
openssl genpkey -algorithm RSA -out ca.key

1.2 根据CA的私钥,生成一份自签名的CA根证书

# generate self-signed ca certificate
openssl req -new -x509 -days 365 -key ca.key -out ca.pem \
  -subj "/C=cn/O=mycomp/OU=myorg/CN=ca/[email protected]"

第二步:生成服务端证书

2.1 生成服务端私钥

# generate server key
openssl genpkey -algorithm RSA -out server.key

2.2 生成服务端证书CSR

# generate server certificate signing request
openssl req -new -nodes -days 365 -key server.key -out server.csr \
  -subj "/C=cn/O=mycomp/OU=myorg/CN=server/[email protected]"

2.3 使用前面生成的CA根证书对服务端的CSR签名,生成服务端证书

# generate server certificate
openssl x509 -req -days 365 \
  -in server.csr -out server.pem \
  -CA ca.pem -CAkey ca.key -CAcreateserial

第三步:生成客户端证书

3.1 生成客户端私钥

# generate client key
openssl genpkey -algorithm RSA -out client.key

3.2 生成客户端证书CSR

# generate client certificate signing request
openssl req -new -nodes -days 365 -key client.key -out client.csr 、
  -subj "/C=CN/O=mycomp/OU=myorg/CN=client/[email protected]"

3.3 使用前面生成的CA根证书对客户端的CSR签名,生成客户端证书

# generate client certificate
openssl x509 -req -days 365 -in client.csr -out client.pem \
  -CA ca.pem -CAkey ca.key -CAcreateserial

第四步:检查生成的服务端和客户端证书

openssl x509 -noout -text -in server.pem
openssl x509 -noout -text -in client.pem

第五步:生成truststore

因为服务端和客户端使用同一个CA签发的证书,所以在此服务端和客户端使用同一个truststore就可以了,即truststore只包含一个此CA证书信息。

# generate server/client truststore
keytool -import -noprompt -file ca.pem \
  -keystore truststore.jks -storepass test1234

第六步:生成服务端keystore

6.1 生成服务端的P12格式证书

# generate server p12
openssl pkcs12 -export \
  -in server.pem -inkey server.key \
  -out server.p12 -passout pass:test1234

6.2 生成服务端的JKS格式证书

# generate server jks
keytool -importkeystore 、
  -srckeystore server.p12 -srcstoretype PKCS12 \
  -destkeystore server.keystore.jks \
  -srcstorepass test1234 -deststorepass test1234

第七步:生成客户端keystore

7.1 生成服务端的P12格式证书

# generate client p12
openssl pkcs12 -export \
  -in client.pem -inkey client.key -out client.p12 \
  -passout pass:test1234

7.2 生成服务端的JKS格式证书

# generate client jks
keytool -importkeystore \
  -srckeystore client.p12 -srcstoretype PKCS12 \
  -destkeystore client.keystore.jks \
  -srcstorepass test1234 -deststorepass test1234

第八步:验证JKS证书的内容

keytool --list -keystore client.keystore.jks -storepass test1234
keytool --list -keystore server.keystore.jks -storepass testr1234
keytool --list -keystore truststore.jks -storepass test1234

第九步:更改访问主机域名

在前面步骤中,我们生成的服务端和客户端的证书里面配置了证书subject的CN域为'server'和'client',在SSL验证主机名的时候就要求主机的名字必须是server和client,否则SSL验证就会报失败。

这个结果就是这个证书必须在主机名为server/client的机器上使用,不能在其他机器上使用。这个限制可不好,所以SSL标准定义了证书扩展属性SAN(Subject Alternative Name),这是SSL 标准 x509 中定义的一个扩展,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。

具体怎么操作:
9.1 首先配置openssl.cnf

[ CA_default ]
...
# Extension copying option: use with caution.
copy_extensions = copy

[ req ]
...
req_extensions = v3_req # The extensions to add to a certificate request

[ v3_req ]
...
# Extensions to add to a certificate request
...
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.kafka.example.com
DNS.2 = *.example.com

9.2 把前面的步骤2.2/2.3/3.2/3.3修改成如下格式,即指定扩展属性的openssl.cnf

# step 2.2: generate server certificate signing request
openssl req -new -nodes -days 365 -key server.key -out server.csr \
  -subj "/C=cn/O=mycomp/OU=myorg/CN=server/[email protected]" \
  -config ./openssl.cnf -extensions v3_req

# step 2.3: generate server certificate
openssl x509 -req -days 365 \
  -in server.csr -out server.pem \
  -CA ca.pem -CAkey ca.key -CAcreateserial \
  -extfile ./openssl.cnf -extensions v3_req

# step 3.2: generate client certificate signing request
openssl req -new -nodes -days 365 -key client.key -out client.csr 、
  -subj "/C=CN/O=mycomp/OU=myorg/CN=client/[email protected]" \
  -config ./openssl.cnf -extensions v3_req

# step 3.3: generate client certificate
openssl x509 -req -days 365 -in client.csr -out client.pem \
  -CA ca.pem -CAkey ca.key -CAcreateserial \
  -extfile ./openssl.cnf -extensions v3_req

9.3 如何不想修改openssl.cnf,也可以直接使用命令行的方式

# step 2.2: generate server certificate signing request
openssl req -new -nodes -days 365 -key server.key -out server.csr \
  -subj "/C=cn/O=mycomp/OU=myorg/CN=server/[email protected]" \
  -reqexts SAN \
  -config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:*.kafka.example.com,DNS:*.example.com"))

# step 2.3: generate server certificate
openssl x509 -req -days 365 \
  -in server.csr -out server.pem \
  -CA ca.pem -CAkey ca.key -CAcreateserial \
  -extensions SAN \
  -extfile <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:*.kafka.example.com,DNS:*.example.com"))

# step 3.2: generate client certificate signing request
openssl req -new -nodes -days 365 -key client.key -out client.csr 、
  -subj "/C=CN/O=mycomp/OU=myorg/CN=client/[email protected]" \
  -reqexts SAN \
  -config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:*.kafka.example.com,DNS:*.example.com"))

# step 3.3: generate client certificate
openssl x509 -req -days 365 -in client.csr -out client.pem \
  -CA ca.pem -CAkey ca.key -CAcreateserial \
  -extensions SAN \
  -extfile <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:*.kafka.example.com,DNS:*.example.com"))

你可能感兴趣的:(如何生成测试用kafka服务端和客户端证书)