无法从Docker环境(Debian)连接到MySQL的问题
这篇文章的目标读者
-
- 下記のエラーに悩んでいる人
- 2026 (HY000): SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol
请问题目是什么?
当我在Docker环境中启动应用程序并尝试连接外部的MySQL(本例中为Amazon Aurora)时,出现了上述错误。这个问题取决于基础Docker镜像,有时会出错,有时不会出错。
由于需要在Docker中创建Python环境,本次我选择了从Python 3.7.4官方镜像开始创建。
虽然不详细说明应用程序的内容,但它是使用pandas进行处理的。
我正在试图使用mysql.connector进行连接。
在基于Debian的Docker中发生错误↓
FROM python:3.7.4-slim
RUN apt-get -y update && apt-get install -y --no-install-recommends \
apt-utils \
python-dev \
build-essential \
libpq-dev
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
COPY requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt
不会发生错误的Docker(基于Alpine)↓
FROM python:3.7.4-alpine3.10
RUN apk --update-cache add \
bash \
gcc \
g++ \
gfortran \
postgresql-dev \
openblas-dev \
freetype-dev
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
COPY requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt
下面是连接部分的Python代码-
# 一部抜粋
import mysql.connector as my
myconfig = {
'user': 'user',
'password': 'your_password',
'host': 'your_host',
'database' : 'your_db',
}
conn = my.connect(**myconfig)
目标
因为基于Alpine的话,在构建时需要较长时间来构建C系列的numpy、pandas等,所以我想使用基于Debian的Docker镜像。
原因和解决方案
对于MySQL 5.6/5.7版本,它似乎仅支持TLSv1.1及以下的TLS版本。
[2] MySQL Connector/Python 8.0.18的更改(2019-10-14,普通可用性)
在Debian系统上,默认的openssl配置为TLSv1.2,这导致连接时发生了错误。
有两种解决方案可供选择。
-
- MySQLのバージョンを変更
-
- こちらの方が根本的に解決しそうですが、事情があり実施できませんでした。
-
- Debianのデフォルト設定を変更
-
- Dockerfileに以下の記述を加えてbuildすると、設定値を変更することができます。
- ただし、バージョンを下げることは、将来的なセキュリティ観点であまり望ましくはないでしょう。
FROM python:3.7.4-slim
RUN apt-get -y update && apt-get install -y --no-install-recommends \
apt-utils \
python-dev \
build-essential \
libpq-dev
# 変更点
RUN apt-get update -yqq \
&& apt-get install -y --no-install-recommends openssl \
&& sed -i 's,^\(MinProtocol[ ]*=\).*,\1'TLSv1.0',g' /etc/ssl/openssl.cnf \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
COPY requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt
调查的内容 chá de
关于Debian的TLS默认设置
[1] Debian openssl-1.1.1
MySQL Connector/Python 8.0.18(2019年10月14日、一般的な利用可能性)の変更情報。
调查错误内容和更改设置值的方法
[3] SSL routines:ssl_choose_client_version:不支持的协议
我没有理解为什么在Alpine上没有发生错误。
在/etc/ssl/openssl.cnf文件中没有找到有关TLS默认配置的记录。。。
可能会被告知要学习协议,但如果没有默认设置,它会自动选择TLS版本并进行连接,是这个意思吗、、、、、?
如果有人能理解原因,请给予教授。