|
20 | 20 | from slapdtest import requires_ldapi, requires_sasl, requires_tls |
21 | 21 | from slapdtest import requires_init_fd |
22 | 22 |
|
| 23 | +try: |
| 24 | + from ssl import PEM_cert_to_DER_cert |
| 25 | +except ImportError: |
| 26 | + PEM_cert_to_DER_cert = None |
| 27 | + |
23 | 28 |
|
24 | 29 | LDIF_TEMPLATE = """dn: %(suffix)s |
25 | 30 | objectClass: dcObject |
@@ -416,9 +421,38 @@ def test_multiple_starttls(self): |
416 | 421 | l.set_option(ldap.OPT_X_TLS_NEWCTX, 0) |
417 | 422 | l.start_tls_s() |
418 | 423 | l.simple_bind_s(self.server.root_dn, self.server.root_pw) |
419 | | - self.assertEqual(l.get_option(ldap.OPT_X_TLS_PEERCERT), b"eg") |
420 | 424 | self.assertEqual(l.whoami_s(), 'dn:' + self.server.root_dn) |
421 | 425 |
|
| 426 | + @requires_tls() |
| 427 | + @unittest.skipUnless( |
| 428 | + hasattr(ldap, "OPT_X_TLS_PEERCERT"), |
| 429 | + reason="Requires OPT_X_TLS_PEERCERT" |
| 430 | + ) |
| 431 | + def test_get_tls_peercert(self): |
| 432 | + l = self.ldap_object_class(self.server.ldap_uri) |
| 433 | + peercert = l.get_option(ldap.OPT_X_TLS_PEERCERT) |
| 434 | + self.assertEqual(peercert, None) |
| 435 | + with self.assertRaises(ValueError): |
| 436 | + l.set_option(ldap.OPT_X_TLS_PEERCERT, b"") |
| 437 | + |
| 438 | + l.set_option(ldap.OPT_X_TLS_CACERTFILE, self.server.cafile) |
| 439 | + l.set_option(ldap.OPT_X_TLS_NEWCTX, 0) |
| 440 | + l.start_tls_s() |
| 441 | + |
| 442 | + peercert = l.get_option(ldap.OPT_X_TLS_PEERCERT) |
| 443 | + self.assertTrue(peercert) |
| 444 | + self.assertIsInstance(peercert, bytes) |
| 445 | + |
| 446 | + if PEM_cert_to_DER_cert is not None: |
| 447 | + with open(self.server.servercert) as f: |
| 448 | + server_pem = f.read() |
| 449 | + # remove text |
| 450 | + begin = server_pem.find("-----BEGIN CERTIFICATE-----") |
| 451 | + server_pem = server_pem[begin:-1] |
| 452 | + |
| 453 | + server_der = PEM_cert_to_DER_cert(server_pem) |
| 454 | + self.assertEqual(server_der, peercert) |
| 455 | + |
422 | 456 | def test_dse(self): |
423 | 457 | dse = self._ldap_conn.read_rootdse_s() |
424 | 458 | self.assertIsInstance(dse, dict) |
|
0 commit comments