Skip to main content

Certificate Authority Certificate Maker Tools

https://travis-ci.org/ikreymer/certauth.svg?branch=master https://coveralls.io/repos/ikreymer/certauth/badge.svg?branch=master

This package provides a small library, built on top of pyOpenSSL, which allows for creating a custom certificate authority certificate, and genereating on-demand dynamic host certs using that CA certificate.

It is most useful for use with a man-in-the-middle HTTPS proxy, for example, for recording or replaying web content.

Trusting the CA created by this tool should be used with caution in a controlled setting to avoid security risks.

CertificateAuthority API

The CertificateAuthority class provides an interface to manage a root CA and generate dynamic host certificates suitable for use with the native Python ssl library as well as pyOpenSSL SSL module.

The class provides several options for storing the root CA and generated host CAs.

File-based Certificate Cache

ca = CertificateAuthority('My Custom CA', 'my-ca.pem', cert_cache='/tmp/certs')
filename = ca.cert_for_host('example.com')

In this configuration, the root CA is stored at my-ca.pem and dynamically generated certs are placed in /tmp/certs. The filename returned would be /tmp/certs/example.com.pem in this example.

This filename can then be used with the Python ssl.load_cert_chain(certfile) command.

Note that the dynamically created certs are never deleted by certauth, it remains up to the user to handle cleanup occasionally if desired.

In-memory Certificate Cache

ca = CertificateAuthority('My Custom CA', 'my-ca.pem', cert_cache=50)
cert, key = ca.load_cert('example.com')

This configuration stores the root CA at my-ca.pem but uses an in-memory certificate cache for dynamically created certs. These certs are stored in an LRU cache, configured to keep at most 50 certs.

The cert and key can then be used with OpenSSL.SSL.Context.use_certificate

context = SSl.Context(...)
context.use_privatekey(key)
context.use_certificate(cert)

Custom Cache

A custom cache implementations which stores and retrieves per-host certificates can also be provided:

ca = CertificateAuthority('My Custom CA', 'my-ca.pem', cert_cache=CustomCache())
cert, key = ca.load_cert('example.com')

class CustomCache:
    def __setitem__(self, host, cert_string):
       # store cert_string for host

    def get(self, host):
       # return cached cert_string, if available
       cert_string = ...
       return cert_string

Wildcard Certs

To reduce the number of certs generated, it is convenient to generate wildcard certs.

cert, key = ca.load_cert('example.com', wildcard=True)

This will generate a cert for *.example.com.

To automatically generate a wildcard cert for parent domain, use:

cert, key = ca.load_cert('test.example.com', wildcard=True, wildcard_for_parent=True)

This will also generate a cert for *.example.com

Starting with 1.3.0, certauth uses tldextract to determine the tld for a given host, and will not use a parent domain if it is itself a tld suffix.

For example, calling:

cert, key = ca.load_cert('example.co.uk', wildcard=True, wildcard_for_parent=True)

will now result in a cert for *.example.co.uk, not *.co.uk.

CLI Usage Examples

certauth also includes a simple command-line API for certificate creation and management.

usage: certauth [-h] [-c CERTNAME] [-n HOSTNAME] [-d CERTS_DIR] [-f] [-w]
              root_ca_cert

positional arguments:
  root_ca_cert          Path to existing or new root CA file

optional arguments:
  -h, --help            show this help message and exit
  -c CERTNAME, --certname CERTNAME
                      Name for root certificate
  -n HOSTNAME, --hostname HOSTNAME
                      Hostname certificate to create
  -d CERTS_DIR, --certs-dir CERTS_DIR
                      Directory for host certificates
  -f, --force           Overwrite certificates if they already exist
  -w, --wildcard_cert   add wildcard SAN to host: *.<host>, <host>

To create a new root CA certificate:

certauth myrootca.pem --certname "My Test CA"

To create a host certificate signed with CA certificate in directory certs_dir:

certauth myrootca.pem --hostname "example.com" -d ./certs_dir

If the root cert doesn’t exist, it’ll be created automatically. If certs_dir, doesn’t exist, it’ll be created automatically also.

The cert for example.com will be created as certs_dir/example.com.pem. If it already exists, it will not be overwritten (unless -f option is used).

The -w option can be used to create a wildcard cert which has subject alternate names (SAN) for example.com and *.example.com

History

The CertificateAuthority functionality has evolved from certificate management originally found in the man-in-the-middle proxy pymiproxy by Nadeem Douba.

It was also extended in warcprox by Noah Levitt of Internet Archive.

The CA functionality was also reused in pywb and finally factored out into this separate package for modularity.

It is now also used by wsgiprox to provide a generalized HTTPS proxy wrapper to any WSGI application.

Metadata

Release files for certauth 1.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for certauth 1.3.0
File Size Uploaded
certauth-1.3.0.tar.gz 10.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for certauth 1.3.0
File Interpreter ABI Platform
certauth-1.3.0-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 21.4 kB

Release files / certauth-1.3.0.tar.gz

Download URL certauth-1.3.0.tar.gz
Size 10.8 kB
Tags Source
SHA-256 checksum
How to use checksums
7862d5deff0b33d2fb28d36861ba63d91c82d700bfdfc4bd848a8711ca72b8fb
BLAKE2b-256 checksum
How to use checksums
5cff48bdb93555bf93708100be50622ba6ff93d7026e9e172b9e8ab92c2ae8f1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.4.2 requests/2.18.4 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.15.0 CPython/3.5.3

Release files / certauth-1.3.0-py2.py3-none-any.whl

Download URL certauth-1.3.0-py2.py3-none-any.whl
Size 10.6 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
f84b8c7075d0e445614d5ec4662056511453f19228cf4fcf8278cccae17b316b
BLAKE2b-256 checksum
How to use checksums
186a748f61932188f9bfc7685089d9a83b36e239b828aeb610661871d4342917
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.4.2 requests/2.18.4 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.15.0 CPython/3.5.3

Release history Release notifications | RSS feed

This release

1.3.0 This release

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2

2 release files

1.1.6

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

1 release file

1.1.2

1 release file

1.1.1

1 release file

1.1.0

1 release file

1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page