使用C#读取证书签名请求

问题描述 投票:6回答:5

我想用C#阅读CSR的内容。但是,我还没有在C#中找到任何方法来做到这一点。我发现的是名称空间System.Security.Cryptography.X509Certificates,但它仅处理现有证书,而不处理证书请求。

有人能给我一个提示吗?预先感谢。

c# parsing csr x509
5个回答
18
投票

[有一种方法,Windows附带的CertEnroll库(尽管我不能说它有多远了)允许您加载证书请求并对其进行解析。

首先,您需要将对CERTENROLLLib COM库的引用导入到您的项目中。这将创建一个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
投票

这是使用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
投票

在我看来,最好的方法是使用不受管理的CryptoAPI或P / Invoke。 CryptoAPI具有CERT_REQUEST_INFO数据结构和CryptSignAndEncodeCertificate函数,可与X509_CERT_REQUEST_TO_BE_SIGNED参数一起使用。从理论上讲,由于CSR不复杂(请参阅AsnEncodedDatahttp://en.wikipedia.org/wiki/Certificate_signing_request),因此理论上可以相对于http://www.rfc-editor.org/rfc/rfc2311.txt手动编码请求,但是我认为CryptoAPI中是否已经存在实现没有意义。

一个关于CryptoAPI创建CSR的好例子,您可以在http://msdn.microsoft.com/en-us/library/aa382364(VS.85).aspxhttp://msdn.microsoft.com/en-us/library/ms867026.aspx中找到。


0
投票

BouncyCastle's C# implementation。过去将它用于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);

-1
投票

我有同样的问题。我没有找到解决方案的“发明”;)。 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();
}
© www.soinside.com 2019 - 2024. All rights reserved.