일부 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을 패치하면 경고 없이 인증서 확인을 건너뛰지 않고 연결할 수 있습니다.
답변2
IMO는 이것이기 때문이다바쁜 상자 wget
Alpine Linux의 패치에는 ssl_client
HTTPS를 처리하는 외부 실행 파일이 필요합니다.https://gitlab.alpinelinux.org/alpine/aports/-/commit/1d0560a9b6b5597b191e5aff69a31c2fe0aba273