概要
ある日 docker-compose を実行したところ、TLSV1_ALERT_PROTOCOL_VERSION というエラーがでました。試行錯誤したあげく、最終的に TLS 検証を無効にしてエラーを回避しました。ちゃんと TLS で動かせる人には無用の長物かと思います。
Version
一応書いておきます。
$ docker --version
Docker version 19.03.13-ce, build 4484c46
$ docker-compose version
docker-compose version 1.19.0, build 9e633ef
docker-py version: 2.7.0
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t 3 May 2016
エラー回避手順
work-log は冗長なのでここにまとめておきます。
1. DOCKER_TLS_VERIFY, DOCKER_CERT_PATH を空にする
最終的には .bash_profile などに設定しておく
$ export DOCKER_TLS_VERIFY=
$ export DOCKER_CERT_PATH=
2. /etc/sysconfig/docker から tlsverify オプションを削除して dockerd を再起動
設定は抜粋です。
# Before
OPTIONS="--tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem"
# After
OPTIONS="--tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem"
※ ちなみに、最低限 tlsverify を削除すれば動きますが、他の tls~~ を全部消しても特に問題ありませんでした。
$ sudo systemctl restart docker
3. Optional: COMPOSE_TLS_VERSION が set されている場合は unset
私は TLSV1_ALERT_PROTOCOL_VERSION が出たあとに設定していたので、unset が必要でした。
$ unset COMPOSE_TLS_VERSION
Work-log
※ 注意:以下は時系列で作業ログを書いたものであり、最終的に使わなかった COMPOSE_TLS_VERSION の設定などもしているため冗長です。必要な手順のみ確認したい場合は上の方を参照してください。
ことの発端。tlsv1 はダメとのこと。
$ docker-compose up -d
ERROR: SSL error: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:661)
ググると COMPOSE_TLS_VERSION に TLSv1_2 を設定せよという記事が多く出てきたので設定してみる。
$ export COMPOSE_TLS_VERSION=TLSv1_2
が、今度は CERTIFICATE_VERIFY_FAILED ><
$ docker-compose up -d
ERROR: SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)
さらに調べていくとこの github issue を見つける。
DOCKER_TLS_VERIFY, DOCKER_CERT_PATH を空にする。
$ export DOCKER_TLS_VERIFY=
$ export DOCKER_CERT_PATH=
が、今度は SSLV3_ALERT_BAD_CERTIFICATE ...
$ docker-compose up -d
ERROR: SSL error: [SSL: SSLV3_ALERT_BAD_CERTIFICATE] sslv3 alert bad certificate (_ssl.c:661)
あ、COMPOSE_TLS_VERSION 設定したままになってた。
unset する。
$ unset COMPOSE_TLS_VERSION
が、今度は ERROR: Client sent an HTTP request to an HTTPS server.
$ docker-compose up -d
ERROR: Client sent an HTTP request to an HTTPS server.
/etc/sysconfig/docker から tlsverify オプションを削除し、dockerd を restart
# Before
OPTIONS="--tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem"
# After
OPTIONS="--tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem"
$ sudo systemctl restart docker
It works fine.
$ docker-compose up -d
Creating docker_selenium-hub_1 ... done
Creating docker_selenium-hub_1 ...
Creating docker_chrome_1 ... done
補足
なお、/etc/sysconfig/docker から tlsverify を削除をするのみだと、WRONG_VERSION_NUMBER と言われる。
$ docker-compose up -d
ERROR: SSL error: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:661)
その場合、DOCKER_TLS_VERIFY, DOCKER_CERT_PATH を空にすると解決するはず。
$ export DOCKER_TLS_VERIFY=
$ export DOCKER_CERT_PATH=
おわり