我正在开发一个NetCore Webapi,它使用证书来调用外部服务,在Windows上运行得很好,但在Linux上使用docker映像时,它找不到证书.

该映像是使用以下工具构建的:

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
EXPOSE 80

# Copy csproj and restore as distinct layers
COPY "bin/Release/net5.0/linux-x64" ./

# set noninteractive installation
ENV DEBIAN_FRONTEND=noninteractive

COPY MyCertificate.crt /usr/local/share/ca-certificates/MyCertificate.crt
RUN update-ca-certificates

ENTRYPOINT ["dotnet", "MyApp.dll"]

输出正常:

Step 10/12 : COPY MyCertificate.crt /usr/local/share/ca-certificates/MyCertificate.crt
 ---> bfea272fa88d
Step 11/12 : RUN update-ca-certificates
 ---> Running in 4c3844714aea
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

但是,当我运行或按 fingerprint 搜索证书时,我找不到它:

    X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

    store.Open(OpenFlags.ReadOnly);

    var certs = new StringBuilder();
    foreach (X509Certificate2 certificate in store.Certificates)
    {
        certs.Append(certificate.Thumbprint);
    }

推荐答案

COPY MyCertificate.crt /usr/local/share/ca-certificates/MyCertificate.crt
RUN update-ca-certificates

这会将您的证书注册为计算机作用域的受信任根颁发机构(或者,如果它不是自签名的,则使其只是"我们所知的中间CA"),因此您将在LocalMachine\Root(或LocalMachine\certifateAuthority)中看到该证书.

CurrentUser\My Store不支持复制命令,您只能通过打开具有写入权限的X509Store实例并使用X509Store.Add向其中插入内容.因此,您需要将其复制到您的Docker镜像中,然后将其作为文件打开,例如new X509Certificate2(pathToWhereYouPutIt)

Linux相关问答推荐

如何限制SLURM中并行执行的程序数量

如何过滤 Bash 的正则表达式(Linux)中的所有值,除了一个?

如何使用 Linux 命令行跨子目录查找相似的文件名?

如何添加Linux格式的时间输出

将所有列乘以一个常数

在不编写任何代码的情况下,是否有一个命令可以检索当前 shell 的亲和力中的可用内核数?

Linux PREEMPT_RT:SCHED_OTHER 的性能优于 SCHED_FIFO.为什么?

未找到 SDL_Vertex 和 SDL_RenderGeometry

docker rm 命令在具有相同操作系统的不同机器上返回不同的状态码

最小的 x86_64 Hello World ELF 二进制文件是什么?

Ant 找不到 javac,在 Ubuntu 上不会设置 JAVA_HOME

将原始数据发送到 TCP 服务器的 Linux 工具

将 jiffies 转换为毫秒

从 FTP 服务器下载所有文件

我可以告诉 Linux 不要换出特定进程的内存吗?

如何自动化 HTML 到 PDF 的转换?

bash / Makefile中双美元符号的含义是什么?

如何使用 sed 通过灵活的键和值更改我的配置文件?

当我已经 ssh 进入远程机器时,如何 scp 回到本地?

Linux 上的 NuGet:获取响应流时出错