|
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 |
@@ -421,6 +426,36 @@ def test_multiple_starttls(self): |
421 | 426 | l.simple_bind_s(self.server.root_dn, self.server.root_pw) |
422 | 427 | self.assertEqual(l.whoami_s(), 'dn:' + self.server.root_dn) |
423 | 428 |
|
| 429 | + @requires_tls() |
| 430 | + @unittest.skipUnless( |
| 431 | + hasattr(ldap, "OPT_X_TLS_PEERCERT"), |
| 432 | + reason="Requires OPT_X_TLS_PEERCERT" |
| 433 | + ) |
| 434 | + def test_get_tls_peercert(self): |
| 435 | + l = self.ldap_object_class(self.server.ldap_uri) |
| 436 | + peercert = l.get_option(ldap.OPT_X_TLS_PEERCERT) |
| 437 | + self.assertEqual(peercert, None) |
| 438 | + with self.assertRaises(ValueError): |
| 439 | + l.set_option(ldap.OPT_X_TLS_PEERCERT, b"") |
| 440 | + |
| 441 | + l.set_option(ldap.OPT_X_TLS_CACERTFILE, self.server.cafile) |
| 442 | + l.set_option(ldap.OPT_X_TLS_NEWCTX, 0) |
| 443 | + l.start_tls_s() |
| 444 | + |
| 445 | + peercert = l.get_option(ldap.OPT_X_TLS_PEERCERT) |
| 446 | + self.assertTrue(peercert) |
| 447 | + self.assertIsInstance(peercert, bytes) |
| 448 | + |
| 449 | + if PEM_cert_to_DER_cert is not None: |
| 450 | + with open(self.server.servercert) as f: |
| 451 | + server_pem = f.read() |
| 452 | + # remove text |
| 453 | + begin = server_pem.find("-----BEGIN CERTIFICATE-----") |
| 454 | + server_pem = server_pem[begin:-1] |
| 455 | + |
| 456 | + server_der = PEM_cert_to_DER_cert(server_pem) |
| 457 | + self.assertEqual(server_der, peercert) |
| 458 | + |
424 | 459 | def test_dse(self): |
425 | 460 | dse = self._ldap_conn.read_rootdse_s() |
426 | 461 | self.assertIsInstance(dse, dict) |
|
0 commit comments