74
lazy_import.lazy_import(globals(), """
77
_ = (ssl.match_hostname, ssl.CertificateError)
78
except AttributeError:
79
# Provide fallbacks for python < 2.7.9
80
def match_hostname(cert, host):
82
'%s cannot be verified, https certificates verification is only'
83
' available for python versions >= 2.7.9' % (host,))
84
ssl.match_hostname = match_hostname
85
ssl.CertificateError = ValueError
79
88
# Note for packagers: if there is no package providing certs for your platform,
80
89
# the curl project produces http://curl.haxx.se/ca/cacert.pem weekly.
81
90
_ssl_ca_certs_known_locations = [
82
u'/etc/ssl/certs/ca-certificates.crt', # Ubuntu/debian/gentoo
83
u'/etc/pki/tls/certs/ca-bundle.crt', # Fedora/CentOS/RH
84
u'/etc/ssl/ca-bundle.pem', # OpenSuse
85
u'/etc/ssl/cert.pem', # OpenSuse
86
u"/usr/local/share/certs/ca-root-nss.crt", # FreeBSD
91
u'/etc/ssl/certs/ca-certificates.crt', # Ubuntu/debian/gentoo
92
u'/etc/pki/tls/certs/ca-bundle.crt', # Fedora/CentOS/RH
93
u'/etc/ssl/ca-bundle.pem', # OpenSuse
94
u'/etc/ssl/cert.pem', # OpenSuse
95
u"/usr/local/share/certs/ca-root-nss.crt", # FreeBSD
87
96
# XXX: Needs checking, can't trust the interweb ;) -- vila 2012-01-25
88
u'/etc/openssl/certs/ca-certificates.crt', # Solaris
97
u'/etc/openssl/certs/ca-certificates.crt', # Solaris
90
101
def default_ca_certs():
91
102
if sys.platform == 'win32':
92
103
return os.path.join(os.path.dirname(sys.executable), u"cacert.pem")
115
126
def cert_reqs_from_store(unicode_str):
119
"required": ssl.CERT_REQUIRED,
120
"none": ssl.CERT_NONE
129
return {"required": ssl.CERT_REQUIRED,
130
"none": ssl.CERT_NONE}[unicode_str]
123
132
raise ValueError("invalid value %s" % unicode_str)
125
135
def default_ca_reqs():
126
136
if sys.platform in ('win32', 'darwin'):
127
137
# FIXME: Once we get a native access to root certificates there, this
131
141
return u'required'
133
143
opt_ssl_ca_certs = config.Option('ssl.ca_certs',
134
from_unicode=ca_certs_from_store,
135
default=default_ca_certs,
144
from_unicode=ca_certs_from_store,
145
default=default_ca_certs,
138
148
Path to certification authority certificates to trust.
140
150
This should be a valid path to a bundle containing all root Certificate
146
156
opt_ssl_cert_reqs = config.Option('ssl.cert_reqs',
147
default=default_ca_reqs,
148
from_unicode=cert_reqs_from_store,
157
default=default_ca_reqs,
158
from_unicode=cert_reqs_from_store,
151
161
Whether to require a certificate from the remote side. (default:required)
441
451
"'bzr help ssl.ca_certs' for more information on setting "
444
ssl_sock = ssl.wrap_socket(self.sock, self.key_file, self.cert_file,
454
ssl_sock = ssl.wrap_socket(
455
self.sock, self.key_file, self.cert_file,
445
456
cert_reqs=cert_reqs, ca_certs=ca_certs)
446
except ssl.SSLError, e:
449
460
"See `bzr help ssl.ca_certs` for how to specify trusted CA"
452
463
"verification entirely.\n")
454
465
if cert_reqs == ssl.CERT_REQUIRED:
455
if sys.version_info < (2, 7, 9):
456
# python2.6 doesn't provide ssl.match_hostname
458
'https certificates verification is only available for'
459
' python versions >= 2.7.9')
461
peer_cert = ssl_sock.getpeercert()
462
ssl.match_hostname(peer_cert, host)
466
peer_cert = ssl_sock.getpeercert()
467
ssl.match_hostname(peer_cert, host)
464
469
# Wrap the ssl socket before anybody use it
465
470
self._wrap_socket_for_reporting(ssl_sock)