在设置kafka 使用ssl 中如下的shell脚本
#!/bin/bash
#Step 1
keytool -keystore server.keystore.jks -alias localhost -validity 365 -keyalg RSA -genkey
#Step 2
openssl req -new -x509 -keyout ca-key -out ca-cert -days 365
keytool -keystore server.truststore.jks -alias CARoot -import -file ca-cert
keytool -keystore client.truststore.jks -alias CARoot -import -file ca-cert
#Step 3
keytool -keystore server.keystore.jks -alias localhost -certreq -file cert-file
openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days 365 -CAcreateserial -passin pass:test1234
keytool -keystore server.keystore.jks -alias CARoot -import -file ca-cert
keytool -keystore server.keystore.jks -alias localhost -import -file cert-signed
大致意思是kafka服务端创建秘钥对,然后由CA签名,客户端服务端均信任CA,之后就可以SSL通信
其实这里有两个问题有所困扰
第一个问题在于客户端如果手头有若干个证书,如果挑选哪个证书,第二个就是在客户端仅有CA证书(也就是CA公钥)的情况下是如何拿到服务端公钥的。
所有问题可以根据如下SSL流程解答,第一个为非秘钥协商的,第二个是带有秘钥协商的
不带秘钥协商的
第二个是带有秘钥协商的
可以看到首先在请求服务端的SSL请求之后,服务端是发送CA证书,签发机构和自己的公钥的,这样就全部解决了上述的问题。
同样这样的过程可以防止中间人攻击。
就算中间人把所有公钥和证书截掉作为中间人攻击的方式,返回来的没有私钥就没有任何用。这就防止了中间人攻击