mariadb自签证书启用TLS加密连接 —— 筑梦之路

创建自签名证书


$ 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

搜集自网络

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值