2012-06-19 10 views
14

मुझे निर्यात ग्रेड सिफर के साथ M2Crypto SSLServer चलाने में कठिनाई हो रही है।EXP (ORT) सिफर और M2Crypto/OpenSSL

कम/मध्यम/उच्च ग्रेड सिफर बिना किसी समस्या के काम करते हैं, लेकिन निर्यात अभी नहीं होगा। साथ ही, जब ओपनएसएसएल एक कमांड लाइन से सर्वर मोड में चलाया जाता है तो यह किसी भी समस्या के बिना निर्यात ग्रेड सिफर स्वीकार करता है।

तो, या तो मुझे कुछ याद आ रहा है या M2Crypto मॉड्यूल में कोई समस्या है। किसी भी मदद की सराहना की है।

प्रयुक्त अजगर कोड (ssl-server.py) इस तरह दिखता है:

import M2Crypto 
import socket 

CERTFILE = "dummy_cert.pem" 
KEYFILE = "dummy_key.pem" 
PROTOCOL = "sslv3" 
HOST = "0.0.0.0" 
PORT = 4433 

def main(): 
    print "[i] Initializing context ..." 
    ctx = M2Crypto.SSL.Context(protocol=PROTOCOL, weak_crypto=True) 
    ctx.load_cert_chain(certchainfile=CERTFILE, keyfile=KEYFILE) 
    ctx.set_options(M2Crypto.m2.SSL_OP_ALL) 
    ctx.set_cipher_list("ALL") 

    print "[i] Initializing socket ..." 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.bind((HOST, PORT)) 
    sock.listen(1) 
    conn, addr = sock.accept() 

    print "[i] SSL handshake ..." 
    ssl_conn = M2Crypto.SSL.Connection(ctx=ctx, sock=conn) 
    ssl_conn.setup_ssl() 
    try: 
     ssl_conn_res = ssl_conn.accept_ssl() 
    except Exception, ex: 
     print "[x] SSL connection failed: '%s'" % str(ex) 
    else: 
     if ssl_conn_res == 1: 
      print "[i] SSL connection accepted" 
     else: 
      print "[x] SSL handshake failed: '%s'" % ssl_conn.ssl_get_error(ssl_conn_res) 

if __name__ == "__main__": 
    main() 

लक्षण हैं: एक dummy_key.pem की

-----BEGIN CERTIFICATE----- 
MIICkTCCAfqgAwIBAgIBAjANBgkqhkiG9w0BAQUFADAfMQswCQYDVQQGEwJCRTEQ 
MA4GA1UEAxMHdGVzdC1jYTAeFw0xMjA1MDYwODQyNDlaFw0yMjA1MDMwODQyNDla 
MCcxCzAJBgNVBAYTAkJFMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wgZ8wDQYJ 
KoZIhvcNAQEBBQADgY0AMIGJAoGBAL7OBv9wRwtNjN984XSy22/rw6tHM6Lq/Ccf 
NoHKbqwC+PsxgmgJJiGBGewrzBR42toqHJi7EjHhuvrgqV9s2duPQBAANh7tzY1h 
6VekrwhIIt4o1h0F2KB16VXA8s918d+8pRGt2T11GUh/QT3m9yY1VzqdIBeAfklC 
ET6ncPK/AgMBAAGjgdQwgdEwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBkAw 
KwYJYIZIAYb4QgENBB4WHFRpbnlDQSBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYD 
VR0OBBYEFNGQArEZPKprJTn7A64qEFfl0m4xME8GA1UdIwRIMEaAFFuITOUJlGrJ 
9lKufs8cm1MpwXrroSOkITAfMQswCQYDVQQGEwJCRTEQMA4GA1UEAxMHdGVzdC1j 
YYIJALimgW7YUgdrMAkGA1UdEgQCMAAwCQYDVR0RBAIwADANBgkqhkiG9w0BAQUF 
AAOBgQDWh8A0eBxI9XHy68xdjFsk2oerJeV6qqlcmtPZgz3GlarRcWcKsRJOyLLL 
dCOe7tY5isWQAoLt6XALzDWjbQkTJnxBaKHif1MIikuajaYKT7LA1MvFn50Qrm6n 
f9hG7gvdTpm1rlPcs0qibp1vJVubkU51mT6JT4UnLfeVIjtL7Q== 
-----END CERTIFICATE----- 

सामग्री:

$ uname -a 
Linux XYZ 2.6.38-15-generiC#59-Ubuntu SMP Fri Apr 27 16:03:32 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux 

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu 
DISTRIB_RELEASE=11.04 
DISTRIB_CODENAME=natty 
DISTRIB_DESCRIPTION="Ubuntu 11.04" 

$ python -c "import M2Crypto;print M2Crypto.version_info" 
(0, 20, 1) 

$ openssl version 
OpenSSL 0.9.8o 01 Jun 2010 

1) NOT OK 
SERVER (terminal 1): $ python ssl-server.py 
CLIENT (terminal 2): $ openssl s_client -connect localhost:4433 -cipher EXPORT 
CONNECTED(00000003) 
28131:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:602: 

2) OK 
SERVER (terminal 1): $ openssl s_server -cert dummy_cert.pem -key dummy_key.pem -ssl3 -no_tls1 -no_ssl2 -cipher EXPORT 
CLIENT (terminal 2): $ openssl s_client -connect localhost:4433 -cipher EXPORT 
CONNECTED(00000003) 
depth=0 C = BE, CN = www.example.com 
verify error:num=20:unable to get local issuer certificate 
verify return:1 
depth=0 C = BE, CN = www.example.com 
verify error:num=27:certificate not trusted 
verify return:1 
depth=0 C = BE, CN = www.example.com 
verify error:num=21:unable to verify the first certificate 
verify return:1 
--- 
Certificate chain 
0 s:/C=BE/CN=www.example.com 
    i:/C=BE/CN=test-ca 
--- 
Server certificate 
-----BEGIN CERTIFICATE----- 
... 
-----END CERTIFICATE----- 
subject=/C=BE/CN=www.example.com 
issuer=/C=BE/CN=test-ca 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 1141 bytes and written 242 bytes 
--- 
New, TLSv1/SSLv3, Cipher is EXP-EDH-RSA-DES-CBC-SHA 
Server public key is 1024 bit 
Secure Renegotiation IS supported 
Compression: zlib compression 
Expansion: zlib compression 
SSL-Session: 
    Protocol : SSLv3 
    Cipher : EXP-EDH-RSA-DES-CBC-SHA 
    Session-ID: B052D5D5A436F9A0B9D3FB24F2E32A8A06A0B6828230621C4CFAEB82A0A9AE0C 
    Session-ID-ctx: 
    Master-Key:  47F6E3720D06518B961FE389F13BCDE42C37F703099ABBB9B3DA35383C420F519D4F4773D35E470CF6FF7BB243B29069 
    Key-Arg : None 
    PSK identity: None 
    PSK identity hint: None 
    SRP username: None 
    Compression: 1 (zlib compression) 
    Start Time: 1340644713 
    Timeout : 300 (sec) 
    Verify return code: 21 (unable to verify the first certificate) 
--- 

एक dummy_cert.pem की सामग्री इस प्रकार है निम्नानुसार है:

-----BEGIN RSA PRIVATE KEY----- 
MIICXgIBAAKBgQC+zgb/cEcLTYzffOF0sttv68OrRzOi6vwnHzaBym6sAvj7MYJo 
CSYhgRnsK8wUeNraKhyYuxIx4br64KlfbNnbj0AQADYe7c2NYelXpK8ISCLeKNYd 
BdigdelVwPLPdfHfvKURrdk9dRlIf0E95vcmNVc6nSAXgH5JQhE+p3DyvwIDAQAB 
AoGBAIZldIRkP4Z0n2+j9OJQQUS6Wl7AjlyJDAc6cxhE0GOUzG+S1foVx6f92ZaC 
2wLoha75zp691fkQuLWRnXu7nk9QwxQdOppKijIPHdL2cYtUc9UCedN5rExjpcOP 
4Hjwf17YOxK2J0zzmG1djTBB47BKGUedSQ7E1QxGcrESS2XxAkEA+6ey2jy8etWi 
QmCdJJIxXwKRVHCmt5LVwj+IOk/u3sr1AGfBm7spKGU3boCiFt4FmjGMax7B9r/e 
zPaMb34guwJBAMIZX7Vv5gfjvWtgp6pyE/UkjRSOKBpuy9gyiqtLBJwehj/qsBqr 
O6tFmjMFiudVusnVSrEFGAPLV52xf0U4580CQQDkEQ1UH2spX2dYBLslo6A+3NLc 
1eMhx18WVgGd50cyfnkfzuh1vF8GjwR3jvhXBQvKvFDn284pU6YV1vNbL9F1AkEA 
o2CwSwyRV3q+6i9Fchbr7aCCkBbIctdoBeclCeHvU2nuHsbwzMHtS9EeZmv365kh 
zNoYMMDU4fy7FyVct2ua0QJASXtIwYKZ2CAP+lAQqfh+knRRqtqdLt4Lt0mpML5m 
UtsECS8frKeF3mynXfsyRkvC8F2WFiJVJ3+D+y3zYNGlZg== 
-----END RSA PRIVATE KEY----- 

अद्यतन: निम्न स्तर पर हाथ मिलाना पैकेट यह और भी अधिक अजीब बना रही है कि random[32] क्षेत्र को छोड़कर एक ही होने लगते हैं।

एसएसएल डंप (ssldump -a -A -H -i lo) दोनों ही मामलों के लिए यहां पाया जा सकता:

http://pastebin.com/YuC7d8zg (नहीं ठीक मामले)

http://pastebin.com/U6YGQmv9 (ठीक मामले)

+0

आपका पीकेआई सही ढंग से सेटअप नहीं किया गया है, आपका ओके केस केवल एक अज्ञात एसएसएल कनेक्शन दिखाता है, जिसे अनुमति नहीं दी जानी चाहिए। आपका सर्वर क्लाइंट को कोई प्रमाण पत्र नहीं भेजता है। ध्यान दें कि एसएसएल स्टैक के माध्यम से डीबगिंग इस मंच के लिए थोड़ा सा है; इसमें अक्सर बहुत सारे प्रयास/परीक्षण/पुनः प्रयास पुनरावृत्तियों को शामिल किया जाता है जिसे वास्तव में अच्छी तरह से स्टैक ओवरफ्लो का प्रतिनिधित्व नहीं किया जा सकता है, और इसमें काफी समय लगता है। –

+0

हम M2Crypto के साथ प्रोग्रामेटिक रूप से उस ओके केस (openssl s_server) को पुन: उत्पन्न करने की कोशिश कर रहे हैं। पीकेआई यहां अप्रासंगिक है। ठीक स्थिति में निर्यात cipher चुना जाता है जबकि M2Crypto में नहीं है। बात यह है कि सब कुछ कम, मध्यम और उच्च के साथ ठीक से काम करता है, लेकिन निर्यात के साथ नहीं। – stamparm

+0

बस सोच रहा है कि आप पहली बार निर्यातक सिफर का उपयोग क्यों करना चाहते हैं। [उन्हें टीएलएस 1.1 में प्रतिबंधित होने के लिए पर्याप्त रूप से कमजोर माना जाता है] (http://tools.ietf.org/html/rfc4346#appendix-A.5) (6 साल पहले अंतिम रूप दिया गया): "* टीएलएस 1.1 क्लाइंट को जांचना होगा कि सर्वर ने हैंडशेक के दौरान इनमें से एक सिफर सुइट्स का चयन नहीं किया। * " – Bruno

उत्तर

5

मैं अजगर स्क्रिप्ट के लिए निम्न दो में तोड़ मरोड़ की जरूरत यह सिफ़र सुइट निर्यात के साथ काम करने के लिए:

PROTOCOL = "sslv23" 
... 
    print "[i] Initializing context ..." 
    ctx = M2Crypto.SSL.Context(protocol=PROTOCOL, weak_crypto=True) 
    ctx.load_cert_chain(certchainfile=CERTFILE, keyfile=KEYFILE) 
    ctx.set_options(M2Crypto.m2.SSL_OP_ALL) 
    ctx.set_tmp_rsa(M2Crypto.RSA.gen_key(512, 65537)) 
    ctx.set_cipher_list("ALL") 

है:

  1. एसएसएलवी 23 प्रोटोकॉल पहचानकर्ता (एसएसएलवी 2/वी 3 कम्पैट मोड) के रूप में उपयोग करें। निश्चित नहीं है कि इस मामले में इसकी आवश्यकता क्यों है, लेकिन ऐसा लगता है कि अन्यथा काम नहीं करना है।
  2. set_tmp_rsa() का उपयोग कर संदर्भ पर अस्थायी, अल्पकालिक आरएसए कुंजी सेट करें। यह आवश्यक है क्योंकि निर्यात सिफर के साथ, प्रदान की गई (1024-बिट) आरएसए कुंजी केवल प्रमाणीकरण (हस्ताक्षर) के लिए उपयोग की जाती है, जबकि अस्थायी, निर्यात-अपंग 512-बिट आरएसए कुंजी गोपनीयता (एन्क्रिप्शन) के लिए उपयोग की जाती है। ओपनएसएसएल के लिए आपको इस कुंजी को संदर्भ पर सेट अप करने की आवश्यकता है (documentation of SSL_set_tmp_rsa() देखें)।

अजीब तरह से पर्याप्त है, यह भी SSLv2-ओनली मोड एक अस्थायी RSA कुंजी की स्थापना के बिना (जब परीक्षण openssl s_client पर -ssl2 का उपयोग) में काम करता है (set_tmp_rsa लिपि में बाहर टिप्पणी की कॉल करने के लिए)। मुझे कोई जानकारी नहीं है की क्यों।

सामान्यतः, कुछ सिफर सुइट्स को संदर्भ में विशेष कुंजी जोड़ने की आवश्यकता होती है, उदा। डीएच (समूह पैरामीटर) या ईसीडीएच (वक्र) का उपयोग कर सूट। प्रत्येक सिफर सूट के लिए वास्तव में क्या उपयोग किया जाता है, यह देखने के लिए, openssl ciphers -v अंतर्दृष्टिपूर्ण हो सकता है, उदा।:

% openssl ciphers -v EXPORT 
EXP-EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH(512) Au=RSA Enc=DES(40) Mac=SHA1 export 
EXP-EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH(512) Au=DSS Enc=DES(40) Mac=SHA1 export 
EXP-ADH-DES-CBC-SHA  SSLv3 Kx=DH(512) Au=None Enc=DES(40) Mac=SHA1 export 
EXP-DES-CBC-SHA   SSLv3 Kx=RSA(512) Au=RSA Enc=DES(40) Mac=SHA1 export 
EXP-RC2-CBC-MD5   SSLv3 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export 
EXP-RC2-CBC-MD5   SSLv2 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export 
EXP-ADH-RC4-MD5   SSLv3 Kx=DH(512) Au=None Enc=RC4(40) Mac=MD5 export 
EXP-RC4-MD5    SSLv3 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export 
EXP-RC4-MD5    SSLv2 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export 

respone में संपादित डीएसएस सिफ़र सुइट के बारे में सवाल करने के लिए:

डीएसएस/DSA सिफ़र सुइट DH पैरामीटर, और निश्चित रूप से एक डीएसएस/DSA आधारित सर्वर प्रमाणपत्र के बजाय जरूरत है (केवल) एक आरएसए एक। यह न केवल निर्यात सिफर सूट के लिए सच है, बल्कि प्रामाणिकता के लिए डीएसएस/डीएसए का उपयोग कर सभी स्वीट्स के लिए भी सही है। डीएसएस/डीएसए डिज़ाइन द्वारा केवल अविश्वसनीय देशों में निर्यात की अनुमति देने के लिए, एन्क्रिप्शन के लिए नहीं, हस्ताक्षर के लिए उपयोग किया जा सकता है। चूंकि डीएसएस/डीएसए का उपयोग केवल हस्ताक्षर के लिए किया जा सकता है, इसलिए साझा सत्र कुंजी स्थापित करने के लिए इसे एक अल्पकालिक डिफी-हेलमैन कुंजी एक्सचेंज की आवश्यकता होती है। सिफर सुइट में ईडीएच यही है। डीएच पैरामीटर सेट अप करने के लिए, आप OpenSSL SSL_set_tmp_dh() API के M2Crypto समकक्षों का उपयोग करेंगे।

ध्यान दें कि ओपनएसएसएल एक ही एसएसएल संदर्भ में एक आरएसए और एक डीएसए/डीएसएस प्रमाण/कीपैयर दोनों लोड करने की अनुमति देता है।

+0

हाय डैनियल। आपके उत्तर के लिए धन्यवाद। इस सब को साफ़ करने के लिए अभी भी एक और संबंधित (उप) प्रश्न है। सिफर "एक्सपी-ईडीएच-डीएसएस-डीईएस-सीबीसी-एसएचए" को संभवत: उपयोग किए जाने वाले डीएसएस पैराम की आवश्यकता होती है लेकिन हम इसे करने के लिए M2Crypto/OpenSSL के अंदर उचित फ़ंक्शन नहीं ढूंढ पा रहे हैं (जैसे set_tmp_rsa() और/या set_tmp_dh() अन्य मामलों में उपयोग किया जाता है)। यह बहुत अच्छा होगा अगर आप (या कोई और) हमें सही दिशा में इंगित कर सकता है कि यह कैसे करें। – stamparm

+0

आपको डीएसएस सिफर सूट के लिए डीएच पैरा सेट अप करने की आवश्यकता है, ऊपर मेरा संपादन देखें। और निश्चित रूप से एक डीएसएस सर्वर प्रमाण, नहीं (केवल) एक आरएसए एक। –

+0

आपको बहुत धन्यवाद डैनियल। आपका जवाब बहुत मददगार था – stamparm

संबंधित मुद्दे