2012-04-17 6 views
7

ECDHE-ECDSA-AES128-GCM-SHA256 ve ECDHE-ECDSA-AES128-GCM-SHA256 için minimum anahtar oluşturma gereksinimleri olup olmadığını merak ediyordum? Ben birbirine bağlamak ve 'hayır paylaşılan şifre hataları' almaya devam etmek yukarıdaki algoritmaları birini kullanarak TLS istemci ve sunucu almak için çalışıyorum. İstemci ve sunucu sertifikaları imzalamak için bir CA oluşturdum ve sadece openssl ve node.js. ile bağlantı kurmayı denedim. Diğer olası sorunları ortadan kaldırmak için localhost (127.0.0.1) üzerinde cliengt ve sunucu çalıştırıyorum.TLS için temel oluşturma gereksinimleri ECDHE-ECDSA-AES128-GCM-SHA256

CA anahtar çifti oluşturma:

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

Sunucu/İstemci anahtar çifti oluşturma: Burada

şimdiye kadar yapmış budur

$ 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 
Başlangıçta bağlanmaya çalışıyordu

bir node.js komut satırından sunucusu (tls.createServer() seçenekleri ile: şifrelere: 'ECDHE-ECDSA-AES256-GCM-SHA384: ECDHE-ECDSA-AES128-GCM-SHA256'), ama düştü düğüm şüpheyi ortadan kaldırmak için açmak için geri dön Hem istemci hem de sunucu oluşturma için ssl.

Aşağıdaki komutlar DOĞRU istemci ve sunucu için bağlanmak ve onu bir şifre kullanıyor devletler "Yeni, TLSv1/SSLv3, Şifreleme ECDHE-RSA-AES256-GCM-SHA384 olduğunu": With

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

Ben sunucuda bir şifre veya istemci ve sunucu belirtirken aşağıdaki komutlar çalışmaz OLMAYAN

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 

şu şekildedir: şifre bilgileri paylaştı. Yukarıdaki listede paylaşılan olarak ECDHE-ECDSA-AES128-GCM-SHA256 şifreleme listelenen unutmayı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 
--- 

Herhangi bir fikri olan var mı? Şimdiden teşekkürler!

+0

Hangi sürümleri kullanıyorsunuz? openssl version –

+0

OpenSSL 1.0.1 kullanıyorum 14 Mar 2012 – aspergillusOryzae

+0

Ayrıca "adlandırılmış eğri" kullandığınızdan emin olun. Detaylar için [Elliptic Curve Cryptography | Adlandırılmış Eğriler] (https://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography#Named_Curves) OpenSSL wiki'sinde. – jww

cevap

14

Sen ecparam

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

ve

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

genrsa kullanmak gerekir

openssl genrsa -out ca-key.pem 4096 

ile anahtarın yanlış tür ile kullanıldığında, bu bir RSA anahtarını oluşturur yapıyoruz ECDHE, Eliptik Eğri Diffie Hellman anahtar Exchange (E) doğrular. CDHE).

ECDHE-ECDSA-AES128-GCM-SHA256'daki ECDSA, bu anahtarı doğrulamak için Eliptik Eğri Dijital İmza Algoritmasına ihtiyaç duyduğunuz anlamına gelir. Bu tür anahtarların olmadığı için, komut başarısız olur. Eğer varsa RSA anahtarları kullanır Ancak, ECDHE-RSA-AES256-GCM-SHA384 çalışır.

Openssl güçlü bir şifre seti alır ve eşit SHA384 olmanın her şeyin SHA256 daha iyidir çünkü SHA384 alıyorsanız. Bunu geçersiz edebilir ve --cipher ile çok yapmış gibi görünüyor.

Farklı bir eğri kullanmak isteyebileceğinizi unutmayın.Tam listeyi

Bu özel şifreleme paketi neden olsun? ECDHE ve ECDSA en son teknolojidir, ancak sha256 sadece standarttır ve AES 128 kesinlikle yeterince iyidir, insanlar ECDHE ve ECDSA'nın ima ettiği gibi temkinli davranırsa 256'yı kullanma eğilimindedir.

+0

Teşekkürler! Bu beni doğru yola koydu. : D Bu şifre setlerini [RFC 6460] (http://tools.ietf.org/html/rfc6460) ile eşleştirdim ve sırasıyla secp256r1 veya secp384r1 kullanarak belirten 'Kabul Edilebilir Eğriler' bölümüne bakmalıydım. Daha fazla referans için openssl'de kullandığım komutları yayınlayacağım. Ayrıca demoCA dizinini ve içeriğini [örnekler] (http://www.openssl.org/docs/apps/ca.html#EXAMPLES) bölümünde listelenen şekilde kurmam gerekiyordu. – aspergillusOryzae

+0

Bu [Elliptic Curve CA kılavuzunu] (http://this.is.thoughtcrime.org.nz/elliptic-curve-ca-guide) tuşlarını imzalamak için openssl örnekleri için kullandım. Herhangi bir şeyi imzalayabilmem için [CA örnekleri] 'de (http://www.openssl.org/docs/apps/ca.html#EXAMPLES) belirtilen dizinleri oluşturmam gerekiyordu. Ben test etmek için aşağıdaki komutları kullanılır: 'Openssl s_server -accept 8888 -cert server.cert tuşlu server.key -pass Stdin -CAfile ca.cert -cipher ECDHE-ECDSA-AES128-GCM-SHA256' ve ' 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: ECDHE-ECDSA için sunucu anahtarı, ve istemci anahtarı, burada olduğu gibi kullanıldığında, müşteri anahtarı ECC olmalıdır. CA anahtarının ECC olması gerekmez, RSA hala çalışır. Ancak iyi uygulama, herhangi bir CA anahtarının en az * güçlü * altının altında imzalanmış anahtarlar kadar olması gerektiğini söyler, bu nedenle (minimum) ECC 256, NIST eşdeğerlerini kullanarak RSA> = 3072 gerektirir. –