我想在c#中读取csr的内容,但是我还没有找到任何方式在c#中完成它。 我发现的是命名空间System.Security.Cryptography.X509Certificates,但它只处理现有的证书,而不是证书请求:/用c读取证书签名请求#
任何人都可以给我一个提示吗? 在此先感谢。
豪尔赫
我想在c#中读取csr的内容,但是我还没有找到任何方式在c#中完成它。 我发现的是命名空间System.Security.Cryptography.X509Certificates,但它只处理现有的证书,而不是证书请求:/用c读取证书签名请求#
任何人都可以给我一个提示吗? 在此先感谢。
豪尔赫
在我看来,最好的方式对你来说是使用非托管的CryptoAPI或P/Invoke的。 CryptoAPI具有CERT_REQUEST_INFO
数据结构和CryptSignAndEncodeCertificate
功能,可与X509_CERT_REQUEST_TO_BE_SIGNED
参数一起使用。因为CSR不是很复杂(请参阅http://en.wikipedia.org/wiki/Certificate_signing_request和http://www.rfc-editor.org/rfc/rfc2311.txt),但理论上可以手动对AsnEncodedData
进行编码请求,但我认为如果CryptoAPI中已经存在某个实现,则认为它没有意义。
一个关于CryptoAPI创建CSR的好例子,您将在http://msdn.microsoft.com/en-us/library/aa382364(VS.85).aspx和http://msdn.microsoft.com/en-us/library/ms867026.aspx中找到。
我有同样的问题。我没有找到解决方法,所以“发明”;)在工作中。 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();
}
这里的问题是,你没有得到任何C#对象来从你的程序工作。而且,开始一个外部过程来解析CSR肯定是可能的,但是它感觉有点尴尬。 – 2014-11-06 09:50:52
有一种方法,它与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
实例。
看看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);
这是你如何与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文件的文本。
我对此没有任何经验,但请查看Bouncy Castle API。 Java实现读取CSR,而C#实现应该提供“最”Java功能。 http://www.bouncycastle.org/csharp/ – 2010-05-13 22:16:02