2010-06-23 40 views
7

Uzak web sunucusuna HTTPS isteği yaparken, uzak web sunucusuyla güvenli bağlantı kuran WebRequest'i kullanıyorum. Geliştirme sırasında, sunucuda kendinden imzalı sertifika kullanıyorum ve WebRequest güvenli bir bağlantı kuramıyor çünkü sertifika geçerli olmadığından, beklenen davranış.HTTPS isteği sırasında uzak SSL sertifikasını doğrulayın

Aşağıdaki kodda SetCertificatePolicy() yöntemini çağırarak etkinleştirilen "remotes" onay kutusunu bu kodu buldum. Ben uzak web sunucusu geçerli bir SSL sertifikası kullandığını doğrulamak ve sadece herhangi böylece uzaktan SSL sertifikası özel kontroller yapmak mümkün olup olmadığını merak ediyorum

public static void SetCertificatePolicy() 
{ 
    ServicePointManager.ServerCertificateValidationCallback 
       += RemoteCertificateValidate; 
} 

/// <summary> 
/// Remotes the certificate validate. 
/// </summary> 
private static bool RemoteCertificateValidate(
    object sender, X509Certificate cert, 
    X509Chain chain, SslPolicyErrors error) 
{ 
    // trust any certificate!!! 
    System.Console.WriteLine("Warning, trust any certificate"); 
    return true; 
} 

, (örneğin, kod üzerinde kullanarak) geçerli bir sertifika, ama tam olarak istediğim? Örneğin, www.someplace.com web sitesi, ACME Inc'e verilen belgenin parmak izi ile konuştuğumdan emin olmak istiyorum 00:11:22: .....

"En iyi uygulama nedir?" "Bu senaryo için yaklaşım?

Teşekkürler!

cevap

7

Gerçekten de belirli bir sertifikaya sabitlemek istiyorsanız, certificate.GetRawCertData() numaralı telefondan sertifika verilerini (DER biçiminde) byte[] ile karşılaştırabilirsiniz.

Ayrıca peşinde olduğunuz bilgi almak için RemoteCertificateValidate yılında certificate parametreye GetCertHashString() ve Subject kullanabilirsiniz. Ana bilgisayar adı, sertifikanın konuya ilişkin alternatif adı veya konu (alternatif) adının CN'sinde bir konu alternatif adı yoksa olmalıdır. .NET'in konu dizgisini biçimlendirdiği şekliyle, bunun ilk CN = olması gerekir. certificateX509Certificate2 bir örneği olup olmadığını

Ayrıca daha fazla veri elde edersiniz. Daha sonra X500PrincipalName ve aynı zamanda Extensions (konu alternatif isim uzantısını kontrol etmek için) olarak SubjectName elde edebileceksiniz. Konu adını ayrıştırmak için BouncyCastle gibi araçların kullanılması yararlı olabilir.

Ayrıca kendi çalışma zamanı türüne bağlı olarak sender içinde temasa çalışıyoruz hostname hakkında daha fazla bilgi almak için olasıdır.

+0

Teşekkürler, aradığım şey buydu. Sadece hızlı bir Q, ilk ipucu (cert verisini byte [] ile karşılaştırarak) - bilinen geçerli cert bayt dizisini doğruladığımla karşılaştırmalı mıyım? –

+0

Bayt dizisinin DER kodlamasında sertifika olacağını düşünüyorum, bu nedenle muhtemelen DER biçimindeki referans sertifikanızı karşılaştırmalısınız (Windows sertifika aracı dahil birçok araç bu formata dışa aktarılabilir). Bunu doğrudan sertifika deposundan yükleyebilirsiniz (nasıl yapıldığından emin değil). – Bruno

İlgili konular