[英]X509 Certificate Intended purpose and SSL
我正在考虑允许用户选择将用于我们一项服务的SSL的证书,该用户最初需要选择商店名称,并且证书列表将显示在下拉列表中,我在阅读后将其删除本文认为,证书只能来自“ 本地计算机”下的“ 我的存储”位置。 在检查了几篇文章之后,我创建了以下代码
using (var store = new X509Store(StoreName.My,StoreLocation.LocalMachine))
{
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates;
foreach (var c in certificates)
{
bool isSslCompatible = false;
bool ekuExists = false;//when this value does not exist, certificate can be used for all purposes [ https://tools.ietf.org/html/rfc3280#section-4.2.1.13 ]
if (c.HasPrivateKey)//only chose those that have a private key
{
foreach (X509Extension extension in c.Extensions)
{
if (extension.Oid.Value == "2.5.29.37")//[ Friedlname = Enhanced Key Usage, names are localised, firendly name cannot be used
{
ekuExists = true;
X509EnhancedKeyUsageExtension ext = (X509EnhancedKeyUsageExtension) extension;
OidCollection oids = ext.EnhancedKeyUsages;
foreach (Oid oid in oids)
{
if (/*oid.FriendlyName == "Server Authentication" || -- cannot be used as friendly names are localised*/
oid.Value == "1.3.6.1.5.5.7.3.1")
{
isSslCompatible = true;
}
}
}
}
if (isSslCompatible || !ekuExists)//add only if value is ssl compatible
{
SSLCertficate certificate = new SSLCertficate();
certificate.CertificateHash = c.GetCertHash();
certificate.CertificateHashString = c.GetCertHashString();
certificate.CertificateThumbPrint = c.Thumbprint;
certificate.FriendlyName = c.FriendlyName;
certificate.SubjectName = c.Subject;
certificate.HasPrivateKey = c.HasPrivateKey;
sslCertificates.Add(certificate);
}
}
}
上面代码的问题是,它看不到证书并且具有所有预期目的,我不确定如何获得这些证书,
检查属性窗口,我得到以下信息, ,上面的代码似乎无法检测到此证书,请在IIS下进行检查,我能够将此特定的证书用于Https,在检测有效SSL证书的代码方面我是否缺少某些内容?
MMC UI有点误导。 这意味着“启用证书已要求的所有目的”。
在您的过滤代码中,您需要存在一个EKU扩展名并具有TLS服务器身份验证的目的。
如果存在扩展名,则证书只能用于所指示的目的之一。 如果指示了多个目的,则只要存在预期目的,本申请就不必识别所指示的所有目的。 使用证书的应用程序可能要求指出一个特定的目的,以使该证书可以被该应用程序接受。
通常,这是指“如果没有扩展名,则该证书被视为对所有目的均有效”。 TLS RFC似乎没有专门引用id-kp-serverAuth
EKU,这意味着它是“通过id-kp-serverAuth
的约定”应用程序约定对其进行检查。
有许多不同的规范可以覆盖“对所有目的均有效”的隐式评估,例如IETF RFC 3161 (受信任的时间戳记)第2.3节:
相应的证书务必仅包含[RFC2459] 4.2.1.13节中定义的扩展密钥使用字段扩展的一个实例,其KeyPurposeID的值为:
ID-KP-时间戳。 此扩展必须至关重要。
但是,TLS从来没有真正谈论过它。
因此,您需要更加复杂。 Web浏览器使用的逻辑是if (!hasEkuExtension || hasServerAuthEku)
与if (hasServerAuthEku)
。
同样,您应该(几乎)始终通过Oid
对象的Value
而不是FriendlyName
来比较Oid
对象。 FriendlyName
本地化,因此您的代码只能在英语系统上可靠地运行。 Oid.Value
值是证书中实际存在的(文本形式)。 (唯一的例外是Value为null时,因为这意味着API试图表示没有定义的OID的值(并且由于Curve25519而仅在ECCurve中才会发生))。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.