README.md

    CAApi

    Microsoft Certificate Authority библиотека для Python. Пригодится, если надо поднять PKI на Linux завязанный под Центр сертификации Windows Server (например для массовой выдачи неквалифицированных электронных подписей).

    Зависимости

    • Python 3.x
    • Paramiko
    • OpenSSH
    • OpenSSL

    Настройка пользователя

    Логинимся на Windows сервер под пользователем с правами администратора домена (он же будет использоваться для ssh). Запускаем certmgr.msc и выполняем “Запросить новый сертификат -> Политика регистрации Active Directory -> Агент регистрации”. Запускаем оснастку “Центр сертификации” и выполняем “Создать -> Выдаваемый шаблон сертификата” и добавляем шаблоны “Компьютер” и “Агент регистрации”.

    Настройка шаблона

    В оснастке “Центр сертификации” выполняем “Шаблоны сертификации -> Управление”. Создаем копию шаблона “Агент регистрации”. Далее по скриншотам:

    Общие

    Совместимость

    Безопасность

    Обработка

    Шифрование

    Субъект

    Выдача

    В остальных вкладках все оставляем по-умолчанию.

    Настройка групповых политик

    В оснастке “Управление групповой политикой” создаем отдельную политику (на всякий кейс) для автоматической регистрации сертификатов и настраиваем как на скринах:

    Конфигурация компьютера

    Конфигурация компьютера

    Конфигурация пользователя

    Конфигурация пользователя

    Настройка SSH

    Говорят сейчас Windows Server по-умолчанию идет с ssh. Но если у вас обновленный сервер, то он вряд ли есть. Я ставил с репозитория chocolatey. Генерируем ключ на Linux сервере:

    ssh-keygen -t rsa
    cat /path/to/id_rsa.pub
    

    Открытый ключ прописываем на Windows Server по пути %programdata%\ssh\administrators_authorized_keys. Проверяем подключение:

    ssh administrator@winserv_ip 'whoami'
    

    Инициализация

    from caapi import CAApi
    
    cas = CAApi(winserv_ip, admin_login, remote_temp_dir, local_certs_dir, ca_name, cert_template, backward_compat=False)
    

    Если версия SSH сервера на Windows Server ниже 8, а версия клиента 8 или выше, то backward_compat надо установить в True.

    Пример

    cert_template = "1.3.6.1.4.1.311.21.8.5651447.1341949.11750026.13543132.4387299.20.5585599.1234567"
    cas = CAApi(
        "192.168.0.9",
        "administrator",
        "c:\\temp", #директория для временных файлов
        "./certs", #локальная директория хранения сертификатов
        "CONTOSO\\dc-CONTOSO-CA-1",
        cert_template,
        backward_compat=False
    )
    cas.generate_config("Vasya Pupkin", "vasya@dc.example.com", "vasya@example.com", "CONTOSO")
    cas.generate_cert("vasya@dc.example.com", "123", "administrator")
    cas.revoke_cert("vasya@dc.example.com", "123", "3")
    

    OID шаблона можно узнать в PowerShell:

    Get-CATemplate
    

    Методы

    • generate_config(user_fullname, user_principalname, user_mail, user_domain) bool -> генерирует конфигурацию для запроса сертификата пользователя
    • generate_cert(user_principalname, cert_pass, cep_cert) bool -> генерирует сертификат пользователя
    • revoke_cert(user_principalname, cert_pass, reason) bool -> отзывает сертификат пользователя

    В generate_cert в параметре cep_cert есть ремарка. Обычно в качестве значения передается имя пользователя для которого выписан CEP сертификат (обычно это administrator). Но если у вас несколько CEP сертификатов, то certreq выдаст ошибку и попросит нажать кнопку “ОК” из-за чего все зависает. Потому если у вас более одного сертификата, то вместо имени пользователя лучше использовать серийный номер сертификата.

    Название ЦС (ca_name) можно увидеть в оснастке “Центр сертификации”.

    Название домена (user_domain) можно узнать командой “echo %USERDOMAIN%”.

    Название сертификата CEP обычно совпадает с именем пользователя, которому оно было выдано (см. “настройка пользователя”).

    Коды отзывов

    Код Причина
    0 Не указано (по-умолчанию). Не рекомендуется использовать из-за сложностей в будущем при аудите.
    1 Ключ сертификата скомпромитирован. Следует использовать при утечке ключей сертификатов или их паролей.
    2 Центр сертификации скомпрометирован. Следует использовать, если центр сертификации был взломан.
    3 Изменение принадлежности. Следует использовать, если пользователь был уволен.
    4 Заменено. Используется, если пользователь забыл пароль, сломал смарт-карту или изменил имя.
    5 Прекращение работы. Используется для отзыва сертификата ЦС, когда ЦС прекращает свою работу и больше не будет использоваться.
    6 Временный отзыв. Это значит, что ЦС не будет распозновать сертификат на время отзыва. Сертификат может быть возвращен к использованию (кодом 8).
    8 Удаление из списка отзыва. Возврат сертификата к использованию при этом сертификат все еще будет в списке отозованных, но с кодом 8.
    Описание

    Microsoft Certificate Authority library for Python

    Конвейеры
    0 успешных
    0 с ошибкой