如何在 Docker 上使用 MySQL 的加密连接



我正在努力让Dockerized MySQL实例支持SSL。

我的 docker-compose 文件中的服务如下所示:

mysql:
image: mysql:5.7
container_name: mysql
command: --default-authentication-plugin=mysql_native_password --ssl-ca=/etc/ssl/mysql/ca.pem --ssl-cert=/etc/ssl/mysql/server-cert.pem --ssl-key=/etc/ssl/mysql/server-key.pem
restart: always
expose:
- 3306
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
MYSQL_DATABASE: "${MYSQL_DATABASE}"
MYSQL_USER: "${MYSQL_USER}"
MYSQL_PASSWORD: "${MYSQL_PASSWORD}"
volumes:
- "./data/db:/var/lib/mysql"
- "./config/mysql/my.cnf:/etc/mysql/conf.d/ssl.cnf"
- "./config/mysql/certs:/etc/ssl/mysql"

当我启动堆栈时,我从 MySQL 容器收到以下错误:

[ERROR] SSL error: Unable to get private key from '/etc/ssl/mysql/server-key.pem'
[Warning] Failed to set up SSL because of the following SSL library error: Unable to get private key

我试图将密钥从rootmysql,然后再次调出堆栈,但这似乎不起作用。

我从 https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html 的命令生成了密钥文件,如下所示:

# Create server certificate, remove passphrase, and sign it
# server-cert.pem = public key, server-key.pem = private key
openssl req -newkey rsa:2048 -days 3600 
-nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 
-CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

主机上的文件具有以下权限:

drwxrwxr-x 2 andrew andrew 4096 Dec 11 10:25 ./
drwxrwxr-x 3 andrew andrew 4096 Dec 10 19:27 ../
-rw-rw-r-- 1    999 docker 1675 Dec 10 19:20 ca-key.pem
-rw-rw-r-- 1    999 docker 1294 Dec 10 19:20 ca.pem
-rw-rw-r-- 1    999 docker 1123 Dec 10 19:20 client-cert.pem
-rw-rw-r-- 1    999 docker 1679 Dec 10 19:20 client-key.pem
-rw-rw-r-- 1    999 docker  989 Dec 10 19:20 client-req.pem
-rw-rw-r-- 1    999 docker 1127 Dec 10 19:20 server-cert.pem
-rw------- 1    999 docker 1675 Dec 11 10:25 server.key
-rw-rw-r-- 1    999 docker 1704 Dec 11 09:43 server-key.pem
-rw-rw-r-- 1    999 docker  956 Dec 11 09:43 server-req.pem

如果我手动生成证书并将其挂载为卷,或者我在容器上运行 shell 并运行命令mysql_ssl_rsa_setup --datadir=/etc/ssl/mysql --verbose(在清除我创建的证书后(,就会发生这种情况。 换句话说,当我运行openssl verify -CAfile ca.pem server-cert.pem client-cert.pem时,我看到两个证书都是"OK"的(无论我以哪种方式生成它们(。

为什么MySQL无法从该文件中找到私钥?

有两个问题。

当我生成证书时,它具有错误的权限。 在证书上运行chown 999:docker有助于让MySQL在容器中读取它。 当我使用 MySQL 工具生成证书时,我跳过了这一步。

第二个问题是 CA 证书的公用名 (CN( 需要与服务器证书的 CN 不同。

在它提供生成证书的命令的部分中,MySQL手册说:

若要生成测试文件,可以按 Enter 键处理所有提示。自 生成用于生产用途的文件,应提供非空 反应。

但是在页面上的更高处,它有一个关于CN需要不同的警告。

最新更新