ssl_context_util.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import urlparse
  2. from OpenSSL import SSL
  3. from urllib2pyopenssl.ssl_peer_verification import ServerSSLCertVerification
  4. class SSlContextConfig(object):
  5. """
  6. Holds configuration options for creating a SSL context. This is used as a
  7. template to create the contexts with specific verification callbacks.
  8. """
  9. def __init__(self, key_file=None, cert_file=None, pem_file=None, ca_dir=None,
  10. verify_peer=False):
  11. self.key_file = key_file
  12. self.cert_file = cert_file
  13. self.pem_file = pem_file
  14. self.ca_dir = ca_dir
  15. self.verify_peer = verify_peer
  16. def make_ssl_context_from_config(ssl_config=False, url=None):
  17. return make_ssl_context(ssl_config.key_file, ssl_config.cert_file,
  18. ssl_config.pem_file, ssl_config.ca_dir,
  19. ssl_config.verify_peer, url)
  20. def make_ssl_context(key_file=None, cert_file=None, pem_file=None, ca_dir=None,
  21. verify_peer=False, url=None):
  22. """
  23. Creates SSL context containing certificate and key file locations.
  24. """
  25. ssl_context = SSL.Context(SSL.SSLv23_METHOD)
  26. # Key file defaults to certificate file if present.
  27. if cert_file:
  28. ssl_context.use_certificate_file(cert_file)
  29. if key_file:
  30. ssl_context.use_privatekey_file(key_file)
  31. else:
  32. if cert_file:
  33. ssl_context.use_privatekey_file(cert_file)
  34. if ca_dir:
  35. ssl_context.load_verify_locations(pem_file, ca_dir)
  36. def _callback(conn, x509, errnum, errdepth, preverify_ok):
  37. """Default certification verification callback.
  38. Performs no checks and returns the status passed in.
  39. """
  40. return preverify_ok
  41. verify_callback = _callback
  42. if verify_peer:
  43. ssl_context.set_verify_depth(9)
  44. if url:
  45. set_peer_verification_for_url_hostname(ssl_context, url)
  46. else:
  47. ssl_context.set_verify(SSL.VERIFY_PEER, verify_callback)
  48. else:
  49. ssl_context.set_verify(SSL.VERIFY_NONE, verify_callback)
  50. return ssl_context
  51. def set_peer_verification_for_url_hostname(ssl_context, url, if_verify_enabled=False):
  52. if not if_verify_enabled or (ssl_context.get_verify_mode() & SSL.VERIFY_PEER):
  53. urlObj = urlparse.urlparse(url)
  54. hostname = urlObj.hostname
  55. verify_callback = ServerSSLCertVerification(hostname=hostname)
  56. ssl_context.set_verify(SSL.VERIFY_PEER, verify_callback)