创建自签名证书
$ openssl genrsa -out CA_key.pem 2048
$ openssl req -x509 \
-new \
-nodes \
-sha256 \
-days 3650 \
-key CA_key.pem \
-out ca.crt.pem \
-subj "/C=XX/ST=SomeState/L=SomeLocation/O=MyOrganization/CN=SomeCommonName"
$ openssl genrsa -out server.example.com.key 2048
$ openssl req -new \
-key server.example.com.key \
-out server.example.com.csr \
-subj "/CN=server.example.com"
$cat <<EOF > myserver.cnf
authorityKeyIdentifier=keyid,issuer
keyUsage=digitalSignature
extendedKeyUsage=serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = server.example.com
EOF
$ openssl x509 -req \
-in server.example.com.csr \
-CA ca.crt.pem \
-CAkey CA_key.pem \
-CAcreateserial \
-out server.example.com.pem \
-days 825 \
-sha256 \
-extfile myserver.cnf
# 生成3个文件
服务器的私钥:server.example.com.key
服务器证书:server.example.com.pem
证书颁发机构(CA)证书:ca.crt.pem
数据库服务端配置
将 CA 和服务器证书存储在 /etc/pki/tls/certs/ 目录中,并设置权限
mv server.example.com.crt.pem /etc/pki/tls/certs/
mv ca.crt.pem /etc/pki/tls/certs/
chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
将服务器的私钥存储在 /etc/pki/tls/private/ 目录中,并设置权限
mv server.example.com.key.pem /etc/pki/tls/private/
chmod 640 /etc/pki/tls/private/server.example.com.key.pem
chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
恢复selinux上下文(如果有开启selinux)
restorecon -Rv /etc/pki/tls/
mariadb(/etc/my.cnf.d/mariadb-server-tls.cnf)
[mariadb]
ssl_key = /etc/pki/tls/private/server.example.com.key.pem
ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem
ssl_ca = /etc/pki/tls/certs/ca.crt.pem
# 拒绝未加密的连接尝试[可选],MariaDB 10.5.2+支持
require_secure_transport = on
# 设置服务器应该支持的 TLS 版本[可选],默认情况下,服务器支持 TLS 1.1、TLS 1.2 和 TLS 1.3。MariaDB 10.4.6+支持
tls_version = TLSv1.2,TLSv1.3
------------------------------------------
mysql(/etc/my.cnf.d/mysql-server-tls.cnf)
[mysqld]
ssl_key = /etc/pki/tls/private/server.example.com.key.pem
ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem
ssl_ca = /etc/pki/tls/certs/ca.crt.pem
# 拒绝没有加密的连接[可选]
require_secure_transport = on
# 设置服务器应支持的 TLS 版本[可选],默认情况下,服务器支持 TLS 1.1、TLS 1.2 和 TLS 1.3。
tls_version = TLSv1.2,TLSv1.3
# 重启服务
systemctl restart mariadb
systemctl restart mysql
# 检查验证
# mariadb
mysql -u root -p -h server.example.com -e "SHOW GLOBAL VARIABLES LIKE 'have_ssl';"
mysql -u root -p -h server.example.com -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';"
# mysql
mysql -u root -p -h server.example.com -e "SHOW session status LIKE 'Ssl_cipher';"
mysql -u root -p -h server.example.com -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';"
mysql -u root -p -h server.example.com -e "SHOW GLOBAL VARIABLES WHERE Variable_name REGEXP '^ssl_ca|^ssl_cert|^ssl_key';"
对特定的帐户要求 TLS 加密连接
mysql -u root -p -h server.example.com
ALTER USER 'example'@'%' REQUIRE SSL;
# 检查验证
maridab(/etc/my.cnf.d/mariadb-client.cnf)
mysql -u example -p -h server.example.com --ssl
# 尝试以禁用 TLS 的 example 用户身份进行连接,会发现服务器拒绝登录尝试
# mysql -u example -p -h server.example.com --skip-ssl
ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)
mysql(/etc/my.cnf.d/mysql-client.cnf)
mysql -u example -p -h server.example.com
# 尝试以禁用 TLS 的 example 用户身份进行连接,发现服务器拒绝登录尝试
# mysql -u example -p -h server.example.com --ssl-mode=DISABLED
ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)
客户端中全局启用 TLS 加密
客户端机器添加ca证书
# cp ca.crt.pem /etc/pki/ca-trust/source/anchors/
# chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pem
# update-ca-trust
注:如果是应用连接且你的应用端已经容器化,需要在基础镜像中添加ca证书,将上面的步骤添加到Dockerfile中重新进行打包
在客户端中全局启用 TLS 加密
mariadb
[client-mariadb]
ssl
ssl-verify-server-cert
mysql
[client]
ssl-mode=VERIFY_IDENTITY
ssl-ca=/etc/pki/tls/certs/ca.crt.pem
# 测试
# mysql -u root -p -h server.example.com -e status
如果 SSL 条目中包含 Cipher in use is…,则连接是加密的。请注意,在这个命令中使用的用户需要具有远程身份验证的权限
如果您连接的主机名与服务器的 TLS 证书中的主机名不匹配,则 ssl-verify-server-cert 参数会导致连接失败。例如,连接到 localhost(因为我证书中写的是server.example.com)
# mysql -u root -p -h localhost -e status
ERROR 2026 (HY000): SSL connection error: Validation of SSL server certificate failed
搜集自网络