Skip to main content

A certifi hack to use system trust store on Linux/FreeBSD

Project description

certifi-system-store, a certifi hack to use system trust store

certifi-system-store is a replacement and hack for consumers of certifi. It replaces certifi with an alternative implementation that uses the system trust store on Linux and some BSD distributions.

Please be advised that this package is brand new and highly experimental. It hasn't been tested in any production environment.

Installation

You absolutely must run python -m certifi after installing the package. The command ensures that you have a working system trust store and patches your current Python environment. It creates or replaces certifi's dist-info directory with certifi-system-store's dist-info.

I recommend that you install certifi-system-store and patch first, then install your packages and requirements.

$ python -m pip install certifi-system-store
$ python -m certifi
$ python -m pip install requests

Verification

The certifi command of certifi-system-store has an additional argument --system-store. The argument is not available with standard certifi package. You can use the property to verify that certifi package is provided by certifi-system-store.

$ python -m venv venv
$ venv/bin/pip install certifi
$ venv/bin/python -m certifi --system-store
usage: __main__.py [-h] [-c]
__main__.py: error: unrecognized arguments: --system-store
$ echo $?
2
$ venv/bin/pip install certifi-system-store
$ venv/bin/python -m certifi --system-store
/etc/pki/tls/cert.pem
$ echo $?
0

The command also checks for the presence of a CA cert bundle:

$ venv/bin/python -m certifi
Traceback (most recent call last):
  ...
FileNotFoundError: /etc/ssl/cert.pem, /etc/pki/tls/cert.pem, /etc/ssl/certs/ca-certificates.crt, /etc/ssl/ca-bundle.pem
$ echo $?
1

To check for certifi-system-store at runtime:

import certifi

if not getattr(certifi, "__certifi_system_store__", False):
    raise ImportError("certifi-system-store is not installed")

To depend on certifi-system-store:

# setup.py
from setuptools import setup

setup(
    ...,
    install_requires=[
        "certifi-system-store ; sys_platform == 'linux' or 'freebsd' in sys_platform",
        "certifi > 3000 ; sys_platform == 'linux' or 'freebsd' in sys_platform",
        "certifi",
    ],
)

Platform support

Supported platforms

Most major Linux distributions and FreeBSD are supported.

  • Alpine
  • Debian-based distributions (Ubuntu, Raspberry Pi OS, Tails, ...)
  • Fedora-based distributions (RHEL, CentOS, CentOS Streams)
  • FreeBSD
    • NOTE: may require manual installation of ca_root_nss
  • OpenSUSE

Untested platforms

certifi-system-store may work, but there is no CI for these platforms.

  • ArchLinux
  • Gentoo
  • OpenWRT
  • Slackware
  • VoidLinux
  • other Linux distributions not based on Debian or Fedora
  • OpenBSD
  • NetBSD

Unsupported platforms

  • Windows
  • macOS
  • Android (has a cert directory but not a PEM bundle)
  • iOS

Supported system trust stores

/etc/ssl/cert.pem

  • Alpine
  • Arch
  • Fedora 34+ (see rhbz#1895619)
  • FreeBSD (requires ca_root_nss package)
  • OpenWRT
  • RHEL 9

/etc/pki/tls/cert.pem

  • CentOS 7, 8
  • Fedora 33 and earlier
  • RHEL 7, 8

/etc/ssl/certs/ca-certificates.crt

  • Debian (requires ca-certificates package)
  • Gentoo
  • Ubuntu (requires ca-certificates package)

/etc/ssl/ca-bundle.pem

  • SUSE

How does it work?

  • empty certifi/cacert.pem to override any existing certifi data.
  • fake certifi dist-info with much higher version number than certifi's default dist-info metadata
$ venv/bin/pip install certifi-system-store
$ ls -l .tox/venv/lib/python3.9/site-packages/
certifi
certifi_system_store-3000.1.dist-info
...
$ venv/bin/python -m certifi -v --system-store
certifi-system store 3000.0a1
Patched certifi.dist-info -> certifi_system_store.dist-info
/etc/pki/tls/cert.pem
$ ls -l .tox/venv/lib/python3.9/site-packages/
certifi
certifi-3000.1.dist-info -> certifi_system_store-3000.1.dist-info
certifi_system_store-3000.1.dist-info
...

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

certifi-system-store-3021.3.13.tar.gz (15.5 kB view details)

Uploaded Source

Built Distribution

certifi_system_store-3021.3.13-py3-none-any.whl (11.5 kB view details)

Uploaded Python 3

File details

Details for the file certifi-system-store-3021.3.13.tar.gz.

File metadata

  • Download URL: certifi-system-store-3021.3.13.tar.gz
  • Upload date:
  • Size: 15.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.1.3 requests-toolbelt/0.9.1 tqdm/4.56.2 CPython/3.9.2

File hashes

Hashes for certifi-system-store-3021.3.13.tar.gz
Algorithm Hash digest
SHA256 6b73d803a34d647e729ac9c8dfd4cfa6f8611407a38d3d17665ccb7a40372604
MD5 30fa2c2d0db7ffcbccf92f6ee4667676
BLAKE2b-256 6cd0e9f6b7f592c775554e20586471544aef3eef415808923e7f9bfaf28a3587

See more details on using hashes here.

File details

Details for the file certifi_system_store-3021.3.13-py3-none-any.whl.

File metadata

  • Download URL: certifi_system_store-3021.3.13-py3-none-any.whl
  • Upload date:
  • Size: 11.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.1.3 requests-toolbelt/0.9.1 tqdm/4.56.2 CPython/3.9.2

File hashes

Hashes for certifi_system_store-3021.3.13-py3-none-any.whl
Algorithm Hash digest
SHA256 477ed4a438ae937b42b8e2ed33eb52336db0369b8a072f373d2bcf813c092412
MD5 0c114221847cb4d0710bc6fb3cae8131
BLAKE2b-256 429025adcb3cb20a8a46fa842d4d161e45f2684d448d5fb35ba982389ec79888

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page