1 回答
TA贡献1829条经验 获得超7个赞
即使 PFX 包含整个链,使用单证书构造函数也会使其仅加载具有私钥的证书,其余的都会被丢弃。
即使使用 load-the-PFX-as-a-collection 方法,SslStream 也仅使用集合来查找可接受的服务器证书(具有私钥和正确的 EKU 值),然后忽略其余部分。
仅当 X509Chain 通过系统环境上下文找到中间证书时才会发送中间证书。如果您的证书不是公共信任的,那么您的方案的最佳答案是将中间证书(以及可选的根证书)添加到 CurrentUser\CA ( )X509StoreName.CertificateAuthority证书存储中。“CA”存储不提供信任,它只是系统见过的所有中间发行者 CA 的一个抓包,系统在构建新链时将其用作缓存。
您可以在启动时以编程方式执行此操作
X509Certificate2 serverCertificate = null;
using (X509Store store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser))
{
store.Open(OpenFlags.ReadWrite);
X509Certificate2Collection coll = new X509Certificate2Collection();
coll.Import("certificate.pfx");
foreach (X509Certificate2 cert in coll)
{
if (cert.HasPrivateKey)
{
// Maybe apply more complex logic if you really expect multiple private-key certs.
if (serverCertificate == null)
{
serverCertificate = cert;
}
else
{
cert.Dispose();
}
}
else
{
// This handles duplicates (as long as no custom properties have been applied using MMC)
store.Add(cert);
cert.Dispose();
}
}
}
// tcpListener, et al.
其他选项:将整个集合输入 X509Chain.ChainPolicy.ExtraStore,在 serverCert 上调用 X509Chain.Build,仅在第一个证书之后添加证书(也可以不添加最后一个证书)...仅取决于预计需要多少额外内容位于 PFX 中。
- 1 回答
- 0 关注
- 92 浏览
添加回答
举报