|
16 | 16 | under the License.
|
17 | 17 | """
|
18 | 18 |
|
| 19 | +import ssl |
19 | 20 | import warnings
|
20 |
| -from six import PY2 |
21 | 21 | from riak import RiakError
|
22 | 22 | from riak.util import str_to_long
|
23 | 23 |
|
24 |
| -OPENSSL_VERSION_101G = 268439679 |
25 |
| -if PY2: |
| 24 | +if hasattr(ssl, 'SSLContext'): |
| 25 | + # For Python >= 2.7.9 and Python 3.x |
| 26 | + USE_STDLIB_SSL = True |
| 27 | +else: |
| 28 | + # For Python 2.6 and <= 2.7.8 |
| 29 | + USE_STDLIB_SSL = False |
| 30 | + |
| 31 | +if not USE_STDLIB_SSL: |
26 | 32 | import OpenSSL.SSL
|
27 | 33 | from OpenSSL import crypto
|
28 |
| - sslver = OpenSSL.SSL.OPENSSL_VERSION_NUMBER |
29 |
| - # Be sure to use at least OpenSSL 1.0.1g |
30 |
| - if (sslver < OPENSSL_VERSION_101G) or \ |
31 |
| - not hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): |
32 |
| - verstring = OpenSSL.SSL.SSLeay_version(OpenSSL.SSL.SSLEAY_VERSION) |
33 |
| - msg = "Found {0} version, but expected at least OpenSSL 1.0.1g. " \ |
34 |
| - "Security may not support TLS 1.2.".format(verstring) |
35 |
| - warnings.warn(msg, UserWarning) |
36 |
| - if hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): |
37 |
| - DEFAULT_TLS_VERSION = OpenSSL.SSL.TLSv1_2_METHOD |
38 |
| - elif hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): |
39 |
| - DEFAULT_TLS_VERSION = OpenSSL.SSL.TLSv1_1_METHOD |
40 |
| - elif hasattr(OpenSSL.SSL, 'TLSv1_METHOD'): |
41 |
| - DEFAULT_TLS_VERSION = OpenSSL.SSL.TLSv1_METHOD |
42 |
| - else: |
43 |
| - DEFAULT_TLS_VERSION = OpenSSL.SSL.SSLv23_METHOD |
44 |
| -else: |
45 |
| - import ssl |
46 | 34 |
|
| 35 | +OPENSSL_VERSION_101G = 268439679 |
| 36 | +if hasattr(ssl, 'OPENSSL_VERSION_NUMBER'): |
| 37 | + # For Python 2.7 and Python 3.x |
47 | 38 | sslver = ssl.OPENSSL_VERSION_NUMBER
|
48 | 39 | # Be sure to use at least OpenSSL 1.0.1g
|
49 | 40 | if sslver < OPENSSL_VERSION_101G or \
|
|
61 | 52 | else:
|
62 | 53 | DEFAULT_TLS_VERSION = ssl.PROTOCOL_SSLv23
|
63 | 54 |
|
| 55 | +else: |
| 56 | + # For Python 2.6 |
| 57 | + sslver = OpenSSL.SSL.OPENSSL_VERSION_NUMBER |
| 58 | + # Be sure to use at least OpenSSL 1.0.1g |
| 59 | + if (sslver < OPENSSL_VERSION_101G) or \ |
| 60 | + not hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): |
| 61 | + verstring = OpenSSL.SSL.SSLeay_version(OpenSSL.SSL.SSLEAY_VERSION) |
| 62 | + msg = "Found {0} version, but expected at least OpenSSL 1.0.1g. " \ |
| 63 | + "Security may not support TLS 1.2.".format(verstring) |
| 64 | + warnings.warn(msg, UserWarning) |
| 65 | + if hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): |
| 66 | + DEFAULT_TLS_VERSION = OpenSSL.SSL.TLSv1_2_METHOD |
| 67 | + elif hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): |
| 68 | + DEFAULT_TLS_VERSION = OpenSSL.SSL.TLSv1_1_METHOD |
| 69 | + elif hasattr(OpenSSL.SSL, 'TLSv1_METHOD'): |
| 70 | + DEFAULT_TLS_VERSION = OpenSSL.SSL.TLSv1_METHOD |
| 71 | + else: |
| 72 | + DEFAULT_TLS_VERSION = OpenSSL.SSL.SSLv23_METHOD |
| 73 | + |
64 | 74 |
|
65 | 75 | class SecurityError(RiakError):
|
66 | 76 | """
|
@@ -197,7 +207,7 @@ def ssl_version(self):
|
197 | 207 | """
|
198 | 208 | return self._ssl_version
|
199 | 209 |
|
200 |
| - if PY2: |
| 210 | + if not USE_STDLIB_SSL: |
201 | 211 | @property
|
202 | 212 | def pkey(self):
|
203 | 213 | """
|
@@ -266,20 +276,20 @@ def _has_credential(self, key):
|
266 | 276 | return (getattr(self, internal_key) is not None) or \
|
267 | 277 | (getattr(self, internal_key + "_file") is not None)
|
268 | 278 |
|
269 |
| - def _check_revoked_cert(self, ssl_socket): |
270 |
| - """ |
271 |
| - Checks whether the server certificate on the passed socket has been |
272 |
| - revoked by checking the CRL. |
| 279 | + def _check_revoked_cert(self, ssl_socket): |
| 280 | + """ |
| 281 | + Checks whether the server certificate on the passed socket has been |
| 282 | + revoked by checking the CRL. |
273 | 283 |
|
274 |
| - :param ssl_socket: the SSL/TLS socket |
275 |
| - :rtype: bool |
276 |
| - :raises SecurityError: when the certificate has been revoked |
277 |
| - """ |
278 |
| - if not self._has_credential('crl'): |
279 |
| - return True |
280 |
| - |
281 |
| - servcert = ssl_socket.get_peer_certificate() |
282 |
| - servserial = servcert.get_serial_number() |
283 |
| - for rev in self.crl.get_revoked(): |
284 |
| - if servserial == str_to_long(rev.get_serial(), 16): |
285 |
| - raise SecurityError("Server certificate has been revoked") |
| 284 | + :param ssl_socket: the SSL/TLS socket |
| 285 | + :rtype: bool |
| 286 | + :raises SecurityError: when the certificate has been revoked |
| 287 | + """ |
| 288 | + if not self._has_credential('crl'): |
| 289 | + return True |
| 290 | + |
| 291 | + servcert = ssl_socket.get_peer_certificate() |
| 292 | + servserial = servcert.get_serial_number() |
| 293 | + for rev in self.crl.get_revoked(): |
| 294 | + if servserial == str_to_long(rev.get_serial(), 16): |
| 295 | + raise SecurityError("Server certificate has been revoked") |
0 commit comments