Mysql加密连接

Mysql加密连接

什么是加密连接

Mysql加密连接的支持,为数据库的公网开放提供了可能性。X.509能够有效的标识连接客户端的身份。具体的算法可以不用太纠结,主要就是利用不对称加密,数据传输双向加密,来实现数据传输的保密性。

在mysql 5.7.28以前可以用yassl,在5.7.28之后,全部采用OpenSSL了。本文针对5.7.28以后版本。

前置工作

检查mysql版本和配置

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SHOW VARIABLES like '%version%';
+-------------------------+------------------------------+
| Variable_name | Value |
+-------------------------+------------------------------+
| innodb_version | 5.7.37 |
| protocol_version | 10 |
| slave_type_conversions | |
| tls_version | TLSv1,TLSv1.1,TLSv1.2 |
| version | 5.7.37 |
| version_comment | MySQL Community Server (GPL) |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
+-------------------------+------------------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SHOW VARIABLES like '%ssl%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | ca.pem |
| ssl_capath | |
| ssl_cert | server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | server-key.pem |
+---------------+-----------------+

准备证书

  1. 生成一个私钥和请求文件
1
openssl req -newkey rsa:2048 -days 365 -nodes -keyout user1-key.pem -out user1-req.pem

请求文件中会包含申请的主题信息和签名信息。注意参数中有两个输出 keyout 和 out

  1. 用mysql的私钥签名提交的请求,生成x509证书
1
2
3
4
5
$ sudo openssl x509 -req -in user1-req.pem -days 365 -CA /var/lib/mysql/ca.pem \
-CAkey /var/lib/mysql/ca-key.pem -set_serial 01 -out user1-cert.pem
Signature ok
subject=C = AU, ST = Some-State, O = Code123, OU = abc
Getting CA Private Key

用请求文件和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
2
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem \
-name "mysqlclient" -passout pass:mypassword -out client-keystore.p12

用keytool把pkcs12证书写入jks文件,jks是java key store的文件格式

1
2
keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 \
-srcstorepass mypassword -destkeystore code123.jks -deststoretype JKS -deststorepass mypassword

这里需要提供deststorepass是jks的加密密码

jdbc连接配置

1
2
3
4
url=jdbc:mysql://host:port/dbname?useSSL=true&requireSSL=true&verifyServerCertificate=false&clientCertificateKeyStoreUrl=file:conf/code123.jks&clientCertificateKeyStorePassword=jkspassword
driver=com.mysql.jdbc.Driver
user=xxxx
pass=dbpass
  • 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