Генерация CSR из экземпляра CngKey или X509Certificate(2)

Мне нужно сгенерировать файл запроса подписи сертификата для отправки в сторонний орган.

Я явно упускаю часть знаний, которая мешает мне сделать когнитивный скачок от CngKey и / или X509Certificate2 объекты, которые я успешно создал, и запрос на подпись сертификата ASN.1/DER в кодировке Base64.

Все поиски, которые я сделал для c# generate csr (и эквиваленты) подскажите, как создать самозаверяющий сертификат. Тем не менее, я не думаю, что это именно то, что мне нужно (или это?).

CngKey Объект создается с помощью закрытого ключа, сгенерированного аппаратным модулем безопасности, таким образом:

var parameters = new CngKeyCreationParameters
{
    Provider = "The HSM's ECDSA Provider",
    ExportPolicy = CngExportPolicies.AllowArchiving,
    KeyCreationOptions = CngKeyCreationOptions.None,
    KeyUsage = CngKeyUsages.Signing,
    UIPolicy = new CngUIPolicy(CngUIProtectionLevels.ForceHighProtection)
};
var key = CngKey.Create(CngAlgorithm.ECDsaP256, keyName, parameters);

С использованием System.Cryptography Расширения http://clrsecurity.codeplex.com/, я могу создать самозаверяющий сертификат:

var dn = new X500DistinguishedName("CN=MyCompany;OU=MyOrgUnit;OID.2.25.4.45=MyUniqueID");

var certParams = new X509CertificateCreationParameters(dn)
{
    SignatureAlgorithm = X509CertificateSignatureAlgorithm.ECDsaSha256,
};

var cert = key.CreateSelfSignedCertificate(certParams);

Я даже могу сохранить его в хранилище заявок на получение сертификатов:

var store = new X509Store("REQUEST", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();

Однако оттуда я застрял.

я пробовал Convert.ToBase64String(cert.Export(X509ContentType.Cert)) (и другие значения X509ContentType) но они не являются действительными (мои тесты дыма с openssl req кинь кучу ошибок ASN.1).

Имея это далеко, я бы предпочел не переписывать со сторонней библиотекой, такой как BouncyCastle или OpenSSL.NET, частично из-за отсутствия документации, частично из-за взаимодействия с HSM. Точно так же я не могу экспортировать закрытый ключ из HSM (потому что, в чем смысл HSM, если бы я мог?).

Я бы просто использовал обычную MMC Windows Certificates, если бы мог, но мне нужно предоставить ASN.1 BIT STRING как часть предмета (для краткости я исключил генерацию этого из вышеупомянутого), и я могу ' Похоже, это делается с помощью стандартного диалогового окна " Создать пользовательский запрос "

Однако этот диалог может создать желаемый формат файла CSR, поэтому функциональность должна где-то существовать, даже если она скрыта в Win32 API.

Так что это:

  1. Создать закрытый ключ
  2. Создать сертификат из ключа
  3. Храните сертификат
  4. ???
  5. Отправить CSR сторонним
  6. Прибыль.

Так чего именно мне не хватает...?

1 ответ

CSR - это запрос на подпись сертификата. Он содержит открытый ключ и все метаданные, которые вы хотите, чтобы ваш сертификат содержал. Сторонний разработчик (обычно Центр сертификации, также известный как CA) затем создает сертификат из этого и предоставляет вам сертификат. Так что ваш заказ неверен.

  1. Генерация закрытого ключа
  2. Генерация CSR
  3. Отправить CSR сторонним
  4. Получить сертификат от стороннего

CSR обычно предоставляется в формате PKCS#10 сторонним /CA. Создание ASN.1/DER для CSR требует большого усердия, если вы действительно хотите написать эту часть самостоятельно. RFC2986 предоставляет вам точную спецификацию для создания CSR.

Поскольку в вашем сценарии используется HSM, а CSR должен быть подписан, вам нужно будет использовать своего поставщика Cng, чтобы получить подпись для включения в CSR.

В.Net (или в Win32 crypto / bcrypt) нет API, которые позволили бы вам "просто вызвать функцию" и получить CSR, сгенерированный для вас.

Также обратите внимание, что CSR содержит то, что вы запрашиваете в своем сертификате. CA может выбрать для изменения или пропуска любую информацию, которую вы предоставляете для включения в сертификат.

Другие вопросы по тегам