Seite 1 von 1

SSL mit M2Crypto -- Problem mit cipher

Verfasst: Dienstag 17. April 2007, 16:17
von Rebecca
Ich beschaeftige mich gerade mit SSL-Verbindungen mithilfe des M2Crypto-Moduls. Ich moechte zunaechst eine SSL-Verbindung ohne Authenrifizierung (anonym) aufbauen. Dazu setze ich im Server und im Client die cipher auf "aNULL". Das scheint auch zu klappen (set_cipherlist gibt 1 zurueck), aber wenn ich dann die cipher abfrage, bekomme ich None zurueck. Der Handshake klappt dann naturelich nicht (no shared cipher).

Hab schon einiges ausprobiert, hier ein Versuch:
Server:

Code: Alles auswählen

from M2Crypto import SSL
import socket

server_sock = socket.socket(socket.AF_INET)
server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_sock.bind(("localhost", 5000))

server_sock.listen(1)
(sock, address) = server_sock.accept()

ctx = SSL.Context()
ctx.set_verify(SSL.verify_none, 1)
print ctx.set_cipher_list("aNULL")

conn = SSL.Connection(ctx, sock)
print conn.get_cipher()
print conn.set_cipher_list("aNULL")
print conn.get_cipher()

conn.setup_addr(address)
conn.set_accept_state()
conn.setup_ssl()
conn.accept_ssl()
Client:

Code: Alles auswählen

from M2Crypto import SSL
import socket

ctx = SSL.Context()
ctx.set_verify(SSL.verify_none, 1)
print ctx.set_cipher_list("aNULL")

conn = SSL.Connection(ctx)
print conn.get_cipher()
print conn.set_cipher_list("aNULL")
print conn.get_cipher()
conn.connect(("localhost", 5000))

print conn.read()
sock.close()

Die Ausgabe vom Client:

Code: Alles auswählen

1
None
1
None
Traceback (most recent call last):
  File "./ssl_client_m2crypto.py", line 14, in ?
    conn.connect(("localhost", 5000))
  File "/usr/lib/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 154, in connect
    ret = self.connect_ssl()
  File "/usr/lib/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 147, in connect_ssl
    return m2.ssl_connect(self.ssl)
M2Crypto.SSL.SSLError: sslv3 alert handshake failure
Die Ausgabe vom Server:

Code: Alles auswählen

1
None
1
None
Traceback (most recent call last):
  File "./ssl_server_m2crypt.py", line 25, in ?
    conn.accept_ssl()
  File "/usr/lib/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 125, in accept_ssl
    return m2.ssl_accept(self.ssl)
M2Crypto.SSL.SSLError: no shared cipher
Das hier hat mich auch etwas stuztig gemacht:
the default cipher list. This is determined at compile time and is normally ALL:!ADH:RC4+RSA:+SSLv2:@STRENGTH

...

If ! is used then the ciphers are permanently deleted from the list. The ciphers deleted can never reappear in the list even if they are explicitly stated.

...

aNULL : the cipher suites offering no authentication. This is currently the ADH algorithms.
Koennte das mein Problem sein? Jemand ne Idee?

Verfasst: Donnerstag 19. April 2007, 12:01
von Rebecca
Ich habe das ganze nochmal direkt in C mit der openSSL-Library implementiert, aber da habe ich genau das gleiche Problem.

(Server und Client)

Mach ich da irgendeinen grundsaetzlichen Fehler?

Verfasst: Freitag 20. April 2007, 09:35
von Rebecca
Mmh, prinzipiell scheint es zu funktionieren. Hab gerade entdeckt, dass openssl Testserver und Testclient mitbringt:

Code: Alles auswählen

openssl s_server -nocert -cipher ADH -accept 5000
openssl s_client -cipher ADH -connect 127.0.0.1:5000

Und da klappt die Verbindung. Dumm nur, dass der Quellcode von s_client und s_server etwas laenglich ist... wird wohl ein Weilchen brauchen, bis ich rausfinde, wo der entscheidende Unterschied liegt. :?

Verfasst: Donnerstag 26. April 2007, 16:20
von Rebecca
Also wenn jemand noch eine Idee hat, waere ich dankbar. Hab schon das gesamte Internet auf den Kopf gestellt... :(