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连接配置学习(二)

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

[email protected]

 

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

[email protected]

 

关于证书信任设置

MySQL:    verifyServerCertificate=false

MariaDB:  trustServerCertificate=true

mysql使用SSL连接配置学习(二)

 

当启用SSL加密并设置连接字符串属性trustServerCertificate=false 时需要做些什么,与设置trustServerCertificate=true 有什么区别?

如果当使用安全套接字层 (SSL) 对通信层加密时应自动信任服务器安全套接字层证书,则为“true” , 否则为 false。

此处,我们服务端,不设置证书验证,为自动信任服务器安全套接字层证书。

 

 

 

2. 服务端开启SSL,配置证书,客户端连服务端,配置单向验证客户端或者服务端证书

 

在 MySQL Server服务器上

#  mkdir  /root/mysqlSSL

# cp /opt/mysqldata/*.pem     /root/mysqlSSL/

 

mysql使用SSL连接配置学习(二)

 

#  keytool -importcert -alias MySQLCACert  -file ca.pem  -keystore truststore.jks   -storepass [email protected]   -noprompt

# keytool -v -list -keystore truststore.jks  -storepass  "[email protected]"

mysql使用SSL连接配置学习(二)

将 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

[email protected]

 

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

[email protected]

mysql使用SSL连接配置学习(二)

 

当启用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]"

 

mysql使用SSL连接配置学习(二)

 

# keytool -v -list  -keystore truststore.jks    -storepass "[email protected]"

# keytool -v -list   -keystore keystore.jks     -storepass "[email protected]"

 

 

mysql使用SSL连接配置学习(二)

 

mysql使用SSL连接配置学习(二)

 

# cat ca.pem

# keytool -export  -alias mysqlcacert  -keystore truststore.jks --storepass "[email protected]" -rfc

mysql使用SSL连接配置学习(二)

可以看出 ,实际上事将CA证书 ca.pem 导入到了 truststore.jks中。

 

# cat client-cert.pem

# keytool -export -alias mysqlclient  -keystore keystore.jks --storepass "[email protected]" -rfc

mysql使用SSL连接配置学习(二)

可以看出,实际是将 客户端证书 client-cert.pem 导入到了 keystore.jks中,当然也将 客户端私钥 client-key.pem 导入到了keystore.jks中,只是我们没法直接从 keystore.jks 获取私钥内容。

 

mysql使用SSL连接配置学习(二)

注意: 此处 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

[email protected]

 

 

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

[email protected]

 

用“设置服务器身份验证”和“设置客户端身份验证”中概述的步骤,以建立双向双向身份验证过程,在该过程中,服务器和客户端在建立连接之前先对彼此进行身份验证。

尽管上述典型设置在两端都使用相同的CA证书进行相互身份验证,但并非必须如此。 

唯一的要求是,在服务器中配置的CA证书必须能够验证客户端证书,并且导入到客户端信任库中的CA证书必须能够验证服务器证书。 

两端使用的两个CA证书可以不同。

 

 

综上,我们可以看到:

客户端不做认证 ,直接信任证书,客户端无需配置证书

单向认证(验证服务端或客户端),客户端只需要配置 truststore.jks(truststore-ca.jks或truststore-client.jks) 

双向认证(验证客户端和者服务端), 客户端需要配置truststore.jks(truststore-ca.jks) 和keystore.jks

 

mysql使用SSL连接配置学习(二)

 

 

五、参考

 

关于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