安装内部PKI并强制使用TLS访问和MySQL的主从复制

安装内部PKI


1、在node-1(主机)上创建CA

  • 默认的文件是/yxy/下自己建立的
yxy/
├── app/
├── backup/
├── cache/
├── config/ # 统一管理配置文件,比如mysql 就再下面创建 mysql/my.cnf
├── data/   # 这个是用来放启动数据文件,比如 mysql 就是 mysql-run/mysql.sock
├── home/ 
├── log/    # 用来放日志的 如: mysql/yxy-mysql-error.log     yxy是我自定义的用户组yxy的mysql用户
├── package/   # 这个是用来方从 windwos上传的离线安装包
├── run/
├── scripts/
├── seripts/          # 注意:这个目录名可能是 scripts 的拼写错误
├── server/           # 属主是 root,属组是 yxy
└── tmp/           
install -d -o root -g root -m 0700 /yxy/backup/mysql  
install -d -o root -g root -m 0700 /yxy/config/mysql/tls
umask 077

openssl genrsa -out /yxy/backup/mysql/yxy-mysql-ca-key.pem 4096
openssl req -x509 -new -key /yxy/backup/mysql/yxy-mysql-ca-key.pem -sha256 -days 3650 -out /yxy/config/mysql/tls/ca.pem -subj '/CN=YXY-MYSQL-Teaching-CA'

chmod 0600 /yxy/backup/mysql/yxy-mysql-ca-key.pem
chown root:yxy /yxy/config/mysql/tls/ca.pem
chmod 0640 /yxy/config/mysql/tls/ca.pem

openssl x509 -in /yxy/config/mysql/tls/ca.pem -noout -subject -issuer -dates

sha256sum /yxy/config/mysql/tls/ca.pem

在node-1 生成并签发服务器证书

umask 077

openssl genrsa \
  -out /yxy/config/mysql/tls/server-key.pem \
  2048

openssl req -new \
  -key /yxy/config/mysql/tls/server-key.pem \
  -out /tmp/yxy-node-1-mysql.csr \
  -subj '/CN=yxy-node-1'

openssl x509 -req \
  -in /tmp/yxy-node-1-mysql.csr \
  -CA /yxy/config/mysql/tls/ca.pem \
  -CAkey /yxy/backup/mysql/yxy-mysql-ca-key.pem \
  -CAcreateserial \
  -out /yxy/config/mysql/tls/server-cert.pem \
  -days 825 \
  -sha256 \
  -extfile <(printf '%s\n' \
    'subjectAltName=DNS:yxy-node-1,IP:192.168.109.82' \    # 这个地方修改为自己的 虚拟机的 ip地址
    'extendedKeyUsage=serverAuth')

chown root:yxy \
  /yxy/config/mysql/tls/server-key.pem \
  /yxy/config/mysql/tls/server-cert.pem
chmod 0640 \
  /yxy/config/mysql/tls/server-key.pem \
  /yxy/config/mysql/tls/server-cert.pem
restorecon -RFv /yxy/config/mysql/tls

openssl verify \
  -CAfile /yxy/config/mysql/tls/ca.pem \
  /yxy/config/mysql/tls/server-cert.pem

在 node-2 (副机)上生成私钥和CSR

install -d -o root -g yxy -m 0750 /yxy/config/mysql/tls
umask 077

openssl genrsa \
  -out /yxy/config/mysql/tls/server-key.pem \
  2048

openssl req -new \
  -key /yxy/config/mysql/tls/server-key.pem \
  -out /tmp/yxy-node-2-mysql.csr \
  -subj '/CN=yxy-node-2'

在node-3(另外一台副机)上生成 私钥和CSR

install -d -o root -g yxy -m 0750 /yxy/config/mysql/tls
umask 077

openssl genrsa \
  -out /yxy/config/mysql/tls/server-key.pem \
  2048

openssl req -new \
  -key /yxy/config/mysql/tls/server-key.pem \
  -out /tmp/yxy-node-3-mysql.csr \
  -subj '/CN=yxy-node-3'

在Windows中管理中转两份CSR

New-Item -ItemType Directory -Force 'D:\yxy\project\lnmj\.tmp-mysql-pki'
scp root@192.168.109.83:/tmp/yxy-node-2-mysql.csr 'D:\yxy\project\lnmj\.tmp-mysql-pki\yxy-node-2-mysql.csr'
scp root@192.168.109.84:/tmp/yxy-node-3-mysql.csr 'D:\yxy\project\lnmj\.tmp-mysql-pki\yxy-node-3-mysql.csr'
scp 'D:\yxy\project\lnmj\.tmp-mysql-pki\yxy-node-2-mysql.csr' root@192.168.109.82:/tmp/yxy-node-2-mysql.csr
scp 'D:\yxy\project\lnmj\.tmp-mysql-pki\yxy-node-3-mysql.csr' root@192.168.109.82:/tmp/yxy-node-3-mysql.csr

在node-1 中对 node-2 和 node-3的证书分别签发,然后传给 windows ,从windows 中传给 node-2 和 node-3

test -s /tmp/yxy-node-2-mysql.csr

openssl x509 -req \
  -in /tmp/yxy-node-2-mysql.csr \
  -CA /yxy/config/mysql/tls/ca.pem \
  -CAkey /yxy/backup/mysql/yxy-mysql-ca-key.pem \
  -CAcreateserial \
  -out /tmp/yxy-node-2-server-cert.pem \
  -days 825 \
  -sha256 \
  -extfile <(printf '%s\n' \
    'subjectAltName=DNS:yxy-node-2,IP:192.168.17.12' \
    'extendedKeyUsage=serverAuth')

openssl verify \
  -CAfile /yxy/config/mysql/tls/ca.pem \
  /tmp/yxy-node-2-server-cert.pem

test -s /tmp/yxy-node-3-mysql.csr

openssl x509 -req \
  -in /tmp/yxy-node-3-mysql.csr \
  -CA /yxy/config/mysql/tls/ca.pem \
  -CAkey /yxy/backup/mysql/yxy-mysql-ca-key.pem \
  -CAcreateserial \
  -out /tmp/yxy-node-3-server-cert.pem \
  -days 825 \
  -sha256 \
  -extfile <(printf '%s\n' \
    'subjectAltName=DNS:yxy-node-3,IP:192.168.17.13' \
    'extendedKeyUsage=serverAuth')

openssl verify \
  -CAfile /yxy/config/mysql/tls/ca.pem \
  /tmp/yxy-node-3-server-cert.pem

[!Note]
  传递的指令和之前从node-2中传递给windows是一样的,只是ip地址和传递对象换了一下,以下就不再过多书写冗余的指令。

依次在 node-2 和 node-3 中安装证书

test -s /tmp/yxy-node-2-server-cert.pem
test -s /tmp/yxy-mysql-ca.pem
test -s /yxy/config/mysql/tls/server-key.pem

install -o root -g yxy -m 0640 \
  /tmp/yxy-node-2-server-cert.pem \
  /yxy/config/mysql/tls/server-cert.pem

install -o root -g yxy -m 0640 \
  /tmp/yxy-mysql-ca.pem \
  /yxy/config/mysql/tls/ca.pem

chown root:yxy /yxy/config/mysql/tls/server-key.pem
chmod 0640 /yxy/config/mysql/tls/server-key.pem
restorecon -RFv /yxy/config/mysql/tls

openssl verify \
  -CAfile /yxy/config/mysql/tls/ca.pem \
  /yxy/config/mysql/tls/server-cert.pem

sha256sum /yxy/config/mysql/tls/ca.pem

  需要在屏幕上显示的OK即可代表安装成功

确认每个节点的证书与私钥是匹配的

openssl x509 \
  -in /yxy/config/mysql/tls/server-cert.pem \
  -pubkey -noout | sha256sum

openssl pkey \
  -in /yxy/config/mysql/tls/server-key.pem \
  -pubout | sha256sum

  输出的结果是一样的就是认为是匹配的

最后将证书的路径写入MySQL TLS配置中,默认是在/etc/my.cnf,本人的是改为了/yxy/config/mysql/my.cnf

sed -i \
  -e '/^ssl-ca=/d' \
  -e '/^ssl-cert=/d' \
  -e '/^ssl-key=/d' \
  -e '/^require_secure_transport=/d' \
  /yxy/config/mysql/my.cnf

sed -i '/^\[mysqld\]$/a\
ssl-ca=/yxy/config/mysql/tls/ca.pem\
ssl-cert=/yxy/config/mysql/tls/server-cert.pem\
ssl-key=/yxy/config/mysql/tls/server-key.pem\
require_secure_transport=ON' \
  /yxy/config/mysql/my.cnf

chown root:yxy /yxy/config/mysql/my.cnf
chmod 0640 /yxy/config/mysql/my.cnf

grep -nE \
  '^(ssl-ca|ssl-cert|ssl-key|require_secure_transport)=' \
  /yxy/config/mysql/my.cnf

验证配置并重启MySQL

/yxy/server/mysql/bin/mysqld \
  --defaults-file=/yxy/config/mysql/my.cnf \
  --validate-config

systemctl restart yxy-mysql
systemctl --no-pager --full status yxy-mysql

验证 MySQL已加载了TLS

  本人用的16位随机密码当作MySQL密码,同时也是模拟使用安全性来完成

# wI4dwbXCLpzRe8Ha
/yxy/server/mysql/bin/mysql \
  --protocol=socket \
  --socket=/yxy/data/mysql-run/mysql.sock \
  -uroot -p \
  -e "SHOW VARIABLES WHERE Variable_name IN \
      ('require_secure_transport','ssl_ca','ssl_cert','ssl_key','tls_version');"

tail -n 100 /yxy/log/mysql/yxy-mysql-error.log | \
  grep -iE 'ssl|tls|certificate|private key|unable|error' || true

MySQL的主从复制


最后的结果如下

QQ_1786594263602

posted @ 2026-08-13 12:05  黑单  阅读(4)  评论(0)    收藏  举报