Client/Server mit SSL Sockets mit self-signed Certificates

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
desiato
User
Beiträge: 1
Registriert: Freitag 25. März 2011, 11:20

Hallo,

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()
Die Zertifikate wurden mit openssl erstellt (linux system):
#!/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
Der Server startet ohne Probleme. Allerdings liefert die Verbindung des Clients zum Server folgenden Fehlermeldung:

beim Server:
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
beim Client:
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
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.

Kann mir bitte jemand auf die Sprünge helfen.

Danke.
Antworten