--- /usr/lib64/python2.7/xmlrpclib.py 2011-04-12 10:15:17.000000000 -0600 +++ xmlrpclib.py 2012-01-24 15:38:56.404614770 -0700 @@ -1491,6 +1491,36 @@ self._connection = host, HTTPS(chost, None, **(x509 or {})) return self._connection[1] +class SafeTransportWithCert(Transport): + def __init__(self, cert_file = None, key_file = None, ca_file = None, cert_reqs = None, use_datetime = 0): + xmlrpclib.Transport.__init__(self, use_datetime) + self._ca_file = ca_file + self._key_file = key_file + self._cert_file = cert_file + self._cert_reqs = cert_reqs + + def make_connection(self, host): + host_with_cert = (host, { + 'key_file' : self._key_file, + 'cert_file' : self._cert_file, + 'ca_file' : self._ca_file, + 'cert_reqs' : self._cert_reqs, + } ) + + if self._connection and host == self._connection[0]: + return self._connection[1] + # create a HTTPS connection object from a host descriptor + # host may be a string, or a (host, x509-dict) tuple + try: + HTTPS = HTTPSConnection2 + except AttributeError: + raise NotImplementedError( + "your version of httplib doesn't support HTTPS" + ) + else: + chost, self._extra_headers, x509 = self.get_host_info(host_with_cert) + self._connection = host, HTTPS(host=chost, key_file=self._key_file, cert_file=self._cert_file, ca_file=self._ca_file,cert_reqs=self._cert_reqs) + return self._connection[1] ## # Standard server proxy. This class establishes a virtual connection # to an XML-RPC server. --- /usr/lib64/python2.7/httplib.py 2011-04-12 10:15:17.000000000 -0600 +++ httplib.py 2012-01-24 16:00:58.345986871 -0700 @@ -1126,12 +1126,15 @@ default_port = HTTPS_PORT def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ca_file=None, cert_reqs=ssl.CERT_NONE, strict=None, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT, source_address=None): HTTPConnection.__init__(self, host, port, strict, timeout, source_address) self.key_file = key_file self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_file = ca_file def connect(self): "Connect to a host on a given (SSL) port." @@ -1141,7 +1144,11 @@ if self._tunnel_host: self.sock = sock self._tunnel() - self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file) + + if self.ca_file: + self.sock = ssl.wrap_socket(sock, keyfile=self.key_file, certfile=self.cert_file, cert_reqs=self.cert_reqs, ca_certs=self.ca_file) + else: + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file) __all__.append("HTTPSConnection")