MariaDB双向TLS配置案例及使用OpenSSL创建X.509证书

发布于 2024-02-26  2 次阅读


默认情况下,MariaDB在服务器和客户端之间传输数据而没有加密。当服务器和客户端在同一主机上运行或在通过其他方式保证安全性的网络中运行时,这通常是可以接受的。但是,如果服务器和客户端位于不同的网络上或它们位于高风险网络中,则缺乏加密确实会带来安全问题,因为恶意行为者可能会在它们之间通过网络发送流量时窃听流量。

为了减轻这种担忧,MariaDB 允许您使用传输层安全性 (TLS) 协议对服务器和客户端之间传输的数据进行加密。TLS 以前称为安全套接字层 (SSL),但严格来说,SSL 协议是 TLS 的前身,该版本的协议现在被认为是不安全的。该文档仍然经常使用术语 SSL,并且出于兼容性原因,与 TLS 相关的服务器系统和状态变量仍然使用前缀 ,但在内部,MariaDB 仅支持其安全的后续者。

使用OpenSSL生成TLS认证所需证书

SSL在采用单向认证时,服务端需要CA证书、Server证书以及Server私钥,客户端需要CA证书
SSL在采用双向认证时,服务端需要CA证书、Server证书以及Server私钥,客户端需要CA证书、Client证书以及Client私钥

 

  1. 生成CA证书
    1. 生成CA私钥
    # 生成一个 RSA 私钥,私钥的长度是 4096 位
    openssl genrsa -out ca-key.pem 4096
    
    1. 使用CA私钥签发CA证书(采用交互式录入证书信息可取消"-subj"参数)

      CA证书的CN通用名需要与Server证书、Client证书的CN不同
      Server证书与Client证书的CN需要一致
    # 生成一个自签名的 X.509 证书,证书的有效期是 365000 天
    # 证书的主题信息:C 表示国家,ST 表示州或省,L 表示地区,O 表示组织,CN 表示通用名
    openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca.pem -subj "/C=ZH/ST=LN/L=SY/O=xgxdmx/CN=ca"
    
       "签发CA证书参数解释"  ==>  展开 / 收起
  2. 生成服务端证书

    1. 生成服务端私钥
    # 生成一个 RSA 私钥,私钥的长度是 4096 位
    openssl genrsa -out server-key.pem 4096
    
    1. 生成证书请求文件(采用交互式录入证书信息可取消"-subj"参数)
    openssl req -new -key server-key.pem -out server-req.pem -subj "/C=ZH/ST=LN/L=SY/O=xgxdmx/CN=localhost"
    
    1. 签发Server证书(采用交互式录入证书信息可取消"-subj"参数)
    openssl x509 -req -in server-req.pem -days 365000 -CA ca.pem -CAkey ca-key.pem  -out server-cert.pem -sha512 -subj "/C=ZH/ST=LN/L=SY/O=xgxdmx/CN=localhost"
    
    1. 验证证书有效性
    # 返回值为:server-cert.pem: OK 证明证书有效
    openssl verify -CAfile ca.pem server-cert.pem
    
   "签发Server证书参数解释"  ==>  展开 / 收起
  1. 生成客户端证书
    1. 生成客户端私钥
      # 生成一个 RSA 私钥,私钥的长度是 4096 位
      openssl genrsa -out client-key.pem 4096
      
    2. 生成证书请求文件(采用交互式录入证书信息可取消"-subj"参数)
      openssl req -new -key client-key.pem -out client-req.pem -subj "/C=ZH/ST=LN/L=SY/O=xgxdmx/CN=localhost"
      
    3. 签发Client证书(采用交互式录入证书信息可取消"-subj"参数)
      openssl x509 -req -in client-req.pem -days 365000 -CA ca.pem -CAkey ca-key.pem -out client-cert.pem -sha512 -subj "/C=ZH/ST=LN/L=SY/O=xgxdmx/CN=localhost"
      
    4. 验证证书有效性
      # 返回值为:client-cert.pem: OK 证明证书有效
      openssl verify -CAfile ca.pem client-cert.pem
      

至此,MariaDB双向TLS所需证书准备完成,此时生成证书所存储的文件内应存在以下文件(证书文件名称可根据需求自定义)
ca.pem、ca-key.pem、server-req.pem、server-key.pem、server-cert.pem、client-req.pem、client-key.pem、client-cert.pem

MariaDB服务端启用TLS

MySQL与MariaDB在此处配置文件的[server]块位置略有不同,此处以MariaDB 11.3版本为例
- 进入/etc/my.cnf.d/目录,编辑server.cnf

[mariadb]
# This group is read by both MariaDB and MySQL servers
ssl-ca = /etc/my.cnf.d/certs/ca.pem
ssl-cert = /etc/my.cnf.d/certs/server-cert.pem
ssl-key = /etc/my.cnf.d/certs/server-key.pem
  • 重启MariaDB服务
  • 使用MariaDB client进入数据库,查询SSL是否生效
mariadb -u 用户名 -p
show global variables like '%ssl%';
  • 此时的"have_openssl"、"have_ssl"的value应均为"YES","ssl_ca"、"ssl_cert"、"ssl_key"的value应均为server.cnf配置的证书文件绝对路径

MariaDB客户端启用TLS

  • 进入/etc/my.cnf.d/目录,编辑client.cnf
[client-mariadb]
ssl-ca = /etc/my.cnf.d/certs/ca.pem
ssl-cert = /etc/my.cnf.d/certs/client-cert.pem
ssl-key = /etc/my.cnf.d/certs/client-key.pem
  • 客户端配置完成后可以进入数据库使用status;检查客户端连接的SSL状态
  • 强制指定数据库用户使用SSL,需要以下sql语句
    ALTER USER `用户名`@`localhost` REQUIRE SSL; # REQUIRE参数可以是none、ssl、any、x509