如何在docker镜像中添加CA根证书?

时间:2017-02-17 08:00:18

标签: ubuntu curl docker ssl-certificate

我在Ubuntu 14.04上的Docker 1.13.1容器中运行ASP.NET Core 1.1 Web API。

当代码尝试从HTTPS服务器检索某些数据时,我收到此证书身份验证错误:

 An error occurred while sending the request. ---> System.Net.Http.CurlException: Peer certificate cannot be authenticated with given CA certificates
   at System.Net.Http.CurlHandler.ThrowIfCURLEError(CURLcode error)
   at System.Net.Http.CurlHandler.MultiAgent.FinishRequest(StrongToWeakReference`1 easyWrapper, CURLcode messageResult)

HTTPS服务器是内部的,我们的公司CA签署了证书,因此我知道我可能需要注册内部CA.

到目前为止我发现的关于这个错误的所有内容和Docker谈到让docker本身运行,连接到repos等。我的Docker工作正常,Web API在容器外的Ubuntu服务器上运行没有问题。

1)我是否需要在docker镜像中添加CA根证书?

2)如果是这样,我该怎么做?

3)如果没有,我该如何解决这个问题?

4 个答案:

答案 0 :(得分:20)

任务本身并非特定于docker,因为您还需要在普通系统上添加该CA. askubuntu community上有关于如何执行此操作的答案。

所以在Dockerfile中,您将执行以下操作(如果您使用非root用户运行容器,请不要忘记chmod):

ADD your_ca_root.crt /usr/local/share/ca-certificates/foo.crt
RUN chmod 644 /usr/local/share/ca-certificates/foo.crt && update-ca-certificates

答案 1 :(得分:10)

为了简化/标准化所有容器的构建,我们现在将证书托管在中央HTTPS服务器上,并将其构建到我们的容器中,如下所示:

def page_range(x):
    p = x.split(',')
    d = list()
    nums = list()
    for i in range(0,len(p)):
        d.append(p[i].find('-'))

    for i in range(0,len(d)):
        if d[i] >= 1:
            z,y = p[i].split('-')
            nums = nums + list(range(int(z),int(y)+1))
        else:
            nums.append(int(p[i]))
    return nums

基于高山的容器没有立即可用的工具,因此需要更多的工作才能实现相同的目的:

# Debian stretch based container
RUN curl -ks 'https://cert.host.server/ssl_certs/EnterpriseRootCA.crt' -o '/usr/local/share/ca-certificates/EnterpriseRootCA.crt'
RUN /usr/sbin/update-ca-certificates

如果您还想更新Java信任库(与任何计算机上相同):

# Alpine based containers
RUN apk update && apk add curl
WORKDIR /usr/local/share/ca-certificates
RUN curl -ks 'https://cert.host.server/ssl_certs/EnterpriseRootCA.crt' -o '/usr/local/share/ca-certificates/EnterpriseRootCA.crt'
RUN /usr/sbin/update-ca-certificates

答案 2 :(得分:4)

安装<activity name= ".YourActivity" android:configChanges="orientation|screenSize"/>并在与Dockerfile相同的目录中找到ca-certificates文件。

cert_file_name.crt

这将更新Dockerfile中的证书。

答案 3 :(得分:1)

还值得注意的是,这确实需要使用.crt扩展名。最初,我使用.pem cert文件尝试了此操作(我认为它们是可互换的,因此其他文件也可以),该文件未通过update-ca-certificates链接。