一部のAlpine LinuxコンテナにカスタムCAをインストールしようとしました。
まず公開鍵を追加して/usr/local/share/ca-certificates
から実行しますupdate-ca-certificates
。
$ ls -l /usr/local/share/ca-certificates/
total 4
-rw-r--r-- 1 root root 2029 Feb 20 18:39 my-custom-ca.crt
$ update-ca-certificates
...
$ ls -ltr /etc/ssl/certs | tail -3
-rw-r--r-- 1 1000 root 233441 Feb 20 18:52 ca-certificates.crt
lrwxrwxrwx 1 1000 root 49 Feb 20 18:52 ca-cert-my-custom-ca.pem -> /usr/local/share/ca-certificates/my-custom-ca.crt
lrwxrwxrwx 1 1000 root 24 Feb 20 18:52 51252b35.0 -> ca-cert-my-custom-ca.pem
しかし、これは完全に動作しないようです。
もちろん、OpenSSLが証明書を信頼していることを確認できます。
$ openssl s_client -connect <my-server-crt-cn>:443 -showcerts
CONNECTED(00000003)
depth=1 C = FR, ST = France, L = Paris, O = x, OU = y, CN = <my-ca-name>
verify return:1
depth=0 C = FR, ST = France, L = Paris, O = x, OU = y, CN = <my-server-crt-cn>
verify return:1
---
Certificate chain
0 s:C = FR, ST = France, L = Paris, O = x, OU = y, CN = <my-server-crt-cn>
i:C = FR, ST = France, L = Paris, O = x, OU = y, CN = <my-ca-name>
...
Start Time: 1613847660
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
しかし、wgetや私が実行したいRubyアプリなどの他のツールは気にしないようです。
$ wget https://<my-server-crt-cn>/
ssl_client: <my-server-crt-cn>: certificate verification failed: self signed certificate in certificate chain
wget: error getting response: Connection reset by peer
$ wget --no-check-certificate https://<my-server-crt-cn> -O-
Connecting to <my-server-crt-cn> (10.42.253.168:443)
writing to stdout
<response>
<returncode>SUCCESS</returncode>
<version>2.0</version>
次の画像を再現可能にすることができます。
FROM docker.io/alpine:3.11
RUN apk add --no-cache \
ca-certificates \
openssl
COPY my-ca.crt /usr/local/share/ca-certificates
私のワークステーション(Debian)でテストするときはまったく問題がなく、CAが信頼されているとtlsエラーを無視せずにwget / curlを使用できました。
私は何が間違っていましたか? wgetやRubyが私の証明書が自己署名されたと不平を言っているのはなぜですか?
ベストアンサー1
明らかに私の問題は、wgetがAplineに付属していることです。
デフォルトでは、Alpineはbusyboxのwgetに付属しています。
/ $ wget --version
wget: unrecognized option: version
BusyBox v1.31.1 () multi-call binary.
wgetとcaの証明書をインストールするためにDockerfileにパッチを適用すると、警告なしに証明書の確認をスキップせずに接続できます。