Управление Центром сертификации программно (C # или C ++) - PullRequest
4 голосов
/ 06 апреля 2011

Я пишу клиент-серверное приложение, которое требует, чтобы сервер имел возможность аутентифицировать клиента, а также требует шифрования всех сообщений.

Механизм для обеспечения этого должен быть самодостаточным в серверном и клиентском приложении, а также быть полностью автоматизированным (взаимодействие с человеком не требуется). SSL, кажется, лучший способ сделать это, и я также знаком с этим.

Для каждого клиента, которому необходимо развернуть на нем клиентское программное обеспечение, я планировал создать (на лету) установщик MSI с приложением, сертификатом клиента (подписанным сервером) и закрытым ключом, а также открытым сертификатом сервера (поэтому клиенты могут аутентифицировать сервер - сертификат сервера может быть самоподписанным).

Я могу сгенерировать ключ для клиента и сделать CSR, но, кажется, не могу найти способ фактически подписать CSR и сгенерировать сертификат для клиента. Я изучил Win32 Crypto API, но не смог найти примеров того, как на самом деле подписать CSR и получить сертификат клиента.

Я знаю, как сделать все это из командной строки с помощью инструмента openssl, но я не уверен, как это сделать из приложения.

Обратите внимание, что системное обращение к инструменту openssl и передача параметров, которые я знаю для работы, не вариант, так как это огромный риск для безопасности, чтобы полагаться на инструмент openssl, который не был скомпрометирован каким-либо образом. Делать это таким образом не для удовлетворения отдельного требования.

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

Я не могу делать никаких предположений о том, что сервер (или клиенты) имеют статический IP-адрес или имя хоста (DNS может быть сломан в любом случае), а также я не могу делать никаких предположений о какой-либо существующей инфраструктуре PKI.

Я пишу это в основном на C # .Net, но рассмотрю возможность написания расширения C ++, если оно даст мне эту функциональность.

Наконец, это мой первый пост здесь, так что, если я пропустил что-то очевидное или не указал какие-либо подробности, пожалуйста, спросите, и я заполню пробелы:)

Спасибо

Джеймс

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

Вам необходимо переосмыслить хотя бы часть этого.То, что вы делаете, в корне небезопасно.Личный ключ клиента должен быть сгенерирован на клиенте . В противном случае он не является частным, поэтому он не может удовлетворить ни один из принципов PKI.включая цель, для которой вы его выдаете.Вы теряете уникальность, и вы также теряете безответственность.Это оба роковые недостатки.

1 голос
/ 06 апреля 2011

В C # вы можете использовать пакет PKIBlackbox нашего продукта SecureBlackbox, который предоставляет все функции, которые вы ищете в .NET. Возможно, библиотека BouncyCastle также включает эту функцию.

...