我想在c#中读取csr的内容,但是我没有找到任何方法在c#中执行此操作。 我发现的是名称空间System.Security.Cryptography.X509Certificates,但它只处理现有证书,而不是证书请求:/
任何人都可以给我一个暗示吗? 提前谢谢。
豪尔赫
答案 0 :(得分:17)
有一种方法,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 :(得分: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文件文本中获取所有内容的属性。
答案 2 :(得分:0)
在我看来,最好的方法是使用非托管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中已经存在一个实现。
关于CryptoAPI创建CSR的一个很好的示例,您可以在http://msdn.microsoft.com/en-us/library/aa382364(VS.85).aspx和http://msdn.microsoft.com/en-us/library/ms867026.aspx中找到。
答案 3 :(得分: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);
答案 4 :(得分:-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();
}