mysql - 如何在 Docker 上使用与 MySQL 的加密连接
问题描述
我正在努力获得一个支持 SSL 的 Dockerised MySQL 实例。
我的 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
我尝试将密钥从root
to调出mysql
,然后再次调出堆栈,但这似乎不起作用。
我从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
我看到两个证书都是“好的”(无论我以哪种方式生成它们)。
为什么 MySQL 无法从该文件中找到私钥?
解决方案
有两个问题。
当我生成证书时,它具有错误的权限。在证书上运行chown 999:docker
有助于让 MySQL 在容器中读取它。当我使用 MySQL 工具生成证书时,我跳过了这一步。
第二个问题是 CA 证书的公用名 (CN) 需要与服务器证书的 CN 不同。
在给出生成证书的命令的部分中,MySQL 手册说:
要生成测试文件,您可以按 Enter 到所有提示。要生成用于生产的文件,您应该提供非空响应。
但是在页面稍高的地方,它有一个警告,关于 CN 需要不同。
推荐阅读
- java - 通过 facebook 和 gmail 登录
- qt - Qt Quick Checkbox inside ComboBox创建Surface3D系列
- rest - 乱序休息api响应 - 春天
- c# - 将 IdentityServer4 配置为仅颁发令牌
- firebase - 如何在我的数据收集中获取此地图的输出
- templates - 包含一个文件作为模板的参数
- mongodb - 带有 ObjectIds 的 Mongo 查询对象数组
- image - Flutter/Dart - 将 URL 传递给 Image Cropper 而不是图像文件?
- arduino - 我的 Lora adafruit feather m0 不会发送加入请求
- python - 如何实现去除/修剪神经网络中接近零的参数?