2010-09-02 16 views
7

C# ve .NetCF kullanarak bir X.509 sertifikasını doğrulamaya çalışıyorum. CA sertifikam var ve doğru bir şekilde anladıysam güvenilmeyen sertifikanın imzasını çözmek için bu CA sertifikasındaki ortak anahtarı kullanmam gerekir. Bu bana güvenilmeyen sertifikanın hesaplanan karma değerini vermelidir. Daha sonra sertifikanın karmasını kendim hesaplamalıyım ve iki değerin eşleştiğinden emin olmalıyım.X.509 Sertifikasyonu nasıl yapılır? C# ile Compact Framework kullanarak doğrulayın.

Birkaç gün boyunca bununla oynuyordum ve çok uzağa gitmiyorum. X509Certificate ve RSACryptoServiceProvider sınıflarını kullanıyorum. İlk olarak, X509Certificate sınıfından açık anahtar ve imza almayı denedim. Kamusal anahtarı alabildim ama imzayı alamadım. Ardından, sertifikayı oluşturan ikili verileri ayrıştırmayı denedim, bu da imzayı (ve istediğim diğer verileri) almamı sağladı, ancak RSACryptoServiceProvider kullanarak imzayı çözemedim. Böyle şeyler denedim ama şifresini çalıştığımda "Kötü Anahtarı" diyerek alma istisnaları tuttu: Herhangi bir tavsiye büyük takdir

RSAParameters rsaParams = new RSAParameters(); 
rsaParams.Exponent = exp; 
rsaParams.Modulus = mod; 
RSACryptoServiceProvider rsaServ = new RSACryptoServiceProvider(); 
rsaServ.ImportParameters(rsaParams); 
byte[] decryptedSig = rsaServ.Decrypt(encryptedSig, false); 

.

Düzelt: Daha iyi görünüyor ama garip bir sonuç döndüren bir şey denedim. Test için biraz daha kolay olduğu için X509Certificate2 sınıfı ile çalışıyorum ama daha sonra .NetCF için X509Certificate'a geçmem gerekecek. Ben RSACryptoServiceProvider.VerifyData ihtiyacım olan şey olabileceğini düşünüyorum. Aşağıdaki kodu denedim. Dediğim gibi

X509Certificate2 cert = new X509Certificate2(certBytes); 
X509Certificate2 certCA1 = new X509Certificate2(@"C:\certs\certCA1.cer"); 

byte[] encryptedSig = new byte[256]; 
Array.Copy(certBytes, certBytes.Length - 256, encryptedSig, 0, 256); 

RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)certA1.PublicKey.Key; 
bool good = rsa.VerifyData(cert.RawData, "1.3.14.3.2.26", encryptedSig); 

, elle çözmek ve sertifikanın ikili veri yorumlamak mümkün duyuyorum, bu yüzden cert.RawData Sertifikanın imzalı veriler ve son 256 byte şifrelenmiş imza vardır eminim . Dize, sertifikadan aldığım karma algoritmanın OID'idir, ancak doğru olduğundan% 100 emin değilim. VerifyData yanlış döndürür, ancak neden henüz emin değilim.

Düşünceler?

cevap

3

olduğunu benim kodu.

RSACryptoServiceProvider rsa = signingCertificate_GetPublicKey(); 
return rsa.VerifyData(SignedValue(), CryptoConfig.MapNameToOID("SHA1"), Signature()); 

RSACryptoServiceProvider signingCertificate_GetPublicKey() 
{ 
    RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider(); 

    RSAParameters publicKeyParams = new RSAParameters(); 
    publicKeyParams.Modulus = GetPublicKeyModulus(); 
    publicKeyParams.Exponent = GetPublicKeyExponent(); 

    publicKey.ImportParameters(publicKeyParams); 

    return publicKey; 
} 

byte[] GetPublicKeyExponent() 
{ 
    // The value of the second TLV in your Public Key 
} 

byte[] GetPublicKeyModulus() 
{ 
    // The value of the first TLV in your Public Key 
} 

byte[] SignedValue() 
{ 
    // The first TLV in your Ceritificate 
} 

byte[] Signature() 
{ 
    // The value of the third TLV in your Certificate 
} 

Bu sorun üzerinde çalışan herkesin yardımcı olacağını umuyorum.

1

WinCE, Win32 MSCrypto.dll ile uyumlu bir şeyi destekliyor mu? Evet ise, .NET X509Certificate2 sınıfına ve ayrıca CLR Security library on Codeplex.'a bakın. NET için, çekirdek OS kripto kitaplığının üzerine yerleştirilmiş çok sayıda yararlı yordam içerir. inşa etmek X509Certificate2 için

var cert = new X509Certificate2("mycert.cer"); 
if (!cert.Verify()) 
{ 
    <fail> 
} 

vardır yaklaşık bir düzine kurucular: Sen (denenmemiş) böyle bir şey yapmak, kaynak indirebilir ve yük ve bir X 509 sertifika doğrulamak için .NetCF

için derleme yöntemiyle görebilirsiniz Çok çeşitli kaynaklardan - diskte, diskte bayt dizisi, yerel sertifika deposundan yükleme, vb.

Sertifika imzalamak için kullanılan kök CA'nın yerel sertifika deposuna yüklenmesi gerekir. Sertifika, güven zincirinde ara CA'ları içermiyorsa, bu aracıların yerel makinede de, yerel makinede güvenilen sertifika deposunda bulunan bir kök CA'ya kadar olması gerekir.

Maalesef, X509Certificate2'nin .NET Net'de olup olmadığını MSDN belgelerinden anlayamıyorum.

+0

WinCE'nin sınırlamaları zor olabilir ve X.509 için tamamen yeniyim, bu yüzden aslında bunu normal bir Win32 ortamında çalıştırmaya çalışıyorum ve bunu bile yapamıyorum. İşaretlediğiniz CLR Güvenlik kitaplığına bir göz attım, ancak X509 sertifikasını doğrulamak için orada hiçbir şey görmedim. Devam etmek için biraz daha verir misin? – Ben

+0

Yanıtı örnek kod ile güncelledim. – dthorpe

+0

X509Certificate2. NetCF'de bulunmamaktadır, ancak bu yardımcıdır. Teşekkürler. – Ben

0

Bu win32 benim için çalışıyor, ancak Compact Framework ben aynı sorunla karşı karşıya ediyorum, win32 ile yapabileceğimiz, bu yüzden aslında Tıkandım hiçbir X509Certificate2 vardır:

İşte
X509Certificate2 l__PublicKeyCertificate = new X509Certificate2("cert.cer"); 

RSACryptoServiceProvider l__rsaCspPublic = (RSACryptoServiceProvider)l__PublicKeyCertificate .PublicKey.Key; 

//... 

l__isVerified = l__rsaCspPublic.VerifyData(l__fileData, CryptoConfig.MapNameToOID("SHA1"), l__fileSignature); 
+0

Bunu bir süre önce çözdüm ve cevabı yazmayı unuttum. Kaynak koduma bir göz atacağım ve cevabı Pazartesi gününe kadar yayınlayacağım. – Ben

İlgili konular