This is a pre-production deployment of Warehouse, however changes made here WILL affect the production instance of PyPI.
Latest Version Dependencies status unknown Test status unknown Test coverage unknown
Project Description

RFC 6960 compliant OCSP Responder framework written in Python 3.5+.

It is based on the ocspbuilder and asn1crypto libraries. The HTTP server is implemented using Bottle.

Current status: Alpha. Don’t use for production yet.



  • Simple: Don’t overwhelm the user with a gazillion options.
  • Flexible: Configurable using Python code.

Supported extensions

  • Nonce (RFC 6960 Section 4.4.1)

Not (yet) implemented

  • Multiple certificates per request / response


Right now, ocspresponder assumes the usage of a custom keypair just for signing OCSP responses.

To be able to instantiate the OCSPResponder server, you need to provide this keypair as well as the certificate of the issueing CA.

ISSUER_CERT = 'path/to/issuer_cert.pem'
OCSP_CERT = 'path/to/responder_cert.pem'
OCSP_KEY = 'path/to/responder_key.pem'

Furthermore you need to provide two custom functions:

  • A function that – given a certificate serial – will return the appropriate CertificateStatus and - depending on the status - a revocation datetime.
  • A function that – given a certificate serial – will return the corresponding certificate as a string.

You’re expected to implement these functions yourself. In the future, drop-in libraries for typical use cases could be provided.

Example implementations:

from ocspresponder import OCSPResponder, CertificateStatus

def validate(serial: int) -> (CertificateStatus, Optional[datetime]):
    if certificate_is_valid(serial):
        return (CertificateStatus.good, None)
    elif certificate_is_expired(serial):
        expired_at = get_expiration_date(serial)
        return (CertificateStatus.revoked, expired_at)
    elif certificate_is_revoked(serial):
        revoked_at = get_revocation_date(serial)
        return (CertificateStatus.revoked, revoked_at)
        return (CertificateStatus.unknown, None)

def get_cert(serial: int) -> str:
    Assume the certificates are stored in the ``certs`` directory with the
    serial as base filename.
    with open('certs/%s.cert.pem' % serial, 'r') as f:

If an exception occurs in either of the two functions, an OCSP response with the response_status set to internal_error will be returned.

Now you can instantiate the OCSPResponder and launch the development server:

print('Initializing OCSP responder')
app = OCSPResponder(
print('Starting OCSP responder')
app.serve(port=8080, debug=True)

Type hints

This library uses the optional type hints as defined in PEP484. The typing module is only provided in Python 3.5+, but older versions of Python could run the code as well if the typing module is installed from PyPI.


To run the test, install requirements-dev.txt using pip and run pytest:

py.test -v

Release process

Update version number in and

vim -p

Do a commit and signed tag of the release:

git add
git commit -m "Release v${VERSION}"
git tag -u C75D77C8 -m "Release v${VERSION}" v${VERSION}

Build source and binary distributions:

python3 sdist
python3 bdist_wheel

Sign files:

gpg --detach-sign -u C75D77C8 -a dist/ocspresponder-${VERSION}.tar.gz
gpg --detach-sign -u C75D77C8 -a dist/ocspresponder-${VERSION}-py3-none-any.whl

Register package on PyPI:

twine3 register -r pypi-threema dist/ocspresponder-${VERSION}.tar.gz

Upload package:

twine3 upload -r pypi-threema dist/ocspresponder-${VERSION}*
git push
git push --tags


Copyright 2016 Threema GmbH

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
See the License for the specific language governing permissions and
limitations under the License.
Release History

Release History


This version

History Node

TODO: Figure out how to actually get changelog content.

Changelog content for this version goes here.

Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Show More

Download Files

Download Files

TODO: Brief introduction on what you do with files - including link to relevant help section.

File Name & Checksum SHA256 Checksum Help Version File Type Upload Date
ocspresponder-0.5.0-py3-none-any.whl (9.3 kB) Copy SHA256 Checksum SHA256 py3 Wheel May 2, 2016
ocspresponder-0.5.0.tar.gz (5.8 kB) Copy SHA256 Checksum SHA256 Source May 2, 2016

Supported By

WebFaction WebFaction Technical Writing Elastic Elastic Search Pingdom Pingdom Monitoring Dyn Dyn DNS Sentry Sentry Error Logging CloudAMQP CloudAMQP RabbitMQ Heroku Heroku PaaS Kabu Creative Kabu Creative UX & Design Fastly Fastly CDN DigiCert DigiCert EV Certificate Rackspace Rackspace Cloud Servers DreamHost DreamHost Log Hosting