【问题标题】:Reading a certificate signing request with C#使用 C# 读取证书签名请求
【发布时间】:2011-02-19 07:32:49
【问题描述】:

我想在 C# 中读取 CSR 的内容。但是,我还没有找到在 C# 中执行此操作的任何方法。 我发现的是命名空间System.Security.Cryptography.X509Certificates,但它只处理现有的证书,而不是证书请求。

谁能给我一个提示? 提前致谢。

【问题讨论】:

  • 我对此没有任何经验,但请查看 Bouncy Castle API。 Java 实现读取 CSR,而 C# 实现应该提供“大部分”Java 功能。 bouncycastle.org/csharp
  • 有一个类System.Security.Cryptography.X509Certificates.CertificateRequest,可以将CSR保存到一个文件中,但不能加载它们。如果将 ASN.1 解析器放在一起,则可以使用其构造函数,该构造函数采用 DN 和公钥 blob。然后解析并添加扩展。不是不可能,但很乏味。

标签: c# parsing csr x509


【解决方案1】:

在我看来,对您来说最好的方法是使用非托管 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 中已经存在实现是没有意义的.

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

【讨论】:

  • 要读取和解析 CSR,您需要多次使用 CryptDecodeObjectEx。
【解决方案2】:

我有同样的问题。我没有找到一个如此“发明”的解决方案;)解决方法。 CertUtil.exe 是微软的命令行实用程序,用于创建、读取、提交、接受和安装证书。 我使用 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();
}

【讨论】:

  • 这里的问题是您没有从您的程序中获得任何可使用的 C# 对象。此外,启动一个外部进程来解析 CSR 肯定是可能的,但感觉有点尴尬。
【解决方案3】:

有一种方法,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 实例。

【讨论】:

  • (我很想知道为什么这被否决 - 它准确、有效,并且不需要任何 3rd 方库)
【解决方案4】:

看看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);

【讨论】:

    【解决方案5】:

    这就是您使用 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 文件文本中获取所有内容的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-23
      • 2012-08-21
      • 2017-12-27
      • 1970-01-01
      • 2012-03-27
      • 2020-01-17
      • 2011-09-02
      • 2011-04-28
      相关资源
      最近更新 更多