10

ECDHE-ECDSA-AES128-GCM-SHA256 および ECDHE-ECDSA-AES128-GCM-SHA256 に最小限のキー生成要件があるかどうか疑問に思っていましたか? 上記のアルゴリズムのいずれかを使用して TLS クライアントとサーバーを相互に接続し、「共有暗号エラーなし」を受信し続けようとしています。クライアント証明書とサーバー証明書に署名するための CA を作成し、openssl と node.js だけで接続を試みました。クライアントとサーバーを localhost (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

私はもともとコマンドラインから node.js サーバーに接続しようとしていました (tls.createServer() with options: ciphers: 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256'),しかし、ノードの疑いをなくすために、クライアントとサーバーの作成の両方で openssl に戻りました。

次のコマンドは、クライアントとサーバーに正しく接続し、「New、TLSv1/SSLv3、Cipher is ECDHE-RSA-AES256-GCM-SHA384」の暗号を使用していると述べています。

$ openssl s_server -accept 8888 -cert server-cert.pem -key server-key.pem -pass stdin -CAfile ca-cert.pem  -state
<password entered here>

$ openssl s_client -connect 127.0.0.1:8888 -cert client-cert.pem -key client-key.pem -pass stdin -CAfile ca-cert.pem -state
<password entered here>

共有暗号情報は次のとおりです。

Shared ciphers:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-R
SA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES2
56-SHA:SRP-DSS-AES-256-CBC-SHA:SRP-RSA-AES-256-CBC-SHA:DHE-DSS-AES256-GCM-SHA384
:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DHE-RSA-A
ES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:ECD
H-RSA-AES256-GCM-SHA384:ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256-SHA384:ECDH
-ECDSA-AES256-SHA384:ECDH-RSA-AES256-SHA:ECDH-ECDSA-AES256-SHA:AES256-GCM-SHA384
:AES256-SHA256:AES256-SHA:CAMELLIA256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES
-CBC3-SHA:SRP-DSS-3DES-EDE-CBC-SHA:SRP-RSA-3DES-EDE-CBC-SHA:EDH-RSA-DES-CBC3-SHA
:EDH-DSS-DES-CBC3-SHA:ECDH-RSA-DES-CBC3-SHA:ECDH-ECDSA-DES-CBC3-SHA:DES-CBC3-SHA
:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA2
56:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:SRP-DSS
-AES-128-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:DHE-DSS-AES128-GCM-SHA256

サーバー、またはクライアントとサーバーで暗号を指定すると、次のコマンドが機能しません。上記のリストでは、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
---

誰にもアイデアはありますか?前もって感謝します!

4

1 に答える 1

17

あなたは間違った種類の鍵を作っています

 openssl genrsa -out ca-key.pem 4096 

ecparamを使用する必要があります

openssl ecparam -name secp521r1 -out ca-key.pem -genkey

openssl ecparam -name secp521r1 -out client-key.pem -genkey

genrsaECDHE と共に使用すると、楕円曲線 Diffie Hellman 鍵交換 (ECDHE) を認証する RSA 鍵を生成します。

ECDHE-ECDSA-AES128-GCM-SHA256 の ECDSA は、そのキーを認証するために楕円曲線デジタル署名アルゴリズムが必要であることを意味します。これらの種類のキーがないため、コマンドは失敗します。ただし、 ECDHE-RSA-AES256-GCM-SHA384 は、所有している RSA キーを使用するため機能します。

openssl が最強の暗号スイートを選択し、すべてが等しい場合、sha384 は sha256 よりも優れているため、sha384 を取得しています。これをオーバーライドできます--cipher

別の曲線を使用したい場合があることに注意してください。で完全なリストを取得できます

openssl ecparam -list_curves

好奇心から、なぜその特定の暗号スイートなのですか? ECDHE と ECDSA は最先端ですが、sha256 は単なる標準であり、AES 128 で十分です。ECDHE と ECDSA が暗示するように用心深い人は 256 を使用する傾向があります。

于 2012-04-17T05:59:14.267 に答える