无法让 .pfx 文件在 Linux 上运行

无法让 .pfx 文件在 Linux 上运行

我正在编写一个 C# 程序,它必须调用需要通过证书进行身份验证的 API 端点。

我有一个 .pfx 文件,可以在 Windows 中导入它并且一切正常,但是应用程序必须在 Docker 容器中的 Linux 环境中运行。

我可以/etc/ssl/certs使用该命令将 crt 文件导入到我的 Docker 容器中的文件夹中update-ca-certificates

我尝试了以下方法:

  • 使用 openssl 将 pfx 文件转换为包含解密私钥和公钥的 crt/pem 文件
-----BEGIN CERTIFICATE-----
abcd...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
abcd...
-----END RSA PRIVATE KEY-----
  • 使用 openssl 将两个密钥拆分为单独的文件并导入这些文件

  • 将 openssl 吐出的包属性保留在文件中

Bag Attributes
    localKeyID: 01 00 00 00 
    friendlyName: XXX
subject=C = GB, O = 1111.1.1, O = XXX Limited, OU = devices, CN = XXX Limited

issuer=C = gb, O = 1111.1.1, O = YYY CAs, OU = YYY CA, OU = YYY Issuing CA

但 API 总是说我没有有效的证书。

有人知道我做错了什么吗?文件必须采用特定格式吗?也许在不同的位置?

我的应用程序可以正常找到证书,所以这不是问题。问题似乎出在证书本身。

提前致谢。

答案1

Linux 上的 certstore 加载器永远不会查看 /etc/ssl/certs 中文件底部附加的私钥。(如果您查看 cert 对象,您会看到HasPrivateKeyfalse

如果您想要使用带有私钥的证书,则需要直接从 PFX 加载它,或者从 PFX 加载一次,然后将其添加到CurrentUser\ MyX509Store,然后可以从那里使用它,或者有意从多 PEM 加载它,例如通过调用X509Certificate2.CreateFromPemFile(pathToPem)(或X509Certificate2.CreateFromPemFile(pathToCertPem, pathToKeyPem)

// One time, such as by running a standalone tool:

using (X509Certificate2 fromPfx = new X509Certificate2(pfxToLoad, pfxPwd, X509KeyStorageFlags.PersistKeySet))
using (X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser, OpenFlags.ReadWrite))
{
    store.Add(fromPfx);
}

然后将您的应用程序更改为在 CurrentUser\My 中查找,而不是在 LocalMachine\CA (或 LocalMachine\Root,无论您碰巧指向哪里)。

相关内容