Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 44109d7

Browse files
committed
Issue #17134: Finalize interface to Windows' certificate store. Cert and
CRL enumeration are now two functions. enum_certificates() also returns purpose flags as set of OIDs.
1 parent d062892 commit 44109d7

5 files changed

Lines changed: 290 additions & 132 deletions

File tree

Doc/library/ssl.rst

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -372,21 +372,45 @@ Certificate handling
372372

373373
.. versionadded:: 3.4
374374

375-
.. function:: enum_cert_store(store_name, cert_type='certificate')
375+
.. function:: enum_certificates(store_name)
376376

377377
Retrieve certificates from Windows' system cert store. *store_name* may be
378378
one of ``CA``, ``ROOT`` or ``MY``. Windows may provide additional cert
379-
stores, too. *cert_type* is either ``certificate`` for X.509 certificates
380-
or ``crl`` for X.509 certificate revocation lists.
379+
stores, too.
381380

382-
The function returns a list of (bytes, encoding_type) tuples. The
383-
encoding_type flag can be interpreted with :const:`X509_ASN_ENCODING` or
384-
:const:`PKCS_7_ASN_ENCODING`.
381+
The function returns a list of (cert_bytes, encoding_type, trust) tuples.
382+
The encoding_type specifies the encoding of cert_bytes. It is either
383+
:const:`x509_asn` for X.509 ASN.1 data or :const:`pkcs_7_asn` for
384+
PKCS#7 ASN.1 data. Trust specifies the purpose of the certificate as a set
385+
of OIDS or exactly ``True`` if the certificate is trustworthy for all
386+
purposes.
387+
388+
Example::
389+
390+
>>> ssl.enum_certificates("CA")
391+
[(b'data...', 'x509_asn', {'1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2'}),
392+
(b'data...', 'x509_asn', True)]
385393

386394
Availability: Windows.
387395

388396
.. versionadded:: 3.4
389397

398+
.. function:: enum_crls(store_name)
399+
400+
Retrieve CRLs from Windows' system cert store. *store_name* may be
401+
one of ``CA``, ``ROOT`` or ``MY``. Windows may provide additional cert
402+
stores, too.
403+
404+
The function returns a list of (cert_bytes, encoding_type, trust) tuples.
405+
The encoding_type specifies the encoding of cert_bytes. It is either
406+
:const:`x509_asn` for X.509 ASN.1 data or :const:`pkcs_7_asn` for
407+
PKCS#7 ASN.1 data.
408+
409+
Availability: Windows.
410+
411+
.. versionadded:: 3.4
412+
413+
390414
Constants
391415
^^^^^^^^^
392416

@@ -657,15 +681,6 @@ Constants
657681

658682
.. versionadded:: 3.4
659683

660-
.. data:: X509_ASN_ENCODING
661-
PKCS_7_ASN_ENCODING
662-
663-
Encoding flags for :func:`enum_cert_store`.
664-
665-
Availability: Windows.
666-
667-
.. versionadded:: 3.4
668-
669684

670685
SSL Sockets
671686
-----------

Lib/ssl.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ def _import_symbols(prefix):
144144
_PROTOCOL_NAMES[PROTOCOL_TLSv1_2] = "TLSv1.2"
145145

146146
if sys.platform == "win32":
147-
from _ssl import enum_cert_store, X509_ASN_ENCODING, PKCS_7_ASN_ENCODING
147+
from _ssl import enum_certificates, enum_crls
148148

149149
from socket import getnameinfo as _getnameinfo
150150
from socket import socket, AF_INET, SOCK_STREAM, create_connection

Lib/test/test_ssl.py

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -528,29 +528,44 @@ def test_get_default_verify_paths(self):
528528
self.assertEqual(paths.cafile, CERTFILE)
529529
self.assertEqual(paths.capath, CAPATH)
530530

531-
532531
@unittest.skipUnless(sys.platform == "win32", "Windows specific")
533-
def test_enum_cert_store(self):
534-
self.assertEqual(ssl.X509_ASN_ENCODING, 1)
535-
self.assertEqual(ssl.PKCS_7_ASN_ENCODING, 0x00010000)
536-
537-
self.assertEqual(ssl.enum_cert_store("CA"),
538-
ssl.enum_cert_store("CA", "certificate"))
539-
ssl.enum_cert_store("CA", "crl")
540-
self.assertEqual(ssl.enum_cert_store("ROOT"),
541-
ssl.enum_cert_store("ROOT", "certificate"))
542-
ssl.enum_cert_store("ROOT", "crl")
543-
544-
self.assertRaises(TypeError, ssl.enum_cert_store)
545-
self.assertRaises(WindowsError, ssl.enum_cert_store, "")
546-
self.assertRaises(ValueError, ssl.enum_cert_store, "CA", "wrong")
547-
548-
ca = ssl.enum_cert_store("CA")
532+
def test_enum_certificates(self):
533+
self.assertTrue(ssl.enum_certificates("CA"))
534+
self.assertTrue(ssl.enum_certificates("ROOT"))
535+
536+
self.assertRaises(TypeError, ssl.enum_certificates)
537+
self.assertRaises(WindowsError, ssl.enum_certificates, "")
538+
539+
names = set()
540+
ca = ssl.enum_certificates("CA")
549541
self.assertIsInstance(ca, list)
550-
self.assertIsInstance(ca[0], tuple)
551-
self.assertEqual(len(ca[0]), 2)
552-
self.assertIsInstance(ca[0][0], bytes)
553-
self.assertIsInstance(ca[0][1], int)
542+
for element in ca:
543+
self.assertIsInstance(element, tuple)
544+
self.assertEqual(len(element), 3)
545+
cert, enc, trust = element
546+
self.assertIsInstance(cert, bytes)
547+
self.assertIn(enc, {"x509_asn", "pkcs_7_asn"})
548+
self.assertIsInstance(trust, (set, bool))
549+
if isinstance(trust, set):
550+
names.update(trust)
551+
552+
serverAuth = "1.3.6.1.5.5.7.3.1"
553+
self.assertIn(serverAuth, names)
554+
555+
@unittest.skipUnless(sys.platform == "win32", "Windows specific")
556+
def test_enum_crls(self):
557+
self.assertTrue(ssl.enum_crls("CA"))
558+
self.assertRaises(TypeError, ssl.enum_crls)
559+
self.assertRaises(WindowsError, ssl.enum_crls, "")
560+
561+
crls = ssl.enum_crls("CA")
562+
self.assertIsInstance(crls, list)
563+
for element in crls:
564+
self.assertIsInstance(element, tuple)
565+
self.assertEqual(len(element), 2)
566+
self.assertIsInstance(element[0], bytes)
567+
self.assertIn(element[1], {"x509_asn", "pkcs_7_asn"})
568+
554569

555570
def test_asn1object(self):
556571
expected = (129, 'serverAuth', 'TLS Web Server Authentication',

Misc/NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ Core and Builtins
5959
Library
6060
-------
6161

62+
- Issue #17134: Finalize interface to Windows' certificate store. Cert and
63+
CRL enumeration are now two functions. enum_certificates() also returns
64+
purpose flags as set of OIDs.
65+
6266
- Issue #19555: Restore sysconfig.get_config_var('SO'), with a
6367
DeprecationWarning pointing people at $EXT_SUFFIX.
6468

0 commit comments

Comments
 (0)