前言
因为工作中上层领导发话,保密级别高的数据库交互需要用SSL连接,然后集体懵逼了,都没有弄过,问过自己的朋友也都没搞过这些,网上找的案例总是失败,最后参照MySql官网终于打通了x509的连接,接下来上实例
将客户端密钥和证书文件转换为 PKCS #12 存档
首先准备好client-cert.pem和client-key.pem文件(客户端发起SSL连接的依据),然后文件目录下执行以下指令,如果windows系统没有安装openssl可以下载安装或着在linux上执行,然后download生成的p12文件
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:mypassword -out client-keystore.p12
将客户端密钥和证书导入 Java 密钥库:
Windows系统下进入安装jdk的bin目录下(或者将client-keystore.p12文件复制到bin目录)运行以下指令得到keystore文件,并设置密码为mypassword
keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -srcstorepass mypassword -destkeystore keystore -deststoretype JKS -deststorepass mypassword
client-keystore.p12如果在其他文件夹需要指定文件路径
windows运行如果出现以下异常信息,需要下载新的jdk,作者下载的是jdk16
keytool 错误: java.io.IOException: parseAlgParameters failed: ObjectIdentifier() -- data isn't an object ID (tag = 48)
将生成的keystore文件上传到服务器
配置连接
这是最后一步,可以通过三种方式实现:
1.使用 Java 命令行参数
-Djavax.net.ssl.keyStore=path_to_keystore_file
-Djavax.net.ssl.keyStorePassword=mypassword
2.直接在客户端代码中设置系统属性:
System.setProperty("javax.net.ssl.keyStore","keystore文件路径");
System.setProperty("javax.net.ssl.keyStorePassword","mypassword");
3.通过 Connector/J 连接属性:
clientCertificateKeyStoreUrl=file:生成的keystore路径
clientCertificateKeyStorePassword=mypassword
4.jdbc链接拼接
return "&useSSL=true&verifyServerCertificate=false&requireSSL=true&clientCertificateKeyStoreUrl=file:"+po.getKeystoreUrl()+"&clientCertificateKeyStorePassword="+po.getKeystorePassword();