代码之家  ›  专栏  ›  技术社区  ›  mahlatse

X509证书预期用途和SSL

  •  1
  • mahlatse  · 技术社区  · 7 年前

    我正在考虑允许用户选择一个证书,该证书将用于我们的某个服务的ssl,用户需要选择一个存储名称的首字母,并且证书列表将显示在下拉列表中,我在阅读本文后删除了它 article 证书只能来自 我的 存储位置在 本地计算机 是的。在检查了几篇文章之后,我创建了下面的代码

    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);
                        }
                    }
                }
    

    上面代码的问题是它看不到证书,也没有所有预期的用途,我不确定如何获取这些证书,

    Certificate Details 我是说,

    在“属性”窗口中,我得到以下信息: enter image description here ,上面的代码似乎没有检测到这个证书,在i is下检查,我可以将这个特定的证书用于https,在检测有效的ssl证书的代码中是否缺少什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   bartonjs    7 年前

    mmc用户界面有点误导。它的意思是“启用证书已经声明的所有目的”。

    在过滤代码中,您要求存在eku扩展并具有tls服务器身份验证目的。

    IETF RFC 3280 section 4.2.1.13

    如果存在扩展名,则只能使用证书 用于指定的目的之一。如果多个目的是 表示申请不必承认所示的所有目的, 只要有目的。证书使用 应用程序可能要求在 要求该证书能被该申请所接受。

    这通常被认为是指“如果没有延期,则证书被视为对所有目的都有效”。TLS RFC似乎没有特别提到 id-kp-serverAuth eku,意思是“按强约定”应用约定来检查它。

    有不同的规范覆盖了“对所有目的都有效”的隐式评估,例如 IETF RFC 3161 (可信时间戳)第2.3节:

    这个 相应的证书只能包含 [RFC2459]节中定义的扩展密钥使用字段扩展 4.2.1.13 keyPurposeID具有值:

    id kp时间戳。这个扩展必须是关键的。

    但是,同样的,TLS从来没有真正谈论过。

    所以你需要更复杂些。Web浏览器使用的逻辑是 if (!hasEkuExtension || hasServerAuthEku) ,与您的 if (hasServerAuthEku) 是的。

    而且,你应该(几乎)总是比较 Oid 对象 Value ,而不是他们的 FriendlyName 是的。 友好名称 本地化,因此您的代码只能在英语系统上可靠运行。这个 Oid.Value 值是证书中的实际值(文本化形式)。(唯一的例外是当value为空时,因为这意味着api试图表示一个没有定义oid的值(这实际上只在eccurve中发生,因为curve25519)。

    推荐文章