【问题标题】:Unable to load a .pem from a resource file on macOS无法从 macOS 上的资源文件加载 .pem
【发布时间】:2019-02-07 17:45:06
【问题描述】:

我有一个从资源文件加载 pem 证书的简单方法:

    /// <summary>
    /// Helper method to load a .pem and return it as a X509Certificate2
    /// </summary>
    private static X509Certificate2 GetX509Certificate2(string path)
    {
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path))
        {
            byte[] data = new byte[stream.Length];
            stream.Read(data, 0, (int)stream.Length);
            return new X509Certificate2(data);
        }
    }

它在 Windows 和 Ubuntu 上运行良好,但在 macOS 上失败,原因如下:

互操作+AppleCrypto+AppleCommonCryptoCryptographicException:未知 导入格式。

我尝试使用 Span&lt;byte&gt; 重载,但收效甚微。

有没有人有任何想法/解决方法?

谢谢

【问题讨论】:

  • 是否可能有前导或尾随的额外数据?你能分享一个不起作用的价值吗?
  • 我不确定 - 我正在使用此证书(我可以找到的第一个过期证书用于测试):sk.ee/upload/files/Juur-SK.pem.crt
  • 是的,但是您是否可能会在资源创建过程中添加或添加奇怪的字节。你看过data 中的实际字节吗?此外,您的阅读不能保证阅读所有内容/填写data
  • 我使用的是 Visual Studio 2017,所以我不认为任何奇异的转换会影响资源。 Read 可能没有读到最后,但怀疑这在 Windows 和 Ubuntu 上是否有效......
  • 我可以排除读取(读取的字节数与流长度匹配)并且字节数组似乎已填充好...还有其他想法吗??

标签: c# .net-core ssl-certificate


【解决方案1】:

我在这里向 corefx 团队发布了一张票(我现在已经关闭):https://github.com/dotnet/corefx/issues/35163

该异常是由实际包含证书链的文件引起的(它包含多个-----END CERTIFICATE----- 标记) - 底层互操作在 macOS 上不支持这一点。

显然,Windows 也只使用它遇到的第一个,因此解决方案只是从流中读取足够的字节,直到该标记被命中(尽管没有理由不能将整个链提取为X509Certificate2) 的集合。

奇怪的是,我在程序集中拥有的文件(包含证书链)与我上面链接的文件不同......我感谢@bartonjs,因为这不会有帮助!

【讨论】:

    猜你喜欢
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2011-05-12
    • 2013-12-19
    • 2020-11-23
    • 2018-08-19
    相关资源
    最近更新 更多