2016-04-07 7 views
0

Wrapping zu wickeln Ich versuche, Attribute zu meinem SSLContext-Objekt festlegen und dann versuchen, den Socket zu wickeln, aber es zeigt mir, dass keine der Attribute verwendet werden, während es umhüllt.Ich habe versucht, Socket mit SSLContext-Objekt auf Python-Server

Wenn ich es ausführen, haben die Cipher-Suiten noch DH und es verwendet PROTOCOL_TLSv1 anstelle der PROTOCOL_SSLv23 ich versuche, es zu setzen. Kann mir jemand zeigen, was ich hier falsch mache?

from socket import * 
import ssl 
serverSocket = socket(AF_INET, SOCK_STREAM) 
serverSocket.bind(('', 3340)) 
serverSocket.listen(1) 

while True: 
    print ('Ready to serve...') 

    (newSocket,addr) = serverSocket.accept()  

    context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) #still uses TLSv1 
    context.load_cert_chain(certfile="server.crt", keyfile="server.key") 
    context.set_ciphers("ALL:!DH") #Trying to get only cipher suites without DH 

    connectionSocket = context.wrap_socket(newSocket, server_side=True) 
################################# 
    try: 
     message = connectionSocket.recv(1024) 

     filename = message.split()[1] 
     f = open(filename[1:]) 

     outputdata = f.read() 

     connectionSocket.send("HTTP/1.1 200 OK\r\n\r\n") 

     for i in range(0, len(outputdata)): 
      connectionSocket.send(outputdata[i]) 

     connectionSocket.send("\r\n") 
     connectionSocket.close() 
    except IOError: #Send response message for file not found 
     print ("IOError") 
     connectionSocket.send('404 Not Found: Requested document not found') 
     connectionSocket.close() 
serverSocket.close() 

Antwort

0
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) #still uses TLSv1 

PROTOCOL_SSLv23 bedeutet, dass es einen SSLv2 kompatiblen Handshake verwendet. Es wird weiterhin TLS 1.x. Siehe the documentation, wo klar aufgeführt ist, welche Protokolle in diesem Fall unterstützt werden, nämlich alle von SSLv2, SSLv3 und TLSv1.x.

Das tatsächlich im Handshake verwendete Protokoll hängt davon ab, was der Client anbietet und was der Server akzeptiert und unterstützt. Im Falle von SSLv23 akzeptiert der Server alles, so dass es vollständig vom Client abhängt. Um die Verwendung bestimmter Protokolle zu verweigern, verwenden Sie besser die OPENSSL_NO_* Flags.

context.set_ciphers("ALL:!DH") #Trying to get only cipher suites without DH 

Das ist richtig und das funktioniert auch. Ich habe keine Ahnung, wie Sie getestet und festgestellt haben, dass es nicht funktioniert. Die Idee der Chiffren ist die gleiche wie beim Protokoll: Der Client bietet eine Reihe von Chiffren und der Server akzeptiert eine davon, wenn dies auf der Serverseite unterstützt wird. In diesem Fall würde die Verbindung fehlschlagen, wenn der Client nur DH-Verschlüsselungen anbietet.

Beachten Sie, dass der Code derzeit fehlschlägt, wenn der Client nur DH-Verschlüsselungen anbietet, unabhängig davon, ob Sie DH ausdrücklich ablehnen oder nicht, weil Sie die DH-Unterstützung nicht vollständig eingerichtet haben. Dazu müssten Sie eine DH-Datei mit context.load_dh_params(dhfile) laden.

Abgesehen davon ist ALL:!DH eine schlechte Wahl, da Sie alle schwachen und anonymen Verschlüsselungen mit ALL einschließen, die es wirklich unsicher machen. Eine sicherere Wahl wäre DEFAULT:!DH.

Verwandte Themen