使用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