| X.509 |
| ===== |
| |
| .. currentmodule:: cryptography.x509 |
| |
| X.509 is an ITU-T standard for a `public key infrastructure`_. X.509v3 is |
| defined in :rfc:`5280` (which obsoletes :rfc:`2459` and :rfc:`3280`). X.509 |
| certificates are commonly used in protocols like `TLS`_. |
| |
| |
| Loading Certificates |
| ~~~~~~~~~~~~~~~~~~~~ |
| |
| .. function:: load_pem_x509_certificate(data, backend) |
| |
| .. versionadded:: 0.7 |
| |
| Deserialize a certificate from PEM encoded data. PEM certificates are |
| base64 decoded and have delimiters that look like |
| ``-----BEGIN CERTIFICATE-----``. |
| |
| :param bytes data: The PEM encoded certificate data. |
| |
| :param backend: A backend supporting the |
| :class:`~cryptography.hazmat.backends.interfaces.X509Backend` |
| interface. |
| |
| :returns: An instance of :class:`~cryptography.x509.Certificate`. |
| |
| .. function:: load_der_x509_certificate(data, backend) |
| |
| .. versionadded:: 0.7 |
| |
| Deserialize a certificate from DER encoded data. DER is a binary format |
| and is commonly found in files with the ``.cer`` extension (although file |
| extensions are not a guarantee of encoding type). |
| |
| :param bytes data: The DER encoded certificate data. |
| |
| :param backend: A backend supporting the |
| :class:`~cryptography.hazmat.backends.interfaces.X509Backend` |
| interface. |
| |
| :returns: An instance of :class:`~cryptography.x509.Certificate`. |
| |
| .. testsetup:: |
| |
| pem_data = b""" |
| -----BEGIN CERTIFICATE----- |
| MIIDfDCCAmSgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJVUzEf |
| MB0GA1UEChMWVGVzdCBDZXJ0aWZpY2F0ZXMgMjAxMTEVMBMGA1UEAxMMVHJ1c3Qg |
| QW5jaG9yMB4XDTEwMDEwMTA4MzAwMFoXDTMwMTIzMTA4MzAwMFowQDELMAkGA1UE |
| BhMCVVMxHzAdBgNVBAoTFlRlc3QgQ2VydGlmaWNhdGVzIDIwMTExEDAOBgNVBAMT |
| B0dvb2QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCQWJpHYo37 |
| Xfb7oJSPe+WvfTlzIG21WQ7MyMbGtK/m8mejCzR6c+f/pJhEH/OcDSMsXq8h5kXa |
| BGqWK+vSwD/Pzp5OYGptXmGPcthDtAwlrafkGOS4GqIJ8+k9XGKs+vQUXJKsOk47 |
| RuzD6PZupq4s16xaLVqYbUC26UcY08GpnoLNHJZS/EmXw1ZZ3d4YZjNlpIpWFNHn |
| UGmdiGKXUPX/9H0fVjIAaQwjnGAbpgyCumWgzIwPpX+ElFOUr3z7BoVnFKhIXze+ |
| VmQGSWxZxvWDUN90Ul0tLEpLgk3OVxUB4VUGuf15OJOpgo1xibINPmWt14Vda2N9 |
| yrNKloJGZNqLAgMBAAGjfDB6MB8GA1UdIwQYMBaAFOR9X9FclYYILAWuvnW2ZafZ |
| XahmMB0GA1UdDgQWBBRYAYQkG7wrUpRKPaUQchRR9a86yTAOBgNVHQ8BAf8EBAMC |
| AQYwFwYDVR0gBBAwDjAMBgpghkgBZQMCATABMA8GA1UdEwEB/wQFMAMBAf8wDQYJ |
| KoZIhvcNAQELBQADggEBADWHlxbmdTXNwBL/llwhQqwnazK7CC2WsXBBqgNPWj7m |
| tvQ+aLG8/50Qc2Sun7o2VnwF9D18UUe8Gj3uPUYH+oSI1vDdyKcjmMbKRU4rk0eo |
| 3UHNDXwqIVc9CQS9smyV+x1HCwL4TTrq+LXLKx/qVij0Yqk+UJfAtrg2jnYKXsCu |
| FMBQQnWCGrwa1g1TphRp/RmYHnMynYFmZrXtzFz+U9XEA7C+gPq4kqDI/iVfIT1s |
| 6lBtdB50lrDVwl2oYfAvW/6sC2se2QleZidUmrziVNP4oEeXINokU6T6p//HM1FG |
| QYw2jOvpKcKtWCSAnegEbgsGYzATKjmPJPJ0npHFqzM= |
| -----END CERTIFICATE----- |
| """.strip() |
| |
| .. doctest:: |
| |
| >>> from cryptography import x509 |
| >>> from cryptography.hazmat.backends import default_backend |
| >>> cert = x509.load_pem_x509_certificate(pem_data, default_backend()) |
| >>> cert.serial |
| 2 |
| |
| X.509 Certificate Object |
| ~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| .. class:: Certificate |
| |
| .. versionadded:: 0.7 |
| |
| .. attribute:: version |
| |
| :type: :class:`~cryptography.x509.Version` |
| |
| The certificate version as an enumeration. Version 3 certificates are |
| the latest version and also the only type you should see in practice. |
| |
| :raises cryptography.x509.InvalidVersion: If the version in the |
| certificate is not a known |
| :class:`X.509 version <cryptography.x509.Version>`. |
| |
| .. doctest:: |
| |
| >>> cert.version |
| <Version.v3: 2> |
| |
| .. method:: fingerprint(algorithm) |
| |
| :param algorithm: The |
| :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm` |
| that will be used to generate the fingerprint. |
| |
| :return bytes: The fingerprint using the supplied hash algorithm as |
| bytes. |
| |
| .. doctest:: |
| |
| >>> from cryptography.hazmat.primitives import hashes |
| >>> cert.fingerprint(hashes.SHA256()) |
| '\x86\xd2\x187Gc\xfc\xe7}[+E9\x8d\xb4\x8f\x10\xe5S\xda\x18u\xbe}a\x03\x08[\xac\xa04?' |
| |
| .. attribute:: serial |
| |
| :type: int |
| |
| The serial as a Python integer. |
| |
| .. doctest:: |
| |
| >>> cert.serial |
| 2 |
| |
| .. method:: public_key() |
| |
| :type: |
| :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey` or |
| :class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPublicKey` or |
| :class:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePublicKey` |
| |
| The public key associated with the certificate. |
| |
| .. doctest:: |
| |
| >>> from cryptography.hazmat.primitives.asymmetric import rsa |
| >>> public_key = cert.public_key() |
| >>> isinstance(public_key, rsa.RSAPublicKey) |
| True |
| |
| .. attribute:: not_valid_before |
| |
| :type: :class:`datetime.datetime` |
| |
| A naïve datetime representing the beginning of the validity period for |
| the certificate in UTC. This value is inclusive. |
| |
| .. doctest:: |
| |
| >>> cert.not_valid_before |
| datetime.datetime(2010, 1, 1, 8, 30) |
| |
| .. attribute:: not_valid_after |
| |
| :type: :class:`datetime.datetime` |
| |
| A naïve datetime representing the end of the validity period for the |
| certificate in UTC. This value is inclusive. |
| |
| .. doctest:: |
| |
| >>> cert.not_valid_after |
| datetime.datetime(2030, 12, 31, 8, 30) |
| |
| .. attribute:: issuer |
| |
| .. versionadded:: 0.8 |
| |
| :type: :class:`Name` |
| |
| The :class:`Name` of the issuer. |
| |
| .. attribute:: subject |
| |
| .. versionadded:: 0.8 |
| |
| :type: :class:`Name` |
| |
| The :class:`Name` of the subject. |
| |
| .. attribute:: signature_hash_algorithm |
| |
| :type: :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm` |
| |
| Returns the |
| :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm` which |
| was used in signing this certificate. |
| |
| .. doctest:: |
| |
| >>> from cryptography.hazmat.primitives import hashes |
| >>> isinstance(cert.signature_hash_algorithm, hashes.SHA256) |
| True |
| |
| .. attribute:: extensions |
| |
| :type: :class:`Extensions` |
| |
| The extensions encoded in the certificate. |
| |
| :raises cryptography.x509.DuplicateExtension: If more than one |
| extension of the same type is found within the certificate. |
| |
| .. class:: Name |
| |
| .. versionadded:: 0.8 |
| |
| An X509 Name is an ordered list of attributes. The object is iterable to |
| get every attribute or you can use :meth:`Name.get_attributes_for_oid` to |
| obtain the specific type you want. Names are sometimes represented as a |
| slash or comma delimited string (e.g. ``/CN=mydomain.com/O=My Org/C=US`` or |
| ``CN=mydomain.com, O=My Org, C=US``). |
| |
| .. doctest:: |
| |
| >>> len(cert.subject) |
| 3 |
| >>> for attribute in cert.subject: |
| ... print(attribute) |
| <NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.6, name=countryName)>, value=u'US')> |
| <NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.10, name=organizationName)>, value=u'Test Certificates 2011')> |
| <NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'Good CA')> |
| |
| .. method:: get_attributes_for_oid(oid) |
| |
| :param oid: An :class:`ObjectIdentifier` instance. |
| |
| :returns: A list of :class:`NameAttribute` instances that match the |
| OID provided. If nothing matches an empty list will be returned. |
| |
| .. doctest:: |
| |
| >>> cert.subject.get_attributes_for_oid(x509.OID_COMMON_NAME) |
| [<NameAttribute(oid=<ObjectIdentifier(oid=2.5.4.3, name=commonName)>, value=u'Good CA')>] |
| |
| .. class:: Version |
| |
| .. versionadded:: 0.7 |
| |
| An enumeration for X.509 versions. |
| |
| .. attribute:: v1 |
| |
| For version 1 X.509 certificates. |
| |
| .. attribute:: v3 |
| |
| For version 3 X.509 certificates. |
| |
| .. class:: NameAttribute |
| |
| .. versionadded:: 0.8 |
| |
| An X.509 name consists of a list of NameAttribute instances. |
| |
| .. attribute:: oid |
| |
| :type: :class:`ObjectIdentifier` |
| |
| The attribute OID. |
| |
| .. attribute:: value |
| |
| :type: :term:`text` |
| |
| The value of the attribute. |
| |
| .. class:: ObjectIdentifier |
| |
| .. versionadded:: 0.8 |
| |
| Object identifiers (frequently seen abbreviated as OID) identify the type |
| of a value (see: :class:`NameAttribute`). |
| |
| .. attribute:: dotted_string |
| |
| :type: :class:`str` |
| |
| The dotted string value of the OID (e.g. ``"2.5.4.3"``) |
| |
| X.509 Extensions |
| ~~~~~~~~~~~~~~~~ |
| |
| .. class:: Extensions |
| |
| .. versionadded:: 0.9 |
| |
| An X.509 Extensions instance is an ordered list of extensions. The object |
| is iterable to get every extension. |
| |
| .. class:: Extension |
| |
| .. versionadded:: 0.9 |
| |
| .. attribute:: oid |
| |
| :type: :class:`ObjectIdentifier` |
| |
| The :ref:`extension OID <extension_oids>`. |
| |
| .. attribute:: critical |
| |
| :type: bool |
| |
| Determines whether a given extension is critical or not. :rfc:`5280` |
| requires that "A certificate-using system MUST reject the certificate |
| if it encounters a critical extension it does not recognize or a |
| critical extension that contains information that it cannot process". |
| |
| .. attribute:: value |
| |
| Returns an instance of the extension type corresponding to the OID. |
| |
| .. class:: BasicConstraints |
| |
| .. versionadded:: 0.9 |
| |
| Basic constraints is an X.509 extension type that defines whether a given |
| certificate is allowed to sign additional certificates and what path |
| length restrictions may exist. It corresponds to |
| :data:`OID_BASIC_CONSTRAINTS`. |
| |
| .. attribute:: ca |
| |
| :type: bool |
| |
| Whether the certificate can sign certificates. |
| |
| .. attribute:: path_length |
| |
| :type: int or None |
| |
| The maximum path length for certificates subordinate to this |
| certificate. This attribute only has meaning if ``ca`` is true. |
| If ``ca`` is true then a path length of None means there's no |
| restriction on the number of subordinate CAs in the certificate chain. |
| If it is zero or greater then that number defines the maximum length. |
| For example, a ``path_length`` of 1 means the certificate can sign a |
| subordinate CA, but the subordinate CA is not allowed to create |
| subordinates with ``ca`` set to true. |
| |
| |
| Object Identifiers |
| ~~~~~~~~~~~~~~~~~~ |
| |
| X.509 elements are frequently identified by :class:`ObjectIdentifier` |
| instances. The following common OIDs are available as constants. |
| |
| Name OIDs |
| ~~~~~~~~~ |
| |
| .. data:: OID_COMMON_NAME |
| |
| Corresponds to the dotted string ``"2.5.4.3"``. Historically the domain |
| name would be encoded here for server certificates. :rfc:`2818` deprecates |
| this practice and names of that type should now be located in a |
| SubjectAlternativeName extension. This OID is typically seen in X.509 names. |
| |
| .. data:: OID_COUNTRY_NAME |
| |
| Corresponds to the dotted string ``"2.5.4.6"``. This OID is typically seen |
| in X.509 names. |
| |
| .. data:: OID_LOCALITY_NAME |
| |
| Corresponds to the dotted string ``"2.5.4.7"``. This OID is typically seen |
| in X.509 names. |
| |
| .. data:: OID_STATE_OR_PROVINCE_NAME |
| |
| Corresponds to the dotted string ``"2.5.4.8"``. This OID is typically seen |
| in X.509 names. |
| |
| .. data:: OID_ORGANIZATION_NAME |
| |
| Corresponds to the dotted string ``"2.5.4.10"``. This OID is typically seen |
| in X.509 names. |
| |
| .. data:: OID_ORGANIZATIONAL_UNIT_NAME |
| |
| Corresponds to the dotted string ``"2.5.4.11"``. This OID is typically seen |
| in X.509 names. |
| |
| .. data:: OID_SERIAL_NUMBER |
| |
| Corresponds to the dotted string ``"2.5.4.5"``. This is distinct from the |
| serial number of the certificate itself (which can be obtained with |
| :func:`Certificate.serial`). This OID is typically seen in X.509 names. |
| |
| .. data:: OID_SURNAME |
| |
| Corresponds to the dotted string ``"2.5.4.4"``. This OID is typically seen |
| in X.509 names. |
| |
| .. data:: OID_GIVEN_NAME |
| |
| Corresponds to the dotted string ``"2.5.4.42"``. This OID is typically seen |
| in X.509 names. |
| |
| .. data:: OID_TITLE |
| |
| Corresponds to the dotted string ``"2.5.4.12"``. This OID is typically seen |
| in X.509 names. |
| |
| .. data:: OID_GENERATION_QUALIFIER |
| |
| Corresponds to the dotted string ``"2.5.4.44"``. This OID is typically seen |
| in X.509 names. |
| |
| .. data:: OID_DN_QUALIFIER |
| |
| Corresponds to the dotted string ``"2.5.4.46"``. This specifies |
| disambiguating information to add to the relative distinguished name of an |
| entry. See :rfc:`2256`. This OID is typically seen in X.509 names. |
| |
| .. data:: OID_PSEUDONYM |
| |
| Corresponds to the dotted string ``"2.5.4.65"``. This OID is typically seen |
| in X.509 names. |
| |
| .. data:: OID_DOMAIN_COMPONENT |
| |
| Corresponds to the dotted string ``"0.9.2342.19200300.100.1.25"``. A string |
| holding one component of a domain name. See :rfc:`4519`. This OID is |
| typically seen in X.509 names. |
| |
| .. data:: OID_EMAIL_ADDRESS |
| |
| Corresponds to the dotted string ``"1.2.840.113549.1.9.1"``. This OID is |
| typically seen in X.509 names. |
| |
| Signature Algorithm OIDs |
| ~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| .. data:: OID_RSA_WITH_MD5 |
| |
| Corresponds to the dotted string ``"1.2.840.113549.1.1.4"``. This is |
| an MD5 digest signed by an RSA key. |
| |
| .. data:: OID_RSA_WITH_SHA1 |
| |
| Corresponds to the dotted string ``"1.2.840.113549.1.1.5"``. This is |
| a SHA1 digest signed by an RSA key. |
| |
| .. data:: OID_RSA_WITH_SHA224 |
| |
| Corresponds to the dotted string ``"1.2.840.113549.1.1.14"``. This is |
| a SHA224 digest signed by an RSA key. |
| |
| .. data:: OID_RSA_WITH_SHA256 |
| |
| Corresponds to the dotted string ``"1.2.840.113549.1.1.11"``. This is |
| a SHA256 digest signed by an RSA key. |
| |
| .. data:: OID_RSA_WITH_SHA384 |
| |
| Corresponds to the dotted string ``"1.2.840.113549.1.1.12"``. This is |
| a SHA384 digest signed by an RSA key. |
| |
| .. data:: OID_RSA_WITH_SHA512 |
| |
| Corresponds to the dotted string ``"1.2.840.113549.1.1.13"``. This is |
| a SHA512 digest signed by an RSA key. |
| |
| .. data:: OID_ECDSA_WITH_SHA224 |
| |
| Corresponds to the dotted string ``"1.2.840.10045.4.3.1"``. This is |
| a SHA224 digest signed by an ECDSA key. |
| |
| .. data:: OID_ECDSA_WITH_SHA256 |
| |
| Corresponds to the dotted string ``"1.2.840.10045.4.3.2"``. This is |
| a SHA256 digest signed by an ECDSA key. |
| |
| .. data:: OID_ECDSA_WITH_SHA384 |
| |
| Corresponds to the dotted string ``"1.2.840.10045.4.3.3"``. This is |
| a SHA384 digest signed by an ECDSA key. |
| |
| .. data:: OID_ECDSA_WITH_SHA512 |
| |
| Corresponds to the dotted string ``"1.2.840.10045.4.3.4"``. This is |
| a SHA512 digest signed by an ECDSA key. |
| |
| .. data:: OID_DSA_WITH_SHA1 |
| |
| Corresponds to the dotted string ``"1.2.840.10040.4.3"``. This is |
| a SHA1 digest signed by a DSA key. |
| |
| .. data:: OID_DSA_WITH_SHA224 |
| |
| Corresponds to the dotted string ``"2.16.840.1.101.3.4.3.1"``. This is |
| a SHA224 digest signed by a DSA key. |
| |
| .. data:: OID_DSA_WITH_SHA256 |
| |
| Corresponds to the dotted string ``"2.16.840.1.101.3.4.3.2"``. This is |
| a SHA256 digest signed by a DSA key. |
| |
| .. _extension_oids: |
| |
| Extension OIDs |
| ~~~~~~~~~~~~~~ |
| |
| .. data:: OID_BASIC_CONSTRAINTS |
| |
| Corresponds to the dotted string ``"2.5.29.19"``. The identifier for the |
| :class:`BasicConstraints` extension type. |
| |
| |
| Exceptions |
| ~~~~~~~~~~ |
| |
| .. class:: InvalidVersion |
| |
| This is raised when an X.509 certificate has an invalid version number. |
| |
| .. attribute:: parsed_version |
| |
| :type: int |
| |
| Returns the raw version that was parsed from the certificate. |
| |
| .. class:: DuplicateExtension |
| |
| This is raised when more than one X.509 extension of the same type is |
| found within a certificate. |
| |
| .. attribute:: oid |
| |
| :type: :class:`ObjectIdentifier` |
| |
| Returns the OID. |
| |
| .. class:: UnsupportedExtension |
| |
| This is raised when a certificate contains an unsupported extension type. |
| |
| .. attribute:: oid |
| |
| :type: :class:`ObjectIdentifier` |
| |
| Returns the OID. |
| |
| |
| .. _`public key infrastructure`: https://en.wikipedia.org/wiki/Public_key_infrastructure |
| .. _`TLS`: https://en.wikipedia.org/wiki/Transport_Layer_Security |