Чтение запроса на подпись сертификата с помощью c # - PullRequest
6 голосов
/ 14 мая 2010

Я хочу прочитать содержимое csr в c #, однако я не нашел способа сделать это в c #. Я обнаружил пространство имен System.Security.Cryptography.X509Certificates, но оно обрабатывает только существующие сертификаты, а не запросы сертификатов: /

Может кто-нибудь дать мне подсказку об этом? Заранее спасибо.

Jorge

Ответы [ 5 ]

18 голосов
/ 22 марта 2011

Есть способ, библиотека CertEnroll, поставляемая с Windows (хотя я не могу сказать, как далеко она там находилась), позволяет загружать запросы сертификатов и анализировать их.

Сначала вам нужно импортировать ссылку на библиотеку COM * CERTENROLLLib в ваш проект. Это создаст пространство имен CERTENROLLLib, которое вы затем сможете использовать.

Тогда вы делаете что-то вроде этого;

string csr = "-----BEGIN CERTIFICATE REQUEST-----\r\n" +
             "MIIBnTCCAQYCAQAwXTELMAkGA1UEBhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRIw\r\n" +
             "EAYDVQQDEwlsb2NhbGhvc3QxJzAlBgkqhkiG9w0BCQEWGGFkbWluQHNlcnZlci5l\r\n" +
             "eGFtcGxlLmRvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAr1nYY1Qrll1r\r\n" +
             "uB/FqlCRrr5nvupdIN+3wF7q915tvEQoc74bnu6b8IbbGRMhzdzmvQ4SzFfVEAuM\r\n" +
             "MuTHeybPq5th7YDrTNizKKxOBnqE2KYuX9X22A1Kh49soJJFg6kPb9MUgiZBiMlv\r\n" +
             "tb7K3CHfgw5WagWnLl8Lb+ccvKZZl+8CAwEAAaAAMA0GCSqGSIb3DQEBBAUAA4GB\r\n" +
             "AHpoRp5YS55CZpy+wdigQEwjL/wSluvo+WjtpvP0YoBMJu4VMKeZi405R7o8oEwi\r\n" +
             "PdlrrliKNknFmHKIaCKTLRcU59ScA6ADEIWUzqmUzP5Cs6jrSRo3NKfg1bd09D1K\r\n" +
             "9rsQkRc9Urv9mRBIsredGnYECNeRaK5R1yzpOowninXC\r" + 
             "-----END CERTIFICATE REQUEST-----";

CX509CertificateRequestPkcs10 request = new CX509CertificateRequestPkcs10();
request.InitializeDecode(csr, EncodingType.XCN_CRYPT_STRING_BASE64_ANY);
request.CheckSignature();

Console.WriteLine(((CX500DistinguishedName)request.Subject).Name);
Console.WriteLine(request.PublicKey.Length);
Console.WriteLine(request.HashAlgorithm.FriendlyName);

Вы можете видеть, что единственная забавная часть - вывести имя субъекта, так как сначала вам нужно привести его к экземпляру CX500DistinguishedName.

1 голос
/ 28 февраля 2012

Вот как вы это делаете с OpenSSL.NET библиотека:

// Load the CSR file
var csr = new X509Request(BIO.File("C:/temp/test.csr", "r"));
OR
var csr = new X509Request(@"-----BEGIN CERTIFICATE REQUEST-----...");

// Read CSR file properties
Console.WriteLine(csr.PublicKey.GetRSA().PublicKeyAsPEM);
Console.WriteLine(csr.Subject.SerialNumber);
Console.WriteLine(csr.Subject.Organization);
.
.
.
Тип

X509Request имеет свойства, позволяющие получить все из текста вашего файла CSR.

0 голосов
/ 23 марта 2011

Посмотрите на реализацию C # BouncyCastle . Использовал его для PGP в прошлом, отлично работал. Как-то так должно начаться (не проверено):

var textReader = File.OpenText(...);
var reader = new Org.BouncyCastle.OpenSsl.PEMReader(textReader);
var req = reader.ReadObject() as Org.BouncyCastle.Pkcs.Pkcs10CertificationRequest;
var info = req.GetCertificationRequestInfo();
Console.WriteLine(info.Subject);
0 голосов
/ 10 ноября 2010

У меня была такая же проблема. Я не нашел решения, так "изобретенного";) для обхода. CertUtil.exe - утилита командной строки Microsoft для создания, чтения, отправки, принятия и установки сертификатов. Я использовал System.Diagnostics.Process для создания внешнего процесса и передал файл запроса CSR в качестве аргумента для чтения файла в поток. Вот код для этого.

using (System.Diagnostics.Process extProc = new System.Diagnostics.Process())
{
      extProc.StartInfo.CreateNoWindow = true;
      extProc.StartInfo.UseShellExecute = false;
      extProc.StartInfo.RedirectStandardOutput = true;

      extProc.StartInfo.FileName = @"C:\certtest\Util_xpVersion\certutil.exe";
      extProc.StartInfo.Arguments = "-dump \"C:\\certtest\\Util_xpVersion\\ToolCSR.crq\"";

      extProc.Start();
      extProc.WaitForExit();
      string sTemp = extProc.StandardOutput.ReadToEnd();
      extProc.Close();
}
0 голосов
/ 14 мая 2010

Мне кажется, лучшим способом для вас является использование неуправляемого CryptoAPI или P / Invoke. CryptoAPI имеет структуру данных CERT_REQUEST_INFO и функцию CryptSignAndEncodeCertificate, которые можно использовать с параметром X509_CERT_REQUEST_TO_BE_SIGNED. Конечно, теоретически возможно закодировать запрос вручную в отношении AsnEncodedData, потому что CSR не является сложным (см. http://en.wikipedia.org/wiki/Certificate_signing_request и http://www.rfc -editor.org / rfc / rfc2311.txt ) , но я не думаю, что это имеет смысл, если реализация уже существует в CryptoAPI.

Хорошие примеры для создания CSR в отношении CryptoAPI вы найдете в http://msdn.microsoft.com/en-us/library/aa382364(VS.85).aspx и http://msdn.microsoft.com/en-us/library/ms867026.aspx.

...