Подпишите CSR от клиента с помощью корневого сертификата CA в python

Я новичок в Python и все еще изучаю его, поэтому мой вопрос может быть немного наивным. Пожалуйста, потерпите;)

Проблема в том, что клиент будет отправлять CSR, и я хочу подписать его с помощью моего корневого сертификата CA и вернуть подписанный сертификат обратно клиенту.

Я использовал эту команду, чтобы сделать это из командной строки

openssl x509 -req -in device.csr -CA root.pem -CAkey root.key -CAcreateserial -out device.crt -days 500

то же самое, что я хочу достичь с помощью python. Я нашел библиотеку python для openssl pyopenssl

можно ли использовать эту библиотеку? Как ? или я иду на M2Crypto?


person nishi    schedule 16.04.2014    source источник


Ответы (2)


Вы действительно можете использовать pyOpenSSL. Как вы говорите, у вас уже есть корневой сертификат CA и закрытый ключ, и CSR будет отправлен клиентом, тогда вы можете использовать функции шифрования, чтобы прочитать все эти (сертификат CA, закрытый ключ и CSR устройства) из файла или управлять тем, чтобы иметь их в буфере.

Для начала используйте функции, указанные ниже. Проверьте dir(crypto) and crypto.function_name.__doc__ на интерпретаторе python для получения дополнительной информации :) Вам необходимо импортировать криптовалюту из pyOpenSSL

  1. crypto.load_certificate_request () - получить объект CSR устройства
  2. crypto.load_privatekey () - получить объект закрытого ключа для закрытого ключа CA
  3. crypto.load_certificate () - получить корневой сертификат CA

тогда вы можете написать простую функцию для возврата сертификата

def create_cert():
    cert = crypto.X509()
    cert.set_serial_number(serial_no)
    cert.gmtime_adj_notBefore(notBeforeVal)
    cert.gmtime_adj_notAfter(notAfterVal)
    cert.set_issuer(caCert.get_subject())
    cert.set_subject(deviceCsr.get_subject())
    cert.set_pubkey(deviceCsr.get_pubkey())
    cert.sign(CAprivatekey, digest)
    return cert

где caCert, deviceCsr и CAprivatekey - значения из трех вышеуказанных функций. Теперь, когда у вас есть сертификат, вы можете записать его в файл с помощью crypto.dump_certificate(crypto.FILETYPE_PEM, cert) с именем файла по вашему выбору.

Вы можете изменить эту функцию в соответствии с вашими требованиями. После этого вы можете проверить сгенерированный сертификат устройства с помощью корневого сертификата CA с помощью команды openssl, например. openssl verify -CApath <CA cert path> <name of device cert file>

Вы также можете просмотреть несколько примеров с github. Пример M2Crypto, пример pyOpenSSL

Надеюсь, это даст вам представление о реализации

person Harshawardhan    schedule 16.04.2014

Сопровождающий pyOpenSSL рекомендует использовать cryptography модуль для манипуляций с X509 (см. Примечание вверху страницы документации: https://www.pyopenssl.org/en/stable/api/crypto.html).

Вот код для создания сертификата из CSR, подписанного CA:

def sign_certificate_request(csr_cert, ca_cert, private_ca_key):
    cert = x509.CertificateBuilder().subject_name(
        csr_cert.subject
    ).issuer_name(
        ca_cert.subject
    ).public_key(
        csr_cert.public_key()
    ).serial_number(
        x509.random_serial_number()
    ).not_valid_before(
        datetime.utcnow()
    ).not_valid_after(
        # Our certificate will be valid for 10 days
        datetime.utcnow() + timedelta(days=10)
    # Sign our certificate with our private key
    ).sign(private_ca_key, hashes.SHA256())

    # return DER certificate
    return cert.public_bytes(serialization.Encoding.DER)
  • csr_cert - это объект сертификата cryptography CSR - может быть загружен из файла с помощью x509.load_der_x509_csr()
  • ca_cert - это cryptography объект сертификата - может быть загружен из файла с x509.load_pem_x509_certificate()
  • private_ca_key - это объект закрытого ключа cryptography - может быть загружен из файла с помощью serialization.load_pem_private_key()
person OlivierM    schedule 13.01.2021
comment
Мне кажется, что аргумент issuer_name() должен быть ca_cert.subject, а не ca_cert.issuer? - person Erik Forsberg; 22.03.2021
comment
@ErikForsberg Вы правы. Не стесняйтесь обновлять мой пост, если вы обнаружили проблему :-) - person OlivierM; 23.03.2021