Connecting Securely Using SSL–官方文档,演示使用
上面文章里
“Setting up Server Authentication” 就是在客户端设置认证mysql服务器,
“Setting up Client Authentication” 就是在客户端设置被mysql服务器认证自己这个客户端,双向认证时候用
从mysql服务器的data目录下载,ca.pem 单向ssl认证,只要这一个文件
client-cert.pem,client-key.pem 这两个client文件是在需要双向ssl认证的时候需要
# 将ca证书导入, 生成truststore.jks
keytool -import -alias mysqlCACert -file ca.pem -storepass 123456 -keystore truststore.jks
# java连接
System.setProperty("javax.net.ssl.trustStore", "truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");
jdbc:mysql://192.168.180.121:3306?useUnicode=true&characterEncoding=UTF8&verifyServerCertificate=true&useSSL=true&requireSSL=true&sslMode=VERIFY_IDENTITY
sslMode的值:PREFERRED,REQUIRED, VERIFY_CA, or VERIFY_IDENTITY
双向认证时候
# 先用openssl把client-cert.pem,client-key.pem合并为格式 PKCS #12 的一个文件,相当于打个zip包,放在一起
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:mypassword -out client-keystore.p12
# 利用上面的client-keystore.p12生成keystore
keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -srcstorepass mypassword -destkeystore keystore -deststoretype JKS -deststorepass mypassword
# java使用
System.setProperty("javax.net.ssl.keyStore","keystore");
System.setProperty("javax.net.ssl.keyStorePassword","mypassword");
打开java连接时候的debug日志,给jvm加参数 -Djavax.net.debug=all
keytool -v -list -keystore truststore.jks
keytool -printcert -file certificate.pem
如果ca.pem里面是多个证书合成的证书链,需要手动分割为每个文件,一个个导入,alias就是取个别名
truststore里的匹配证书规则:会根据证书的Subject(主体,证书所有者)查找,然后根据这个证书的Issuer(发布者,签发这个证书的上层ca),直到找到Subject与Issuer完全一致的root,顶级ca,就是root根证书