ich beschäftige mich grad mit SSL sockets mit dem ssl-python (ab 2.6) modul und ich frage mich und habe Probleme einen Server und Clients miteinander kommunizieren zu lassen über ssl sockets, wobei der Server und der Client Zertifikate besitzt, die mit einem self-signed Certificate zertifiziert sind. Im folgenden ist ein Beispiel angegeben, was jedoch nicht funktioniert. Entweder mache ich noch was falsch und habe Verständnisprobleme oder es gehlt halt nicht so:
Server:
Code: Alles auswählen
import socket
import select
import ssl
if __name__ == '__main__':
host = "localhost"
port = 203040
srvsocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
srvsocket.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
srvsocket.bind( (host,port) )
srvsocket.listen( 3 )
descriptors = [srvsocket]
while 1:
# Await an event on a readable socket descriptor
print "waiting for an event ..."
(sread, swrite, sexc) = select.select( descriptors, [], [] )
# Iterate through the tagged read descriptors
for sock in sread:
print "... check event"
if sock == srvsocket:
# Received a connect to the server (listening) socket
newsock, (remhost,remport) = srvsocket.accept()
# instance of ssl.SSLSocket
newSSLSock = ssl.wrap_socket(newsock,
server_side = True,
certfile = "server.crt",
keyfile = "server.key",
ca_certs="CA.crt",
cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_TLSv1)
descriptors.append( newSSLSock )
print 'Client joined %s: %s' % (remhost,remport)
else:
# process request
s = ""
while 1:
print "reading ..."
ss = sock.recv(1024)
if not ss or ss=="EOC":
break
s += ss
s = s.strip()
l = sock.send("Thanks for all the fish!")
# close and remove socket
try:
sock.shutdown(socket.SHUT_RDWR)
sock.close()
except:
pass
descriptors.remove(sock)
Client:
Code: Alles auswählen
import socket
import ssl
import pprint
host = "localhost"
port = 203040
clientSock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
# instance of ssl.SSLSocket
sslClientSock = ssl.wrap_socket(clientSock,
certfile = "client.crt",
keyfile = "client.key",
ca_certs="CA.crt",
cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_TLSv1)
sslClientSock.connect( (host,port) )
print "name:",repr(sslClientSock.getpeername())
print "cipher:",sslClientSock.cipher()
print "certificate"
print pprint.pformat(sslClientSock.getpeercert())
sslClientSock.send("Here I am")
# end of communication string
sslClientSock.send("EOC")
recv = sslClientSock.recv(1024)
print "received:",recv
sslClientSock.close()
Der Server startet ohne Probleme. Allerdings liefert die Verbindung des Clients zum Server folgenden Fehlermeldung:#!/bin/sh
echo "--------CA"
openssl genrsa -out CA.key 1024
openssl req -new -key CA.key -out CA.csr
openssl x509 -req -days 365 -in CA.csr -signkey CA.key -out CA.crt
echo "--------Server"
openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey CA.key -out server.crt
echo "--------Client"
openssl genrsa -out client.key 1024
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 365 -in client.csr -signkey CA.key -out client.crt
beim Server:
beim Client:Traceback (most recent call last):
File "sslSocketServer.py", line 44, in <module>
ssl_version=ssl.PROTOCOL_TLSv1)
File "/usr/lib/python2.6/ssl.py", line 338, in wrap_socket
suppress_ragged_eofs=suppress_ragged_eofs)
File "/usr/lib/python2.6/ssl.py", line 120, in __init__
self.do_handshake()
File "/usr/lib/python2.6/ssl.py", line 279, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [Errno 1] _ssl.c:490: error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher
Wahrscheinlich liegt das an den Zertifikaten (welche muß ich wo angeben?), denn wenn ich überall die für den CA erstellten key und crt file beim Server und Client angebe, funktioniert die Verbindung. Ich vermute an der Verschlüsselung kann es auch nicht liegen (irreführende Fehlermeldung für mich beim Server). Alle Files, inklusive der Zertifikate liegen in einem Verzeichnis.Traceback (most recent call last):
File "sslClientSocket.py", line 19, in <module>
sslClientSock.connect( (host,port) )
File "/usr/lib/python2.6/ssl.py", line 295, in connect
self.do_handshake()
File "/usr/lib/python2.6/ssl.py", line 279, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [Errno 1] _ssl.c:490: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
Kann mir bitte jemand auf die Sprünge helfen.
Danke.