Alpine Linux 和自定义证书颁发机构

Alpine Linux 和自定义证书颁发机构

我一直在尝试将自定义 CA 安装到某些 Alpine Linux 容器中。

首先,我将添加公钥/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 被信任,我就可以使用 wget/curl 而不忽略 tls 错误。

我做错什么了吗?为什么 wget 或 ruby​​ 会一直抱怨我的证书是自签名的?

答案1

显然,我的问题在于 wget 与 Apline 一起运输。

默认情况下,Alpine 附带了来自 busybox 的 wget:

/ $ wget --version
wget: unrecognized option: version
BusyBox v1.31.1 () multi-call binary.

如果我修补 Dockerfile 以安装 wget 以及 ca 证书,那么我可以在没有警告的情况下进行连接,也不会跳过证书验证。

答案2

海事组织这是因为忙碌盒 wgetAlpine Linux 中的补丁需要ssl_client处理 HTTPS 的外部可执行文件,请参阅https://gitlab.alpinelinux.org/alpine/aports/-/commit/1d0560a9b6b5597b191e5aff69a31c2fe0aba273

相关内容