Windows 中 Chrome/Mozilla 中基于 ECC 的客户端证书导入

信息安全 加密 tls 公钥基础设施 电子抄送
2021-08-21 00:24:30

我已经部署了一个 PKI 服务器并成功地生成了基于 ECC 的用户或客户端证书。但没有 Web 浏览器支持 ECC 作为公钥。我尝试了不同的工具,也尝试通过 openssl 与 MS CAPI 一起工作,但没有成功。

有人可以为任何 Web 浏览器推荐一个实用程序,它可以帮助将基于 ECC 的用户证书导入其密钥库吗?

或者有没有可以支持这个的库?这是我的证书..

/ejbca/p12/pem#

openssl x509 -in testp256.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 5786377012642498827 (0x504d573c470ac90b)
    Signature Algorithm: ecdsa-with-SHA256
        Issuer: CN=ECCP-256, OU=admin, O=test
        Validity
            Not Before: Aug 23 13:32:42 2013 GMT
            Not After : Aug 23 13:32:42 2015 GMT
        Subject: CN=testp256
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:81:65:b4:c1:f4:95:7f:68:46:80:f2:42:5b:bf:
                    87:84:0a:98:42:3d:0a:e8:70:5c:e4:b3:4e:d7:29:
                    71:af:ce:c5:b3:fe:fd:02:2a:f3:bd:83:f7:50:23:
                    d1:75:af:dd:23:1f:be:62:a7:7a:d0:e2:be:03:c2:
                    e3:18:89:21:f4
                ASN1 OID: prime256v1
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                D7:27:DD:14:F1:42:0E:9C:E3:50:E1:D1:33:20:8A:53:DE:F2:14:14
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Authority Key Identifier:
                keyid:EA:55:E0:24:6F:EA:9E:3C:63:FD:FF:AA:A6:DC:31:1F:F0:1C:FB:F7

            X509v3 Key Usage: critical
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Client Authentication, E-mail Protection
    Signature Algorithm: ecdsa-with-SHA256
         30:45:02:20:08:1b:44:e0:9b:ab:3c:9e:f6:e3:ef:28:d4:1e:
         cd:08:f4:1a:f5:21:c8:9f:e6:e0:6c:5e:7f:52:d0:47:a5:bf:
         02:21:00:ce:1a:58:57:f1:6b:82:5f:f2:72:af:ea:95:a3:05:
         02:ab:63:bf:13:fe:98:c2:0e:c2:a5:d3:d9:b9:74:77:6a
2个回答

今天早上我花了一些时间在 Firefox(版本 26,适用于 MacOS X)、Safari(6.1.1,适用于 MacOS X 10.7.5)和 Chrome(31.0.1650.63,适用于 MacOS X 10.7.5)上进行了一些实验。Chrome 和 Safari 都依赖于 MacOS 对 X.509 证书的支持,该证书通过 KeyChain 进行管理。

我所有的测试都使用来自 P-256 曲线的 EC 密钥,它(在证书中)使用“命名曲线”编码。所有证书都是使用 OpenSSL 生成的,并且与您显示的内容相匹配。特别是,您的证书中的扩展很好,并且可以在基于 RSA 的证书中完美运行。

什么不起作用

KeyChain 拒绝导入任何具有 ECDSA 公钥的证书;它返回一个错误“-67712”,它映射到errSecInvalidKeyRef,也就是“遇到了一个无效的键。”。请参阅此参考页有趣的是,自 MacOS X 10.7 以来,KeyChain 应该知道 ECDSA 密钥的存在,但这似乎并没有渗透到对包含 ECDSA 密钥或使用 ECDSA 签名的 X.509 证书的完全支持。

Firefox 使用自己的称为NSS的加密代码。这包括 X.509 支持。NSS 中新增了对椭圆曲线加密的支持,更重要的是,它是可选的,因此它的存在取决于它是否在构建时被激活。这些消息表明至少 RedHat 仍然构建没有 ECC 支持的 Firefox/NSS。

在我的测试中,Firefox(MacOS X 版本,从官方来源获得)接受尝试使用 ECC 导入证书,但结果好坏参半。使用 ECDSA签名的证书会有些损坏;Firefox 的 GUI 在显示证书时会声称证书“由于未知原因无法验证”。Firefox 将在以下情况下失败:

  • 验证已使用 ECDSA 签名的服务器证书。
  • 使用已使用 ECDSA 签名的客户证书。
  • 使用包含 ECDSA 密钥的客户端证书。

什么有效

Firefox、Safari 和 Chrome 似乎很乐意连接到其私钥为 ECDSA 类型的 SSL 服务器。不过,这三个似乎都要求证书已经用 RSA 签名(还没有尝试过 DSA)。因此,服务器本身可能使用椭圆曲线,而密码套件可以是ECDHE-ECDSA-AES128-GCM-SHA256(Chrome 在这种情况下使用的),这意味着密钥交换是基于椭圆曲线的 Diffie-Hellman,并且该 ECDH 密钥交换的服务器一半由服务器及其 ECDSA 私钥。Chrome 使用 TLS 1.2(好!);Safari 仍然使用 TLS 1.0(不太好,但还不错)。

将 SHA-1 替换为 SHA-256 或返回并不会改变这一切,因此 SHA-256 支持似乎终于完成了。

OpenSSL支持证书中的 EC 密钥、证书签名以及客户端和服务器都没有问题。s_server在我的测试中,服务器是带有命令行选项的 OpenSSL 。openssl s_client连接到我的服务器没有任何问题,并且可以使用基于 EC 的客户端证书。

什么可能有效

在 NSS 中完全激活 ECC 支持的 Firefox 自定义构建可能会更好。无论如何,首先尝试 P-256 曲线(就像你一样),因为大多数声称“支持 ECC”的软件实际上只支持两条曲线,P-256 和 P-384(因为所谓的“NSA Suite B密码学”)。对其他 13 条 NIST 曲线(来自FIPS 186-4)的支持要保密得多;对“通用曲线”的支持很少见(我从未在野外观察到它)。

最新版本的 Internet Explorer 应该知道 ECDSA。请注意,Windows 有两个用于加密的内部框架,CryptoAPI(旧的)和CNG只有 CNG 支持 EC 密钥,或者就此而言,支持 SHA-256。CNG 出现在 Windows Server 2008 和 Windows 7 中;这些 Windows 版本上的最新 IE应该能够为客户端和服务器使用包含 EC 密钥的证书和使用 ECDSA 签名的证书。至少文档是这样声明的不过,在你测试它之前不要相信它。

Windows上的Chrome将依赖于 Windows 的 X.509 证书功能,因此 Windows 7+ 上的 Chrome 可能与 IE 在同一平台上的能力相当。再次,应该进行测试。

实际上,EJBCA 和 ECC PKCS#12 文件存在问题。ECC 中的密钥编码可以通过两种不同的方式完成,“命名曲线”和“显式参数”。EJBCA 使用显式参数,但浏览器仅支持命名曲线,命名曲线也应根据 RFC5915 使用。

EJBCA 6.0.0 的编码已更改,将于今年秋季晚些时候发布。您可以在此处的 EJBCA 问题跟踪器中找到问题,https: //jira.primekey.se/browse/ECA-3131 。用火狐测试。