Mysql加密连接
Mysql加密连接
什么是加密连接
Mysql加密连接的支持,为数据库的公网开放提供了可能性。X.509能够有效的标识连接客户端的身份。具体的算法可以不用太纠结,主要就是利用不对称加密,数据传输双向加密,来实现数据传输的保密性。
在mysql 5.7.28以前可以用yassl,在5.7.28之后,全部采用OpenSSL了。本文针对5.7.28以后版本。
前置工作
检查mysql版本和配置
1 | mysql> SHOW VARIABLES like '%version%'; |
1 | mysql> SHOW VARIABLES like '%ssl%'; |
准备证书
- 生成一个私钥和请求文件
1 | openssl req -newkey rsa:2048 -days 365 -nodes -keyout user1-key.pem -out user1-req.pem |
请求文件中会包含申请的主题信息和签名信息。注意参数中有两个输出 keyout 和 out
- 用mysql的私钥签名提交的请求,生成x509证书
1 | $ sudo openssl x509 -req -in user1-req.pem -days 365 -CA /var/lib/mysql/ca.pem \ |
用请求文件和mysql的ca.pem来生成客户端证书。通俗来说,就是在请求证书上签个字。下次连接的时候用这个证书来,mysql服务器就会放行。这里的输出主要注意下,一些证书信息,后面会用到
创建用户
1 | CREATE USER 'code123'@'%' IDENTIFIED BY 'xxxxxx' REQUIRE SUBJECT '/O=Code123/OU=abc'; |
创建一个用户,需要主题信息是/O=Code123/OU=abc意思就是,组织和部门名称,需要验证其他更多的信息,可以用/来添加就行。
客户端工具连接
举例dbeaver的客户端配置
JKS文件和JDBC客户端连接
首先把前文的客户端证书转成pkcs12
1 | openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem \ |
用keytool把pkcs12证书写入jks文件,jks是java key store的文件格式
1 | keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 \ |
这里需要提供deststorepass是jks的加密密码
jdbc连接配置
1 | url=jdbc:mysql://host:port/dbname?useSSL=true&requireSSL=true&verifyServerCertificate=false&clientCertificateKeyStoreUrl=file:conf/code123.jks&clientCertificateKeyStorePassword=jkspassword |
- useSSL:true&requireSSL=true 开启ssl
- verifyServerCertificate=false 客户端不验证服务器证书
- clientCertificateKeyStoreUrl=file:conf/code123.jks 这里指向生成的jks文件
- clientCertificateKeyStorePassword=jkspassword jks文件的密码
参考
https://blogs.oracle.com/mysql/post/howto-connect-to-mysql-using-a-client-certificate https://dev.mysql.com/doc/refman/5.7/en/encrypted-connections.html