вторник, 18 ноября 2014 г.

Python. Генерация SSL сертификатов.

Для создания SSL сертификатов потребуется pyOpenSSL

Далее описан материал создания:
 1. Cамоподписанных сертификатов
 2. Подписанных сертификатов

 Установка:
pip install pyopenssl

1. Создание самоподписанных сертификатов
# _*_ coding: utf-8 _*_

import os
from OpenSSL import crypto

KEY_FILE = "app.key"
CERT_FILE = "app.crt"

def create_self_signed_cert(cert_dir):
    k = crypto.PKey()
    k.generate_key(crypto.TYPE_RSA, 1024)   #  размер может быть 2048, 4196

    #  Создание сертификата
    cert = crypto.X509()
    cert.get_subject().C = "RU"   #  указываем свои данные
    cert.get_subject().ST = "Tatarstan"   #  указываем свои данные
    cert.get_subject().L = "Naberezhnye Chelny"   #  указываем свои данные
    cert.get_subject().O = "xazrad"   #  указываем свои данные
    cert.get_subject().OU = "xazrad"   #  указываем свои данные
    cert.get_subject().CN = "xazrad.blogspot.com"   #  указываем свои данные
    cert.set_serial_number(1000)
    cert.gmtime_adj_notBefore(0)
    cert.gmtime_adj_notAfter(10*365*24*60*60)   #  срок "жизни" сертификата
    cert.set_issuer(cert.get_subject())
    cert.set_pubkey(k)
    cert.sign(k, 'sha1')

    with open(os.path.join(cert_dir, CERT_FILE), "w") as f:
        f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))

    with open(os.path.join(cert_dir, KEY_FILE), "w") as f:
        f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k))


2. Создание подписанных сертификатов
# _*_ coding: utf-8 _*_

import os
from OpenSSL import crypto

KEY_FILE = "app.key"
CERT_FILE = "app.crt"
CA_CRT = "CA_CRT.crt"   #  сертификат, которым производится подпись
CA_KEY = "CA_KEY.key"   #  ключ, которым производится подпись

def create_signed_cert(cert_dir):
    #  Загружаем промежуточный сертификат для подписи
    ca_cert = crypto.load_certificate(crypto.FILETYPE_PEM, open(CA_CRT).read())
    #  Загружаем промежуточный ключ, последний параметр пароль
    ca_key = crypto.load_privatekey(crypto.FILETYPE_PEM, open(CA_KEY).read(), "password")

    k = crypto.PKey()
    k.generate_key(crypto.TYPE_RSA, 1024)    # размер может быть 2048, 4196

    cert = crypto.X509()     cert.get_subject().C = "RU"    #  указываем свои данные
    cert.get_subject().ST = "Tatarstan"    #  указываем свои данные
    cert.get_subject().L = "Naberezhnye Chelny"    #  указываем свои данные
    cert.get_subject().O = "xazrad"    #  указываем свои данные
    cert.get_subject().OU = "xazrad"    #  указываем свои данные
    cert.get_subject().CN = "xazrad.blogspot.com"    #  указываем свои данные
    cert.set_serial_number(1000)
    cert.gmtime_adj_notBefore(0)
    cert.gmtime_adj_notAfter(10*365*24*60*60)    #  срок "жизни" сертификата
    cert.set_issuer(ca_cert.get_subject())
    cert.set_pubkey(k)
    cert.sign(ca_key, "sha1")

    with open(os.path.join(cert_dir, CERT_FILE), "w") as f:
        f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))

    with open(os.path.join(cert_dir, KEY_FILE), "w") as f:
        f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k))

Использование crypto.FILETYPE_ASN1 (вместо crypto.FILETYPE_PEM) возвращает битовое значение сертификатов.

Комментариев нет:

Отправить комментарий