Генерация CSR в Python

Я пытаюсь создать CSR на Python без использования OpenSSL. Если кто-то может указать в правильном направлении, я был бы очень благодарен.


person Sean Nilan    schedule 09.07.2010    source источник
comment
Вы не можете использовать какой-либо инструментарий или только OpenSSL? PKCS#10 (формат запроса сертификата) довольно прост, если у вас есть доступ к кодировщику ASN.1.   -  person Shawn D.    schedule 16.07.2010


Ответы (4)


Я предполагаю, что вы не хотите использовать командную строку openssl, и Python lib в порядке.

Вот вспомогательная функция, которую я написал для создания CSR. Он возвращает закрытый ключ из сгенерированной пары ключей и CSR. Функция зависит от pyOpenSSL.crypto.

def create_csr(self, common_name, country=None, state=None, city=None,
               organization=None, organizational_unit=None,
               email_address=None):
    """
    Args:
        common_name (str).

        country (str).

        state (str).

        city (str).

        organization (str).

        organizational_unit (str).

        email_address (str).

    Returns:
        (str, str).  Tuple containing private key and certificate
        signing request (PEM).
    """
    key = OpenSSL.crypto.PKey()
    key.generate_key(OpenSSL.crypto.TYPE_RSA, 2048)

    req = OpenSSL.crypto.X509Req()
    req.get_subject().CN = common_name
    if country:
        req.get_subject().C = country
    if state:
        req.get_subject().ST = state
    if city:
        req.get_subject().L = city
    if organization:
        req.get_subject().O = organization
    if organizational_unit:
        req.get_subject().OU = organizational_unit
    if email_address:
        req.get_subject().emailAddress = email_address

    req.set_pubkey(key)
    req.sign(key, 'sha256')

    private_key = OpenSSL.crypto.dump_privatekey(
        OpenSSL.crypto.FILETYPE_PEM, key)

    csr = OpenSSL.crypto.dump_certificate_request(
               OpenSSL.crypto.FILETYPE_PEM, req)

    return private_key, csr
person Laurent Luce    schedule 01.11.2015

m2crypto может быть решением (см. CreateX509Request в примере contrib), хотя он использует OpenSSL.

Вы также можете использовать python-nss, который использует библиотека Mozilla NSS. nss.nss.CertificateRequest был добавлен совсем недавно. Документация API, доступная на данный момент на веб-сайте, не актуальна, но вот несколько советов для более новых версий:

Это также в CVS:

:pserver:[email protected]:/cvsroot/mozilla/security/python/nss 
person Bruno    schedule 10.08.2010

Я начал реализовывать генератор CSR с использованием PyCrypto и PyASN1 в течение последних нескольких дней. Первый код доступен по адресу https://github.com/jandd/python-pkiutils.

person jandd    schedule 19.01.2014

Как и любой язык, Python просто реализует алгоритмы. Я почти ничего не знаю о криптографии, но если бы мне пришлось реализовать это на Python, я бы поискал спецификацию о том, как реализовать CSR.

Через Google и Википедию я нашел это RFC. Ваша задача — реализовать это на Python.

Лично я, вероятно, сначала попытался бы использовать инструмент командной строки (возможно, через вызов функции system(), если это нужно было из Python).

person Sean Woods    schedule 09.07.2010