首页 > 解决方案 > 如何在 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

我尝试将密钥从rootto调出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 无法从该文件中找到私钥?

标签: mysqldockeropenssl

解决方案


有两个问题。

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

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

在给出生成证书的命令的部分中,MySQL 手册说:

要生成测试文件,您可以按 Enter 到所有提示。要生成用于生产的文件,您应该提供非空响应。

但是在页面稍高的地方,它有一个警告,关于 CN 需要不同。


推荐阅读