Генерация 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.
Так что это:
- Создать закрытый ключ
- Создать сертификат из ключа
- Храните сертификат
- ???
- Отправить CSR сторонним
- Прибыль.
Так чего именно мне не хватает...?
1 ответ
CSR - это запрос на подпись сертификата. Он содержит открытый ключ и все метаданные, которые вы хотите, чтобы ваш сертификат содержал. Сторонний разработчик (обычно Центр сертификации, также известный как CA) затем создает сертификат из этого и предоставляет вам сертификат. Так что ваш заказ неверен.
- Генерация закрытого ключа
- Генерация CSR
- Отправить CSR сторонним
- Получить сертификат от стороннего
CSR обычно предоставляется в формате PKCS#10 сторонним /CA. Создание ASN.1/DER для CSR требует большого усердия, если вы действительно хотите написать эту часть самостоятельно. RFC2986 предоставляет вам точную спецификацию для создания CSR.
Поскольку в вашем сценарии используется HSM, а CSR должен быть подписан, вам нужно будет использовать своего поставщика Cng, чтобы получить подпись для включения в CSR.
В.Net (или в Win32 crypto / bcrypt) нет API, которые позволили бы вам "просто вызвать функцию" и получить CSR, сгенерированный для вас.
Также обратите внимание, что CSR содержит то, что вы запрашиваете в своем сертификате. CA может выбрать для изменения или пропуска любую информацию, которую вы предоставляете для включения в сертификат.