无法使用 Docker 上 Web Api 核心应用程序的自签名证书连接到远程端点
Can't connect to remote endpoint using self-signed cert from Web Api core app on Docker
当我尝试从我的 docker 化网络 api 核心应用程序连接到远程端点时,出现以下错误:System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
当 运行 在 Docker 之外使用相同的应用程序时,它会按预期工作。我认为问题在于我们的组织使用自签名证书。完整的链已加载到我的本地计算机上,但我无法在 Docker 上安装它,因此网络 api 应用程序可以识别它。
在我的 Docker 文件中加载证书后(请参阅下面的详细信息),我能够使用 openssl 连接到远程站点并从我的 Docker 文件成功卷曲:
RUN openssl s_client -connect REMOTE.ENDPOINT:443 -servername REMOTE.ENDPOINT -verify_hostname REMOTE.ENDPOINT
...snip...
Verification: OK
...snip...
RUN curl --verbose https://REMOTE.ENDPOINT
...snip...
SSL certificate verify ok.
请注意,这些 openssl 和 curl 调用是我的 Docker 文件中的最后内容,因此我希望为我的应用设置所有内容以查看和使用证书。
以下是我将自签名证书添加到 Docker 文件
中的 docker 图像的方法
ADD localEc.crt /usr/local/share/ca-certificates/localEc.crt
RUN chmod 644 /usr/local/share/ca-certificates/localEc.crt && update-ca-certificates
应用程序运行时,我已验证我的证书不在 /etc/ssl/certs/ca-certificates.crt
中并且我的证书文件不在 /etc/ssl/certs
中。虽然我觉得没必要,但我试过直接将证书复制到镜像中:
COPY --from=build /etc/ssl/certs/ /etc/ssl/certs/
COPY ["/etc/ssl/certs", "/etc/ssl/certs"]
我错过了什么?
我知道我可以覆盖 ssl 验证过程以允许此证书,但我宁愿解决根本问题(并避免所有由解决方法 <g>
引起的讨论)。
我终于明白了。我不完全理解分阶段 docker 构建过程是如何工作的。似乎在调试时,Visual Studio 只使用了 docker 文件的第一阶段,而我在最后阶段添加了证书。 This article 阐明了 Docker 构建过程。
当我尝试从我的 docker 化网络 api 核心应用程序连接到远程端点时,出现以下错误:System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
当 运行 在 Docker 之外使用相同的应用程序时,它会按预期工作。我认为问题在于我们的组织使用自签名证书。完整的链已加载到我的本地计算机上,但我无法在 Docker 上安装它,因此网络 api 应用程序可以识别它。
在我的 Docker 文件中加载证书后(请参阅下面的详细信息),我能够使用 openssl 连接到远程站点并从我的 Docker 文件成功卷曲:
RUN openssl s_client -connect REMOTE.ENDPOINT:443 -servername REMOTE.ENDPOINT -verify_hostname REMOTE.ENDPOINT
...snip...
Verification: OK
...snip...
RUN curl --verbose https://REMOTE.ENDPOINT
...snip...
SSL certificate verify ok.
请注意,这些 openssl 和 curl 调用是我的 Docker 文件中的最后内容,因此我希望为我的应用设置所有内容以查看和使用证书。
以下是我将自签名证书添加到 Docker 文件
中的 docker 图像的方法ADD localEc.crt /usr/local/share/ca-certificates/localEc.crt
RUN chmod 644 /usr/local/share/ca-certificates/localEc.crt && update-ca-certificates
应用程序运行时,我已验证我的证书不在 /etc/ssl/certs/ca-certificates.crt
中并且我的证书文件不在 /etc/ssl/certs
中。虽然我觉得没必要,但我试过直接将证书复制到镜像中:
COPY --from=build /etc/ssl/certs/ /etc/ssl/certs/
COPY ["/etc/ssl/certs", "/etc/ssl/certs"]
我错过了什么?
我知道我可以覆盖 ssl 验证过程以允许此证书,但我宁愿解决根本问题(并避免所有由解决方法 <g>
引起的讨论)。
我终于明白了。我不完全理解分阶段 docker 构建过程是如何工作的。似乎在调试时,Visual Studio 只使用了 docker 文件的第一阶段,而我在最后阶段添加了证书。 This article 阐明了 Docker 构建过程。