Python XMLRPC SSL клиент и сервер - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь настроить простой сервер 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

Я не уверен, неправильно ли я настроил сервер или клиента. Любая помощь в определении проблемы очень ценится.

...