繁体   English   中英

X509证书预期用途和SSL

[英]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服务器身份验证的目的。

IETF RFC 3280第4.2.1.13节

如果存在扩展名,则证书只能用于所指示的目的之一。 如果指示了多个目的,则只要存在预期目的,本申请就不必识别所指示的所有目的。 使用证书的应用程序可能要求指出一个特定的目的,以使该证书可以被该应用程序接受。

通常,这是指“如果没有扩展名,则该证书被视为对所有目的均有效”。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM