Node.js TLS ECDHE-ECDSA-AES128-GCM-SHA256的密钥生成要求

Node.js TLS ECDHE-ECDSA-AES128-GCM-SHA256的密钥生成要求,node.js,cryptography,openssl,Node.js,Cryptography,Openssl,我想知道ECDHE-ECDSA-AES128-GCM-SHA256和ECDHE-ECDSA-AES128-GCM-SHA256是否有最低密钥生成要求?我正在尝试使用上述算法之一使TLS客户机和服务器相互连接,并不断接收“无共享密码错误”。我创建了一个CA用于签署客户端和服务器证书,并尝试仅使用openssl和node.js进行连接。我正在本地主机(127.0.0.1)上运行客户机和服务器,以消除任何其他可能的问题 以下是我迄今为止所做的工作: CA密钥对创建: $ openssl genrs

我想知道ECDHE-ECDSA-AES128-GCM-SHA256和ECDHE-ECDSA-AES128-GCM-SHA256是否有最低密钥生成要求?我正在尝试使用上述算法之一使TLS客户机和服务器相互连接,并不断接收“无共享密码错误”。我创建了一个CA用于签署客户端和服务器证书,并尝试仅使用openssl和node.js进行连接。我正在本地主机(127.0.0.1)上运行客户机和服务器,以消除任何其他可能的问题

以下是我迄今为止所做的工作:

CA密钥对创建:

  $ openssl genrsa -out ca-key.pem 4096
  $ openssl req -new -x509 -days 365 -key ca-key.pem -out ca-cert.pem
  $ openssl genrsa -out server-key.pem 4096
  $ openssl req -new -key server-key.pem -out server-csr.pem
  $ openssl x509 -req -days 365 -in server-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem 

  $ openssl genrsa -out client-key.pem 4096
  $ openssl req -new -key client-key.pem -out client-csr.pem
  $ openssl x509 -req -days 365 -in client-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -set_serial 02 -out client-cert.pem
服务器/客户端密钥对创建:

  $ openssl genrsa -out ca-key.pem 4096
  $ openssl req -new -x509 -days 365 -key ca-key.pem -out ca-cert.pem
  $ openssl genrsa -out server-key.pem 4096
  $ openssl req -new -key server-key.pem -out server-csr.pem
  $ openssl x509 -req -days 365 -in server-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem 

  $ openssl genrsa -out client-key.pem 4096
  $ openssl req -new -key client-key.pem -out client-csr.pem
  $ openssl x509 -req -days 365 -in client-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -set_serial 02 -out client-cert.pem
我最初试图从命令行(tls.createServer(),选项为:ciphers:'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256')连接到node.js服务器,但为了消除节点怀疑,我又回到openssl来创建客户端和服务器

以下命令正确连接客户端和服务器,并说明它使用的密码为“New,TLSv1/SSLv3,密码为ECDHE-RSA-AES256-GCM-SHA384”:

在服务器或客户端和服务器上指定密码时,以下命令不起作用。注意,ECDHE-ECDSA-AES128-GCM-SHA256密码在上述列表中被列为共享密码

$ openssl s_server -accept 8888 -cert server-cert.pem -key server-key.pem -pass stdin -CAfile ca-cert.pem -cipher ECDHE-ECDSA-AES128-GCM-SHA256
<password entered here>

<< Server output after client connection attempt >>
Using default temp DH parameters
Using default temp ECDH parameters
ACCEPT
ERROR
2674688:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1353:
shutting down SSL
CONNECTION CLOSED
ACCEPT


$ openssl s_client -connect 127.0.0.1:8888 -cert client-cert.pem -key client-key.pem -pass stdin -CAfile ca-cert.pem -cipher ECDHE-ECDSA-AES128-GCM-SHA256
<password entered here>

<<client output after connection attempt>>
CONNECTED(00000003)
2674688:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:708:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 166 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
$openssl s_服务器-接受8888-证书服务器-cert.pem-密钥服务器-key.pem-传递标准-CAfile ca-cert.pem-密码ECDHE-ECDSA-AES128-GCM-SHA256
>
使用默认的temp DH参数
使用默认的temp ECDH参数
接受
错误
2674688:错误:1408A0C1:SSL例程:SSL3_GET_CLIENT_HELLO:无共享密码:s3_srvr.c:1353:
关闭SSL
连接关闭
接受
$openssl s_client-connect 127.0.0.1:8888-cert client-cert.pem-key client-key.pem-pass stdin-CAfile ca-cert.pem-cipher ECDHE-ECDSA-AES128-GCM-SHA256
已连接(00000003)
2674688:错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报握手失败:s23_clnt.c:708:
---
没有可用的对等证书
---
未发送客户端证书CA名称
---
SSL握手读取了7个字节,写入了166个字节
---
新建,(无),密码为(无)
不支持安全重新协商
压缩:无
扩展:无
---

有人有什么想法吗?提前谢谢

您使用的钥匙类型错误

 openssl genrsa -out ca-key.pem 4096 
你需要使用

genrsa
生成一个RSA密钥,当与ECDHE一起使用时,该密钥对椭圆曲线Diffie-Hellman密钥交换(ECDHE)进行身份验证

ECDHE-ECDSA-AES128-GCM-SHA256中的ECDSA意味着您需要椭圆曲线数字签名算法来验证该密钥。因为您没有这些类型的密钥,所以命令失败。但是,ECDHE-RSA-AES256-GCM-SHA384可以工作,因为它使用您拥有的RSA密钥

您得到的是sha384,因为openssl选择了最强的密码套件,并且所有条件相同时,sha384比SH256好。您可以覆盖它,看起来您是用
--cipher
覆盖的

注意:您可能需要使用不同的曲线。您可以使用

openssl ecparam -list_curves

出于好奇,为什么是那个特定的密码套件?ECDHE和ECDSA是最先进的,但sha256只是标准的,AES 128当然足够好了,如果人们像ECDHE和ECDSA一样谨慎,他们倾向于使用256。

您使用的是什么版本的openssl?openssl版本我正在使用openssl 1.0.1 2012年3月14日,因此请确保使用“命名曲线”。有关详细信息,请参阅OpenSSL wiki上的。谢谢!这使我走上了正确的道路D我选择了要匹配的密码套件,应该在“可接受曲线”部分中选择,该部分分别指定使用secp256r1或secp384r1。为了进一步参考,我将发布我在openssl中使用的命令。我还必须设置demoCA目录及其内容,如本节中所列。我将其用于openssl示例来签署密钥。我必须先创建中提到的目录,然后才能签名。我使用了以下命令进行测试:
openssl s_server-accept 8888-cert server.cert-key server.key-pass stdin-CAfile ca.cert-cipher ECDHE-ECDSA-AES128-GCM-SHA256
openssl s_client-connect 127.0.0.1:8888-cert client.cert-key client.key-pass stdin-CAfile ca.cert-cipherECDHE-ECDSA-AES128-GCM-SHA256
挑剔:对于ECDHE-ECDSA,服务器密钥和客户端密钥(如果此处使用客户端身份验证)必须是ECC。CA密钥不需要是ECC,RSA仍然有效。但良好实践表明,任何CA密钥至少应与在其下签名的密钥一样强,因此(最小值)ECC 256要求使用NIST的等效值RSA>=3072。@dave_Thompson085挑剔^2:对于ECDHE-ECDSA密码,客户端密钥/证书可以是RSA。对于RSA密码,客户端密钥/证书可以是ECDSA。服务器上的验证阶段只希望得到一个受信任的证书,而不一定使用相同的密码。正如您所描述的,客户端的验证阶段更为严格。@kubanczyk:您说得对;那天我一定是产生幻觉了。客户端EE证书和密钥类型仅受CertificateRequest约束。还有一个缺点:在TLS1.2中,服务器的chain/CA证书受ClientHello中签名算法的约束,客户端的chain/CA证书受CertificateRequest中类似字段的约束,但在这两种情况下都不受ciphersuite的约束。
openssl ecparam -name secp521r1 -out client-key.pem -genkey
openssl ecparam -list_curves