mysql使用SSL连接配置学习(二)
参考:https://www.jianshu.com/p/5bc9a59dcf95
MySQL 开启SSL
# vim /opt/mysqlconfig/mysqld.cnf
添加:
require_secure_transport = ON
ssl-ca = /var/lib/mysql/ca.pem
ssl-cert = /var/lib/mysql/server-cert.pem
ssl-key = /var/lib/mysql/server-key.pem
# ll /opt/mysqldata/*.pem
MySQL 开启SSL,客户端jdbc的几种设置
关于开启 MySQL SSL,客户端dbc的设置分以下几种情况:
1. 服务端开启SSL,配置证书,客户端连服务端,直接信任证书,不用配置证书
2. 服务端开启SSL,配置证书,客户端连服务端,配置单向验证客户端或者服务端证书
3. 服务端开启SSL,配置证书,客户端连服务端,配置双向验证服务端证书和客户端证书
MySQL Server端是 x509 的pem格式证书,怎么跟客户端的 java程序(要连MySQL,jks格式证书)建立证书认证关系?
x509 的 pem格式证书,可以通过转换,变成 jks格式证书。
1. 服务端开启SSL,配置证书,客户端连服务端,直接信任证书,不用配置证书
MySQL驱动
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&verifyServerCertificate=false&requireSSL=true
username=root
MariaDB驱动
driverClassName=org.mariadb.jdbc.Driver
url=jdbc:mariadb://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&trustServerCertificate=true&requireSSL=true
username=root
关于证书信任设置
MySQL: verifyServerCertificate=false
MariaDB: trustServerCertificate=true
当启用SSL加密并设置连接字符串属性trustServerCertificate=false 时需要做些什么,与设置trustServerCertificate=true 有什么区别?
如果当使用安全套接字层 (SSL) 对通信层加密时应自动信任服务器安全套接字层证书,则为“true” , 否则为 false。
此处,我们服务端,不设置证书验证,为自动信任服务器安全套接字层证书。
2. 服务端开启SSL,配置证书,客户端连服务端,配置单向验证客户端或者服务端证书
在 MySQL Server服务器上
# mkdir /root/mysqlSSL
# cp /opt/mysqldata/*.pem /root/mysqlSSL/
# keytool -importcert -alias MySQLCACert -file ca.pem -keystore truststore.jks -storepass [email protected] -noprompt
# keytool -v -list -keystore truststore.jks -storepass "[email protected]"
将 truststore.jks拷贝到客户端 ,假设文件路径为 /opt/cert/truststore.jks
MySQL驱动
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&verifyServerCertificate=true&requireSSL=true&clientCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&clientCertificateKeyStorePassword="[email protected]"
username=root
MariaDB驱动
driverClassName=org.mariadb.jdbc.Driver
url=jdbc:mariadb://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&trustServerCertificate=false&requireSSL=true&clientCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&clientCertificateKeyStorePassword="[email protected]"
username=root
当启用SSL加密并设置连接字符串属性trustServerCertificate=false 时需要做些什么,与设置trustServerCertificate=true 有什么区别?
如果当使用安全套接字层 (SSL) 对通信层加密时应自动信任服务器安全套接字层证书,则为“true” , 否则为 false。
此处,客户端务端设置了证书验证,通过连接字符串属性 clientCertificateKeyStoreUrl=file:/opt/cert/ truststore.jks 和 clientCertificateKeyStorePassword= "[email protected]" 验证服务器安全套接字层证书。
3. 服务端开启SSL,配置证书,客户端连服务端,配置双向验证服务端证书和客户端证书
# keytool -importcert -alias MySQLCACert -file ca.pem -keystore truststore.jks -storepass [email protected] -noprompt
# openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:[email protected] -out client-keystore.p12
# keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -srcstorepass "[email protected]" -destkeystore keystore.jks -deststoretype JKS -deststorepass "[email protected]"
# keytool -v -list -keystore truststore.jks -storepass "[email protected]"
# keytool -v -list -keystore keystore.jks -storepass "[email protected]"
# cat ca.pem
# keytool -export -alias mysqlcacert -keystore truststore.jks --storepass "[email protected]" -rfc
可以看出 ,实际上事将CA证书 ca.pem 导入到了 truststore.jks中。
# cat client-cert.pem
# keytool -export -alias mysqlclient -keystore keystore.jks --storepass "[email protected]" -rfc
可以看出,实际是将 客户端证书 client-cert.pem 导入到了 keystore.jks中,当然也将 客户端私钥 client-key.pem 导入到了keystore.jks中,只是我们没法直接从 keystore.jks 获取私钥内容。
注意: 此处 file:///path/to/file 等价于 file:/path/to/file
将 truststore.jks 和 keystore.jks 拷贝到客户端 ,假设文件路径为 /opt/cert/truststore.jks /opt/cert/keystore.jks
MySQL驱动
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&verifyServerCertificate=true&useSSL=true&requireSSL=true&clientCertificateKeyStoreUrl=file:/opt/cert/keystore.jks&clientCertificateKeyStorePassword="[email protected]"&trustCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&trustCertificateKeyStorePassword="[email protected]"
username=root
MariaDB驱动
driverClassName=org.mariadb.jdbc.Driver
url=jdbc:mariadb://xx.xx.xx.xx:3306/test?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&trustServerCertificate=false&useSSL=true&requireSSL=true&clientCertificateKeyStoreUrl=file:/opt/cert/keystore.jks&clientCertificateKeyStorePassword="[email protected]3"&trustCertificateKeyStoreUrl=file:/opt/cert/truststore.jks&trustCertificateKeyStorePassword="[email protected]"
username=root
用“设置服务器身份验证”和“设置客户端身份验证”中概述的步骤,以建立双向双向身份验证过程,在该过程中,服务器和客户端在建立连接之前先对彼此进行身份验证。
尽管上述典型设置在两端都使用相同的CA证书进行相互身份验证,但并非必须如此。
唯一的要求是,在服务器中配置的CA证书必须能够验证客户端证书,并且导入到客户端信任库中的CA证书必须能够验证服务器证书。
两端使用的两个CA证书可以不同。
综上,我们可以看到:
客户端不做认证 ,直接信任证书,客户端无需配置证书
单向认证(验证服务端或客户端),客户端只需要配置 truststore.jks(truststore-ca.jks或truststore-client.jks)
双向认证(验证客户端和者服务端), 客户端需要配置truststore.jks(truststore-ca.jks) 和keystore.jks
五、参考
关于MySQL的jdbc
https://www.jianshu.com/p/599bc0e31fde
setTrustServerCertificate 方法
https://docs.microsoft.com/zh-cn/sql/connect/jdbc/reference/settrustservercertificate-method-sqlserverdatasource?view=sql-server-2017
Steps to connect to an AWS RDS MySql server through SSL/TLS
https://developer.jboss.org/message/966980?_sscc=t
常用Keytool 命令
http://www.willrey.com/support/keytool_command.html
用keytool创建keystore和trustsotre文件
https://www.jianshu.com/p/1b1c9cfa17a4