Я пытаюсь настроить простой сервер XMLRPC и клиент, используя SSL. Из документации Python3 я начинаю со следующего для кода на стороне сервера:
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
# Create server
with SimpleXMLRPCServer(('localhost', 8000),
requestHandler=RequestHandler) as server:
# Register pow() function; this will use the value of
# pow.__name__ as the name, which is just 'pow'.
server.register_function(pow)
# Run the server's main loop
server.serve_forever()
А со стороны клиента я начинаю с:
import xmlrpc.client
s = xmlrpc.client.ServerProxy('http://localhost:8000')
print(s.pow(2,3)) # Returns 2**3 = 8
Выше работает, но сейчас я пытаюсь сделать это через SSL. Я создал файл cert.pem с:
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
И изменил код сервера следующим образом:
import ssl
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
# Create server
with SimpleXMLRPCServer(('localhost', 8000),
requestHandler=RequestHandler) as server:
server.socket = ssl.wrap_socket(server.socket, server_side=True, certfile='cert.pem', cert_reqs=ssl.CERT_NONE)
# Register pow() function; this will use the value of
# pow.__name__ as the name, which is just 'pow'.
server.register_function(pow)
# Run the server's main loop
server.serve_forever()
Сервер нормально запускается, и, если я пытаюсь подключиться к нему с неизмененным клиентом, соединение не устанавливается должным образом, так как клиент не использует SSL. Итак, я пытаюсь добавить SSL к клиенту со следующими изменениями:
import ssl
import xmlrpc.client
context = ssl.SSLContext()
s = xmlrpc.client.ServerProxy('http://localhost:8000', context=context)
print(s.pow(2,3)) # Returns 2**3 = 8
Но даже тогда соединение не устанавливается:
$ python3 xmlClient.py
Traceback (most recent call last):
File "xmlClient.py", line 6, in <module>
print(s.pow(2,3)) # Returns 2**3 = 8
File "/usr/lib/python3.6/xmlrpc/client.py", line 1112, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python3.6/xmlrpc/client.py", line 1452, in __request
verbose=self.__verbose
File "/usr/lib/python3.6/xmlrpc/client.py", line 1154, in request
return self.single_request(host, handler, request_body, verbose)
File "/usr/lib/python3.6/xmlrpc/client.py", line 1167, in single_request
resp = http_conn.getresponse()
File "/usr/lib/python3.6/http/client.py", line 1331, in getresponse
response.begin()
File "/usr/lib/python3.6/http/client.py", line 297, in begin
version, status, reason = self._read_status()
File "/usr/lib/python3.6/http/client.py", line 258, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "/usr/lib/python3.6/socket.py", line 586, in readinto
return self._sock.recv_into(b)
ConnectionResetError: [Errno 104] Connection reset by peer
Я не уверен, неправильно ли я настроил сервер или клиента. Любая помощь в определении проблемы очень ценится.