【问题标题】:No ciphers available for specific ECDSA certificate没有可用于特定 ECDSA 证书的密码
【发布时间】:2017-12-23 00:30:47
【问题描述】:

我正在构建一个通过 openssl 与在线服务器通信的 IOT 设备原型。 该软件使用我自己的 subca 签名的 ECDSA 证书。

问题似乎没有可用于该证书的密码。 为了测试整个事情,我在服务器端使用了 openssl s_server,在客户端使用了 nmap ssl-enum-ciphers 脚本。 nmap 返回一个无效的密码列表。

给服务器的命令是:

openssl s_server -accept 4433 -cert server1.crt -certform PEM -key server1.key

这是我在服务器端使用的证书。

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 256 (0x100)
Signature Algorithm: ecdsa-with-SHA256
    Issuer: C=IT, O=wwwtech, CN=wwwtech Server CA
    Validity
        Not Before: Jul 17 12:11:31 2017 GMT
        Not After : Jul 17 12:11:31 2019 GMT
    Subject: C=IT, O=wwwtech, CN=server1
    Subject Public Key Info:
        Public Key Algorithm: id-ecPublicKey
            Public-Key: (160 bit)
            pub: 
                04:1c:e3:02:ec:bc:0f:88:7a:58:0b:36:b6:55:2c:
                e5:f1:67:5f:a0:7a:c3:c9:4b:7c:45:02:42:61:20:
                0c:4d:30:22:f6:c7:09:b5:ef:e1:8e
            ASN1 OID: brainpoolP160r1
    X509v3 extensions:
        X509v3 Basic Constraints: 
            CA:FALSE
        X509v3 Key Usage: 
            Key Encipherment
        Netscape Cert Type: 
            SSL Server
        Netscape Comment: 
            AreaWFI Server Certificate
        X509v3 Subject Key Identifier: 
            8D:92:1A:9F:6A:AB:D2:E5:6B:72:CB:25:A9:15:27:38:08:CE:DE:A9
        X509v3 Authority Key Identifier: 
            keyid:E7:2F:0E:A7:39:B4:85:46:FE:2A:EA:9F:0A:FE:54:F4:B9:A5:B6:AC

        X509v3 Subject Alternative Name: 
            IP Address:127.0.0.1
Signature Algorithm: ecdsa-with-SHA256
     30:44:02:20:32:f1:d1:90:08:f1:dc:a5:9d:30:d3:db:4b:05:
     6c:d2:41:cc:ac:6f:01:f8:90:0d:a5:25:27:4d:f9:38:62:14:
     02:20:19:37:c4:7c:07:e9:07:2d:c8:6e:1f:a4:db:4e:44:48:
     68:4a:e9:9d:03:68:b3:b0:c6:31:60:92:ed:54:5c:22

【问题讨论】:

    标签: ssl openssl ssl-certificate ecdsa


    【解决方案1】:

    您的证书使用的是brainpoolP160r1 曲线。此曲线由 libcrypto 支持,但 由 libssl 支持。可能是因为这不够安全(它只提供相当于 80 位的安全性)。如果您尝试不同的(更安全的)曲线,您可能会得到更好的结果。

    您没有说您使用的是什么版本的 OpenSSL。请注意,在 OpenSSL 1.1.0 中,OpenSSL 支持的“默认”曲线是 X25519、P-256、P-384 和 P-512。如果您想使用其他曲线,您可能必须使用 s_server 的“-curves”参数显式声明它们。在 OpenSSL 1.1.0 中 libssl 支持的唯一脑池曲线是脑池P256r1、脑池P384r1 和脑池P512r1。

    编辑:

    我还注意到您有一个“密钥加密”的 X509v3 密钥用法,这对 ECDSA 证书没有任何意义(ECDSA 不能“加密”任何东西;它是一种数字签名算法)。将密钥用法更改为“数字签名”(或完全放弃)。

    【讨论】:

    • 我使用 OpenSSL 1.0.2g。我认为 BrainpoolP160r1 受到支持,因为 openssl ecparam -list_curves 显示它。非常感谢。
    • 该 ecparam 选项列出了 libcrypto 支持的所有曲线,这比 libssl 支持的列表要长得多。并非所有曲线都被认为适合 SSL/TLS 使用。在 1.0.2g 中,libssl 默认曲线列表比 1.1.0 中的要长。它包括 P-256、P-384、P-512 以及类似大小的脑池曲线和一些杂项,很少使用,其他。 1.0.2g 中支持的曲线的完整列表(您必须使用“-curves”启用)是一个很长的列表,但仍然不包括 BrainpoolP160r1。
    • 1.0.2 中 libssl 支持的曲线的完整列表在这里:github.com/openssl/openssl/blob/OpenSSL_1_0_2-stable/ssl/…
    • 我尝试使用 prime256v1 曲线(由 openssl 建议代替 secp256r1 ),但没有运气。 nmap 没有列出任何内容,如果我尝试将 s_server 与 -www 开关与浏览器连接,我将获得 SSL_ERROR_NO_CYPHER_OVERLAP。
    • prime256v1 和 secp256r1 是同义词。但是我注意到您的原始证书有一个非常奇怪的密钥使用设置。如果您的新基于 P-256 的证书具有相同的设置,那么这将是有问题的。我用这个信息更新了我的答案。
    【解决方案2】:

    问题解决了。 我用 prime256v1 更改了 brainpoolP160r1 并从签署 CA 的 openssl.conf 中删除了 keyUsage=KeyEncipherment, 然后它开始按预期工作。现在我猜为什么? RFC 5280 第 4.2.1.3 节说:

    keyEncipherment 位在主题公钥为 用于加密私钥或秘密密钥,即用于密钥 运输。例如,当 RSA public 密钥将用于加密对称内容解密 密钥或非对称私钥。

    这是否在 ssl 握手期间出现?

    【讨论】:

    • 很高兴你能成功(请把我的答案标记为正确?)。 RSA 和 ECDSA 证书在 SSL/TLS 中的工作方式不同。使用 RSA 证书,客户端选择一个密钥并使用公钥对其进行加密。所以设置“密钥加密”对于 RSA 是正确的。 ECDSA 不以这种方式使用。相反,它与 ECDHE 结合使用。 ECDHE 是一种密钥协商算法,即。两个对等点相互计算一个共享的秘密——但密钥本身永远不会通过网络发送。服务器使用 ECDSA 对握手进行数字签名以进行身份​​验证。因此,“密钥加密”对于 ECDSA 是不正确的。
    猜你喜欢
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多