2017-07-18 30 views
0

我正在构建通过openssl与在线服务器进行通信的IOT设备的原型。 该软件使用我自己的subca签署的ECDSA证书。没有密码可用于特定的ECDSA证书

问题似乎没有该证书的密码availlable。 为了测试我在服务器端使用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 

回答

2

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

你不说你正在使用哪个版本的OpenSSL。请注意,在OpenSSL 1.1.0中,OpenSSL支持的“默认”曲线是X25519,P-256,P-384和P-512。如果要使用其他曲线,则可能必须使用s_server的“-curves”参数明确指出它们。 libssl在OpenSSL 1.1.0中唯一支持的brainpool曲线是brainpoolP256r1,brainpoolP384r1和brainpoolP512r1。

编辑:

我也注意到你有“密钥加密”的采用X509v3密钥用法不作任何意义的ECDSA证书(ECDSA不能“:编码”任何东西;它是一个数字签名算法)。将密钥用法更改为“数字签名”(或完全放弃)。

+0

我使用OpenSSL 1.0.2g。我以为brainpoolP160r1被支持,因为openssl ecparam -list_curves显示它。非常感谢你。 –

+0

ecparam选项列出了libcrypto支持的所有曲线,这是比libssl支持的列表长得多的列表。并非所有曲线都被认为适用于SSL/TLS使用。在1.0.2g中,libssl默认曲线列表比1.1.0更长。它包括P-256,P-384,P-512以及类似尺寸的脑池曲线和一些其他的很少使用的其他的。 1.0.2g中支持的曲线的完整列表(您必须使用“-curves”启用)是一个很长的列表,但仍不包含brainpoolP160r1。 –

+0

1.0.2中libssl支持的曲线列表如下:https://github.com/openssl/openssl/blob/OpenSSL_1_0_2-stable/ssl/t1_lib。c#L290 –

0

问题已解决。 我用prime256v1更改了brainpoolP160r1,并从签名CA的openssl.conf中删除了keyUsage = KeyEncipherment,然后按照预期开始工作。现在我猜为什么? RFC 5280部分4.2.1.3说:当使用者公钥是用来加密或私有密钥,即重点 运输

的keyEncipherment位被断言。例如,当RSA公钥 密钥将用于加密对称内容解密 密钥或非对称私钥时,应设置此位。

在ssl握手过程中是否出现此问题?

+0

很高兴你的工作(请标记我的答案是正确的?)。 SSL/TLS中的RSA和ECDSA证书的工作方式不同。通过RSA证书,客户端选择一个密钥并使用公钥对其进行加密。因此,设置“密钥加密”对于RSA是正确的。 ECDSA不以这种方式使用。相反,它与ECDHE一起使用。 ECDHE是一个关键的协议算法,即。两个对等体相互计算共享密钥 - 但密钥本身绝不会在线路上发送。 ECDSA由服务器用于数字签名握手以进行身份​​验证。因此,“密钥加密”对于ECDSA是不正确的。 –

相关问题