2012-04-17 21 views
7

Tôi đã tự hỏi liệu có yêu cầu tạo khóa tối thiểu cho ECDHE-ECDSA-AES128-GCM-SHA256 và ECDHE-ECDSA-AES128-GCM-SHA256 không? Tôi đang cố gắng để có được một khách hàng TLS và máy chủ bằng cách sử dụng một trong các thuật toán trên để kết nối với nhau và tiếp tục nhận được 'không có lỗi mật mã được chia sẻ'. Tôi đã tạo một CA để ký các chứng chỉ máy khách và máy chủ, và cố gắng kết nối với chỉ openssl và cũng trong node.js. Tôi đang chạy cliengt và máy chủ trên localhost (127.0.0.1) để loại bỏ bất kỳ vấn đề khác có thể.Yêu cầu tạo khóa cho TLS ECDHE-ECDSA-AES128-GCM-SHA256

Dưới đây là những gì tôi đã làm cho đến nay:

CA then chốt tạo cặp:

$ openssl genrsa -out ca-key.pem 4096 
    $ openssl req -new -x509 -days 365 -key ca-key.pem -out ca-cert.pem 

Server/client cặp khóa tạo:

$ 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 

tôi ban đầu cố gắng để kết nối với một máy chủ node.js từ dòng lệnh (tls.createServer() với các tùy chọn: mật mã: 'ECDHE-ECDSA-AES256-GCM-SHA384: ECDHE-ECDSA-AES128-GCM-SHA256'), nhưng để loại bỏ sự nghi ngờ về nút, tôi đã giảm trở lại để mở ssl cho cả việc tạo máy khách và máy chủ.

Các lệnh sau đây ĐÚNG kết nối cho client và server và khẳng định nó được sử dụng một mật mã của "New, TLSv1/SSLv3, Cipher là 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> 

Với sự thông tin mật mã được chia sẻ như sau:

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 

Các lệnh sau KHÔNG hoạt động khi tôi chỉ định mật mã trên máy chủ hoặc máy khách và máy chủ. Lưu ý rằng mật mã ECDHE-ECDSA-AES128-GCM-SHA256 được liệt kê như được chia sẻ trong danh sách trên.

$ 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 
--- 

Có ai có ý tưởng nào không? Cảm ơn trước!

+0

Bạn đang sử dụng phiên bản openssl nào? openssl version –

+0

Tôi đang sử dụng OpenSSL 1.0.1 14 Mar 2012 – aspergillusOryzae

+0

Ngoài ra, hãy đảm bảo sử dụng "đường cong có tên". Để biết chi tiết, xem [Elliptic Curve Cryptography | Các đường cong được đặt tên] (https://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography#Named_Curves) trên wiki OpenSSL. – jww

Trả lời

14

Bạn đang làm cho các loại sai lầm của trọng với

openssl genrsa -out ca-key.pem 4096 

Bạn cần phải sử dụng ecparam

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

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

genrsa tạo ra một chìa khóa RSA rằng, khi được sử dụng với ECDHE, xác thực trao đổi khóa Elliptic Curve Diffie Hellman (E) CDHE).

ECDSA trong ECDHE-ECDSA-AES128-GCM-SHA256 có nghĩa là bạn cần Thuật toán chữ ký số Elliptic Curve để xác thực khóa đó. Bởi vì bạn không có những loại chìa khóa, lệnh thất bại. Tuy nhiên, ECDHE-RSA-AES256-GCM-SHA384 hoạt động vì nó sử dụng các khóa RSA mà bạn có.

Bạn nhận được sha384 vì openssl chọn bộ mã hóa mạnh nhất và tất cả mọi thứ bằng sha384 đều tốt hơn sha256. Bạn có thể ghi đè điều này và có vẻ như bạn đã làm như vậy với --cipher.

Lưu ý rằng bạn có thể muốn sử dụng đường cong khác.Bạn có thể nhận danh sách đầy đủ với

openssl ecparam -list_curves 

Vì tò mò, tại sao bộ mật mã cụ thể đó lại là? ECDHE và ECDSA là trạng thái của nghệ thuật, nhưng sha256 chỉ là tiêu chuẩn, và AES 128 chắc chắn là đủ tốt, mọi người có khuynh hướng sử dụng 256 nếu chúng thận trọng như hàm ECDHE và ECDSA ngụ ý.

+0

Cảm ơn! Điều đó đặt tôi đi đúng hướng. : D Tôi đã chọn các bộ mã hóa đó để khớp với [RFC 6460] (http://tools.ietf.org/html/rfc6460), và nên chọn phần 'Acceptable Curves' để chỉ định sử dụng secp256r1 hoặc secp384r1 tương ứng. Để tham khảo thêm, tôi sẽ đăng các lệnh mà tôi đã sử dụng trong openssl. Tôi cũng phải thiết lập thư mục demoCA và nội dung của nó như được liệt kê trong phần [ví dụ] (http://www.openssl.org/docs/apps/ca.html#EXAMPLES). – aspergillusOryzae

+0

Tôi đã sử dụng [Hướng dẫn đường dẫn Elliptic CA] này (http://this.is.thought.org/nz/elliptic-curve-ca-guide) cho các ví dụ mở để ký các khóa. Tôi đã phải tạo ra các thư mục được đề cập trong [ví dụ CA] (http://www.openssl.org/docs/apps/ca.html#EXAMPLES) trước khi tôi có thể ký bất cứ điều gì. Tôi đã sử dụng các lệnh sau để kiểm tra: 'openssl s_server -accept 8888 -cert server.cert -key server.key -pass stdin -CAfile ca.cert -cipher ECDHE-ECDSA-AES128-GCM-SHA256' và ' openssl s_client -connect 127.0.0.1:8888 -cert client.cert -key client.key -pass stdin -CAfile ca.cert -cipher ECDHE-ECDSA-AES128-GCM-SHA256' – aspergillusOryzae

+1

Nitpick: cho ECDHE-ECDSA khóa máy chủ, và khóa máy khách nếu auth client được sử dụng như ở đây, phải là ECC. Khóa CA không bắt buộc phải là ECC, RSA vẫn hoạt động. Tuy nhiên, thực hành tốt nói rằng bất kỳ phím CA nào phải ít nhất là * mạnh * như các phím được ký dưới nó, vì vậy (tối thiểu) ECC 256 yêu cầu RSA> = 3072 sử dụng các tương đương của NIST. –

Các vấn đề liên quan