2010-05-13 25 views
6

Bir csr içeriğini C# olarak okumak istiyorum, ancak C# içinde yapmanın bir yolunu bulamadım. Ne buldum System.Security.Cryptography.X509Certificates ad alanı buldu, ancak yalnızca sertifikaları değil, varolan sertifikaları işler:/Bir sertifika imzalama isteği ile okuma C#

Herkes bu konuda bir ipucu verebilir mi? Şimdiden teşekkürler.

Jorge sizin için en iyi yol gibi geliyor bana

+1

Bununla ilgili herhangi bir deneyimim yok, ancak Bouncy Castle API'sine göz atın. Java uygulaması CSR'leri okur ve C# uygulamasının Java işlevselliğinin "çoğunu" sağlaması beklenir. http://www.bouncycastle.org/csharp/ –

cevap

0

kullanım yönetilmeyen CryptoAPI veya P/Invoke olduğunu. CryptoAPI CERT_REQUEST_INFO veri yapısına ve işlevine sahiptir ve X509_CERT_REQUEST_TO_BE_SIGNED parametresiyle kullanılabilir. Teorik olarak, isteği manuel olarak AsnEncodedData ile kodlamak mümkündür, çünkü CSR karmaşık değildir (bkz. http://en.wikipedia.org/wiki/Certificate_signing_request ve http://www.rfc-editor.org/rfc/rfc2311.txt), ancak bir uygulama CryptoAPI'da zaten mevcutsa bunun bir anlamı olmadığını düşünmüyorum.

CryptoAPI ile ilgili CSR oluşturmak için iyi bir örnek olarak http://msdn.microsoft.com/en-us/library/aa382364(VS.85).aspx ve http://msdn.microsoft.com/en-us/library/ms867026.aspx'da bulabilirsiniz.

-1

Aynı sorunu yaşadım. Etrafımdaki bir işte "icat";) bir çözüm bulamadım. CertUtil.exe, oluşturmak, okumak, göndermek, kabul etmek ve yüklemek için microsoft'un komut satırı yardımcı programıdır. Harici işlem oluşturmak için System.Diagnostics.Process'i kullandım ve dosyayı bir akışa okumak için CSR istek dosyasını argüman olarak geçirdim. Heres bu kodu.

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

Burada sorun, programınızdan çalışmak için herhangi bir C# nesnesi almamanızdır. Dahası, KSS'yi ayrıştırmak için harici bir sürecin başlatılması elbette mümkündür, ancak biraz garip geliyor. –

15

bir şekilde, (ben var oldu ne kadar geriye diyemeyiz rağmen) Windows ile birlikte gelen sertifika isteklerini yüklemek ve bunları çözümlenen olmasını sağlar CertEnroll kütüphane bulunmaktadır.

Öncelikle projenize CERTENROLLLib COM kitaplığına bir başvuru almanız gerekir. Bu, daha sonra kullanabileceğiniz bir CERTENROLLLib ad alanı oluşturacaktır.

Sonra böyle bir şey yaparsınız;

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

Sen önce bir CX500DistinguishedName örneğine döküm gerek sadece eğlenceli kısım, konu adını oluyor görebilirsiniz.

+1

(Bunun neden reddedildiğini çok iyi biliyordum - bu doğru, işe yarıyor ve 3. parti kütüphanelerine ihtiyaç duymuyor) – blowdart

+0

Katılıyorum - bu çok güzel çalışıyor. +1. – KenD

0

BouncyCastle's C# implementation'a bakın. Geçmişte PGP malzemeleri için kullandı, harika çalıştı. Böyle bir şey başlamanıza (test) almalısınız:

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

Bu OpenSSL.NET kütüphane ile böyle yaparız:

// 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 türü CSR dosyası metnin dışına her şeyi elde etmek özelliklere sahiptir.

İlgili konular