lamess / 使用OpenSSL为MySQL生成SSL证书

Created Fri, 14 Jun 2024 11:12:45 +0800 Modified Mon, 08 Jul 2024 22:10:37 +0800

使用OpenSSL为MySQL生成SSL证书

前言

在MySQL配置SSL时,如果不使用MySQL自带的证书,或者因为其它原因需要重新生成,可以使用OpenSSL命令生成自签名的证书。

关于OpenSSL生成证书的说明,详见:《使用OpenSSL生成可信任的证书》
关于MySQL的基础安全配置,详见:《MySQL安装、初始化及安全加固》

生成根CA证书

首先建立目录,并生成一份配置文件。OpenSSL源码中提供了标准配置文件,以此为模板生成一份配置即可。

mkdir -p /opt/ca/root
vi /opt/ca/root/openssl.cnf

创建私钥。

openssl genrsa -out /opt/ca/root/key/cakey.pem 8192

创建CA证书请求文件。

openssl req -new -key /opt/ca/root/key/cakey.pem -out /opt/ca/root/key/ca.csr -config /opt/ca/root/openssl.cnf

将根CA证书进行自签。

openssl ca -selfsign -in /opt/ca/root/key/ca.csr -out /opt/ca/root/key/cacert.crt -config /opt/ca/root/openssl.cnf

生成中级CA证书

建立中级CA的目录,并生成一份配置文件。

mkdir /opt/ca/intermediate
vi /opt/ca/intermediate/openssl.cnf

创建私钥。

openssl genrsa -out /opt/ca/intermediate/key/cakey.pem 8192

创建CA证书请求文件。

openssl req -new -key /opt/ca/intermediate/key/cakey.pem -out /opt/ca/intermediate/key/ca.csr -config /opt/ca/intermediate/openssl.cnf

用根CA证书签发中级CA证书。

openssl ca -in /opt/ca/intermediate/key/ca.csr -out /opt/ca/intermediate/key/cacert.crt -config /opt/ca/root/openssl.cnf

服务器证书

建立服务器证书的目录,并生成一份配置文件。

mkdir -p /opt/ca/server
vi /opt/ca/server/openssl.cnf

按需自行添加alternate_names参数配置,如DNS.X = XXXXXX和IP.x=xxx.xxx.xxx.xxx。

创建私钥。

openssl genrsa -out /opt/ca/server/server-key.pem 8192

创建服务器证书请求文件。

openssl req -new -key /opt/ca/server/server-key.pem -out /opt/ca/server/server.csr -config /opt/ca/server/openssl.cnf

用中级CA证书签发服务器证书。

openssl ca -in /opt/ca/server/server.csr -out /opt/ca/server/server.crt -config /opt/ca/intermediate/openssl.cnf

最后聚合证书,生成证书链。

cat /opt/ca/intermediate/key/cacert.crt /opt/ca/root/key/cacert.crt | tee /opt/ca/server/ca-chain.crt
cat /opt/ca/server/server.crt /opt/ca/intermediate/key/cacert.crt /opt/ca/root/key/cacert.crt | tee /opt/ca/server/server-fullchain.crt

生成客户端证书

建立目录

mkdir -p /opt/ca/client

创建私钥。

openssl genrsa -out /opt/ca/client/client-key.pem 8192

创建客户端证书请求文件。

openssl req -new -key /opt/ca/client/client-key.pem -out /opt/ca/client/client.csr -config /opt/ca/server/openssl.cnf

用中级CA证书签发客户端证书。

openssl ca -in /opt/ca/client/client.csr -out /opt/ca/client/client.crt -config /opt/ca/intermediate/openssl.cnf

最后聚合证书,生成完整证书链。

cat /opt/ca/client/client.crt /opt/ca/intermediate/key/cacert.crt /opt/ca/root/key/cacert.crt | tee /opt/ca/client/client-fullchain.crt

MySQL配置

验证证书。

openssl verify -CAfile /opt/ca/server/ca-chain.crt /opt/ca/server/server-fullchain.crt
openssl verify -CAfile /opt/ca/server/ca-chain.crt /opt/ca/client/client-fullchain.crt

建立文件存放新生成的文件。修改文件权限。

cd /path_to_mysql_datadir/
mkdir ssl
cp /opt/ca/server/ca-chain.crt ssl/
cp /opt/ca/server/server-fullchain.crt ssl/
cp /opt/ca/server/server-key.pem ssl/
cp /opt/ca/client/client-fullchain.crt ssl/
cp /opt/ca/client/client-key.pem ssl/
chown -R mysql:mysql ssl/
chmod 400 ssl/server-key.pem
chmod 400 ssl/client-key.pem
chmod 640 ssl/ca-chain.crt
chmod 640 ssl/server-fullchain.crt
chmod 640 ssl/client-fullchain.crt

修改my.cnf配置,重启验证。

[mysqld]
ssl_ca=ssl/ca-chain.crt
ssl_cert=ssl/server-fullchain.crt
ssl_key=ssl/server-key.pem

[client]
ssl_ca=ssl/ca-chain.crt
ssl_cert=ssl/client-fullchain.crt
ssl_key=ssl/client-key.pem