2010-05-13 111 views
6

我想在c#中读取csr的内容,但是我还没有找到任何方式在c#中完成它。 我发现的是命名空间System.Security.Cryptography.X509Certificates,但它只处理现有的证书,而不是证书请求:/用c读取证书签名请求#

任何人都可以给我一个提示吗? 在此先感谢。

豪尔赫

+1

我对此没有任何经验,但请查看Bouncy Castle API。 Java实现读取CSR,而C#实现应该提供“最”Java功能。 http://www.bouncycastle.org/csharp/ – 2010-05-13 22:16:02

回答

0

在我看来,最好的方式对你来说是使用非托管的CryptoAPI或P/Invoke的。 CryptoAPI具有CERT_REQUEST_INFO数据结构和CryptSignAndEncodeCertificate功能,可与X509_CERT_REQUEST_TO_BE_SIGNED参数一起使用。因为CSR不是很复杂(请参阅http://en.wikipedia.org/wiki/Certificate_signing_requesthttp://www.rfc-editor.org/rfc/rfc2311.txt),但理论上可以手动对AsnEncodedData进行编码请求,但我认为如果CryptoAPI中已经存在某个实现,则认为它没有意义。

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

-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(); 
} 
+0

这里的问题是,你没有得到任何C#对象来从你的程序工作。而且,开始一个外部过程来解析CSR肯定是可能的,但是它感觉有点尴尬。 – 2014-11-06 09:50:52

15

有一种方法,它与Windows(虽然我不能说,它已经有多远回)允许您加载证书请求,并让他们分析的CertEnroll库。

首先,您需要将对项目的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

(我真的很想知道为什么这是被拒绝的 - 这是准确的,它的工作原理,并不需要任何第三方库) – blowdart 2011-03-23 19:31:07

+0

我同意 - 这个作品非常漂亮。 +1。 – KenD 2011-08-15 17:14:56

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

这是你如何与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文件的文本。