Как заменить класс CertificateRequest на Windows Crypto API в генераторе сертификатов?

Мы сделали генератор сертификатов для нашего сервера и планируем встроить его в инсталлятор, чтобы всё происходило автоматически.

Для генерации сертификатов используется класс .NET Framework CertificateRequest. С помощью него можно сгенерировать сертификат сервера, подписанный сертификатом нашего НИИ, вшитого в программу. Главное, что меня сейчас не устраивает в получившейся программе - это её системные требования. Сам сервер сделан на .NET Framework 4.0, совместимом с Windows XP, которая кое-где у нас стоит, а класс CertificateRequest появился только в .NET Framework 4.7.2, который несовместим с Windows XP. Мне не нравится, что такая вспомогательная вещь имеет более высокие системные требования, чем основной продукт, при том, что для этого нет объективных причин. То, что мы не осилили ничего сложнее, чем класс CertificateRequest, - это субъективная причина.

Я смотрю в сторону Windows CryptoAPI, но там слишком скупая документация относительно генерации сертификатов, в основном описана их установка. По идее, нам нужна функция CryptSignAndEncodeCertificate, но в документации отсутствуют примеры того, что нужно передавать ей в качестве параметров, которых целых 9. Кроме того, у самого сертификата должно быть несколько расширений, и вроде бы в CryptoAPI это поддерживается, но тоже описано как-то очень скупо, без примеров.

Для сертификата нам нужно задать:

  • Subject с именем хоста, куда устанавливается сервер (именно из-за возможных разных хостов нам нужен генератор сертификатов)
  • DNS с тем же именем хоста
  • Ограничения: сертификат не является Certification Authority
  • Использование ключа: цифровая подпись, проверка подлинности
  • Улучшенный ключ: проверка подлинности сервера (Oid 1.3.6.1.5.5.7.3.1)
  • Идентификатор ключа субъекта - сгенерированный открытый ключ RSA
  • Срок действия сертификата
  • Серийный номер сертификата

При создании сертификат необходимо подписать корневым сертификатом нашего НИИ.

Существует .NET библиотека Pluralsight, которая использует CryptoAPI, кое-что можно посмотреть в ней, но она умеет генерировать только самоподписанные сертификаты, а не сертификаты, подписанные другим сертификатом.


Ответы (0 шт):