假设您有一个Bundle 包,其中包含证书的方式与您在Git证书中看到的相同:

foo/bar.ca-bundle
  - cer 1
  - cer 2
  - ...

它是这样写的:

-----BEGIN CERTIFICATE-----
some base 64 1
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
some base 64 2
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
some base 64 3
-----END CERTIFICATE-----

如何将这些加载为证书集合?

目前,new X509Certificate2("foo/bar.ca-bundle")只加载一个证书,不会抛出任何错误(在我看来,这是一个错误).C#甚至开箱即用地支持这些情况吗?

UPDATE

X509CertificateCollection.Import也不起作用-它只会静默加载一个证书.

推荐答案

要使用证书集合,您必须使用X509Certificate2Collection对象,该对象具有无数的Import()函数.其中一些实际上只会产生一个证书,对于您的用例,您将需要ImportFromPemFile方法.其中一个does支持从单个文件读取多个证书.

var collection = new X509Certificate2Collection();
collection.ImportFromPemFile(@"c:\scratch\test.pem");
var certificates = collection.ToList();

Net Standard 2.0 and below

由于没有加载多个证书的方便方法,因此使用代码手动拆分文件似乎是前进的方向.我在Framework4.7中拼凑了一段代码,演示了实现这一点的一种方法.当然,我们欢迎对改进的建议.

var bundleContent = File.ReadAllText(@"c:\scratch\test.pem");
var certificateValues = Regex.Split(bundleContent, "(?=-----BEG)").Where(s => s != String.Empty);
foreach (var certificateValue in certificateValues) {
    var certificateData = Encoding.ASCII.GetBytes(certificateValue);
    var certificate = new X509Certificate2(certificateData);
    certificate.Subject.Dump();
} 

Csharp相关问答推荐

如何使嵌套for-loop更高效?

Plotly.NET访问互联网时出现异常

有没有办法把+02:00转换成TimeSpan?""

如何在Reflection. Emit中使用具有运行时定义的类型参数的泛型类型

从应用程序图API调用访问所有者字段

MongoDB.NET-将数据绑定到模型类,但无法读取整数值

使用两个不同的枚举作为Switch语句中的CASE生成唯一值

如何解决提交按钮后 Select 选项错误空参照异常

如何捕获对ASP.NET核心应用程序的所有请求并将其发送到一个页面

如何比较C#中的L和ł(波兰字符)返回TRUE

HttpRequestMessage.SetPolicyExecutionContext不会将上下文传递给策略

使用System.Text.Json进行序列化时发生StackOverflow异常

同一组件的多个实例触发相同的事件处理程序

Blazor Server.NET 8中的Blazore.FluentValidation问题

如何对特定异常使用Polly重试机制?

如何在单击按钮后多次异步更新标签

Autofac -动态实例化:手动传递构造函数

根据运行时值获取泛型类型的字典

无法停止PowerShell中的低级挂钩(c#挂钩)

C#如何替换两个XML元素值?