"ssl.SSLError: ... No shared cipher" when trying to handle HTTPS requests webserver
"ssl.SSLError: ... No shared cipher" when trying to handle HTTPS requests webserver
我正在尝试扩展我创建的 Web 服务器以通过 SSL 处理 HTTPS 请求。
我的教授说我们应该使用 ssl.wrap_socket
并给了我们使用的密码。
这是我目前的情况:
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)
我的代码有什么问题?
ciphers="AES128-SHA256")
根据SSLLabs client tests AES128-SHA256 (called TLS_RSA_WITH_AES_128_CBC_SHA256 in the standards) is not supported by major browsers like Chrome or Firefox。在服务器上只接受这个不受主要客户端支持的单一密码使得找不到通用密码,即
ssl.SSLError: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:661)
解决方法是在服务器上接受更多密码以包含浏览器支持的密码。请参阅 mozilla wiki 了解有用的设置,这些设置不仅适用于主要的 Web 服务器,也适用于您的小型服务器。
我正在尝试扩展我创建的 Web 服务器以通过 SSL 处理 HTTPS 请求。
我的教授说我们应该使用 ssl.wrap_socket
并给了我们使用的密码。
这是我目前的情况:
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)
我的代码有什么问题?
ciphers="AES128-SHA256")
根据SSLLabs client tests AES128-SHA256 (called TLS_RSA_WITH_AES_128_CBC_SHA256 in the standards) is not supported by major browsers like Chrome or Firefox。在服务器上只接受这个不受主要客户端支持的单一密码使得找不到通用密码,即
ssl.SSLError: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:661)
解决方法是在服务器上接受更多密码以包含浏览器支持的密码。请参阅 mozilla wiki 了解有用的设置,这些设置不仅适用于主要的 Web 服务器,也适用于您的小型服务器。