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 с ошибкой