没有可用于特定 ECDSA 证书的密码
No ciphers available for specific ECDSA certificate
我正在构建通过 openssl 与在线服务器通信的物联网设备原型。
该软件使用我自己的 subca 签名的 ECDSA 证书。
问题似乎是该证书没有可用的密码。
为了测试所有内容,我在服务器端使用了 openssl s_server,在客户端使用了 nmap ssl-enum-ciphers 脚本。 nmap returns 一个无效的密码列表。
给服务器的命令是:
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
您的证书使用的是 brainpoolP160r1 曲线。 libcrypto 支持此曲线,但 libssl 不支持。可能是因为这不够安全(它只提供相当于 80 位的安全性)。如果您尝试不同的(更安全的)曲线,您可能会得到更好的结果。
您没有说明您使用的是什么版本的 OpenSSL。请注意,在 OpenSSL 1.1.0 中,OpenSSL 支持的 "default" 曲线是 X25519、P-256、P-384 和 P-512。如果你想使用其他曲线,你可能必须使用 s_server 的“-curves”参数明确声明它们。 libssl 在 OpenSSL 1.1.0 中支持的唯一脑池曲线是 brainpoolP256r1、brainpoolP384r1 和 brainpoolP512r1。
编辑:
我还注意到您有一个 "Key Encipherment" 的 X509v3 密钥用法,这对 ECDSA 证书没有任何意义(ECDSA 不能 "encipher" 任何东西;它是一种数字签名算法) .将密钥用法更改为 "Digital Signature"(或完全放弃)。
问题已解决。
我用 prime256v1 更改了 brainpoolP160r1,并从签署 CA 的 openssl.conf 中删除了 keyUsage=KeyEncipherment,
然后它开始按预期工作。现在我猜为什么?
RFC 5280 第 4.2.1.3 节说:
The keyEncipherment bit is asserted when the subject public key is
used for enciphering private or secret keys, i.e., for key
transport. For example, this bit shall be set when an RSA public
key is to be used for encrypting a symmetric content-decryption
key or an asymmetric private key.
这是在 ssl 握手期间出现的吗?
我正在构建通过 openssl 与在线服务器通信的物联网设备原型。 该软件使用我自己的 subca 签名的 ECDSA 证书。
问题似乎是该证书没有可用的密码。 为了测试所有内容,我在服务器端使用了 openssl s_server,在客户端使用了 nmap ssl-enum-ciphers 脚本。 nmap returns 一个无效的密码列表。
给服务器的命令是:
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
您的证书使用的是 brainpoolP160r1 曲线。 libcrypto 支持此曲线,但 libssl 不支持。可能是因为这不够安全(它只提供相当于 80 位的安全性)。如果您尝试不同的(更安全的)曲线,您可能会得到更好的结果。
您没有说明您使用的是什么版本的 OpenSSL。请注意,在 OpenSSL 1.1.0 中,OpenSSL 支持的 "default" 曲线是 X25519、P-256、P-384 和 P-512。如果你想使用其他曲线,你可能必须使用 s_server 的“-curves”参数明确声明它们。 libssl 在 OpenSSL 1.1.0 中支持的唯一脑池曲线是 brainpoolP256r1、brainpoolP384r1 和 brainpoolP512r1。
编辑:
我还注意到您有一个 "Key Encipherment" 的 X509v3 密钥用法,这对 ECDSA 证书没有任何意义(ECDSA 不能 "encipher" 任何东西;它是一种数字签名算法) .将密钥用法更改为 "Digital Signature"(或完全放弃)。
问题已解决。 我用 prime256v1 更改了 brainpoolP160r1,并从签署 CA 的 openssl.conf 中删除了 keyUsage=KeyEncipherment, 然后它开始按预期工作。现在我猜为什么? RFC 5280 第 4.2.1.3 节说:
The keyEncipherment bit is asserted when the subject public key is used for enciphering private or secret keys, i.e., for key transport. For example, this bit shall be set when an RSA public key is to be used for encrypting a symmetric content-decryption key or an asymmetric private key.
这是在 ssl 握手期间出现的吗?