无法从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版本并进行连接,是这个意思吗、、、、、?

如果有人能理解原因,请给予教授。

广告
将在 10 秒后关闭
bannerAds