2017-04-09 52 views
0

我试图扩展我通过SSL处理HTTPS请求的Web服务器。 我的教授说我们应该使用ssl.wrap_socket并给了我们使用的密码。“ssl.SSLError:...没有共享密码”试图处理HTTPS请求时webserver

这是我到目前为止有:

from socket import * 
import ssl 

serverSocket = socket(AF_INET, SOCK_STREAM) 
serverPort = 443 
serverSocket.bind(("", serverPort)) 
serverSocket.listen(1) 

while True: 
    print ('Ready to serve...') 
    connectionSocket, addr = serverSocket.accept() 

    connectionSocket = ssl.wrap_socket(connectionSocket, 
           keyfile="./server.key", 
           certfile="./server.pem", 
           server_side=True, 
           cert_reqs=ssl.CERT_NONE, 
           ssl_version=ssl.PROTOCOL_SSLv23, 
           ca_certs=None, 
           do_handshake_on_connect=True, 
           suppress_ragged_eofs=True, 
           ciphers="AES128-SHA256") 

    try: 
     message = (connectionSocket.recv(1024)).decode('utf-8') 
     filename = message.split()[1] 

     f = open(filename[1:],'rb') 
     outputdata = f.read() 
     f.close() 

     connectionSocket.send(b'HTTP/1.1 200 OK\r\n\r\n') 
     connectionSocket.send(outputdata) 
     connectionSocket.send(b'\r\n') 

     connectionSocket.shutdown(SHUT_RDWR) 
     connectionSocket.close() 

    except IOError: 
     connectionSocket.send(b'HTTP/1.1 404 Not Found\r\n\r\n') 
     connectionSocket.send(b'<html><head></head><body><h1>404 Not Found</h1></body></html>\r\n') 

     connectionSocket.shutdown(SHUT_RDWR) 
     connectionSocket.close() 

serverSocket.close() 

我在用下面的代码在命令行中测试这一点,它似乎工作。这表明我对SSL会话,如协议,密码,会话ID,主键和index.html内容的权利信息:

openssl s_client -connect localhost:443 
GET /index.html 

对于任务,我必须把"https://localhost:443/index.html"进入下一节我浏览器,但我的网络服务器崩溃与此错误:

ssl.SSLError: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:661) 

我的代码有什么问题?

+0

也许你可以用一些简单的脚本来检查你的证书/ CA或者测试服务器,列出一些可用的密码:https://superuser.com/questions/109213/is-there-a-tool-that-c​​an-test -what-ssl-tls-cipher-suites-a-special-website-of –

+0

@zhiqianghuang:“没有共享密码”与证书验证无关。 –

回答

0
      ciphers="AES128-SHA256") 

根据SSLLabs client tests AES128-SHA256(在标准的要求TLS_RSA_WITH_AES_128_CBC_SHA256)不喜欢ChromeFirefox主流浏览器的支持。它不是由大客户支持的服务器上只接受这一个密码让没有共同的密码,可以发现,即

ssl.SSLError: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:661) 

解决方法是接受服务器上的多个密码,包括浏览器支持的密码。有关有用的设置,请参见mozilla wiki,该设置不仅可应用于主要Web服务器,还可应用于小型服务器。