2011-07-27 26 views
5

İstemci - sunucu kurulumum var. İstemci, sunucuyla iletişim kurmak için bir proxy oluşturur. iletişim protokolü HTTPS olduğunda vekil aşağıdaki hattı üzerinden SSL sertifikası geçerlilik olayını dinler: Sertifika istisnalarSSL Sertifika verisi nasıl temizlenir

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate); 

ValidateRemoteCertificate yöntemi fiyatlarını.

İstemcideki kullanıcı 3 güvenlik seviyesinden birini seçebilir: düşük, orta ve yüksek. Düşük düzeyde ValidateRemoteCertificate yöntemi herhangi bir hatayı yok sayar ve her zaman doğrudur. Orta düzeyde ValidateRemoteCertificate yöntemi, sorunu müşteriye bildiren bir olayı başlatır. Bu aşamada, kullanıcıya, sertifikanın sorunlu olduğunu bildiren ve kullanıcıya sunucunun bağlantısının devam edip etmeyeceğini veya sunucunun reddedilip reddedileceğini seçmesini sağlayan bir mesaj görüntülenir. Yüksek düzeyde ValidateRemoteCertificate yöntemi, herhangi bir hata için bağlantıyı reddeder. Şimdiye kadar çok iyi. Zaten kullanıcı tarafından kabul edilmişti ve bağlantı yayılır herhangi sertifika sorun olmadan sunucu ile kurulan Orta önceden tanımlanmış bir güvenlik seviyesi ile

  1. istemci yükleri şu şekildedir:

    senaryodur.

  2. Kullanıcı istemciyi sunucudan ayırır (özel bir düğme ile).
  3. Kullanıcı, istemciyi yeniden bağlamaya çalışır. Bu aşamada istemci, bağlantıyı bir test düğmesiyle test etme yeteneğine sahiptir. Bağlantı testi için yeni bir proxy oluşturulmuş olsa da, test yöntemi başarılı bir şekilde geri dönüyor ve tüm ValidateRemoteCertificate yöntemleri ServerCertificateValidationCallback (spesifik proxy türünden) tarafından temizlendi. Ayrıca, sorunlu sertifika için hiçbir olay başlatılmamış ve ValidateRemoteCertificate yöntemi çağrılmamaktadır.

elde etmek çalışıyorum davranış testi yapılır istemci başlatıldı ve ValidateRemoteCertificate oyuna gelirdi sonra kendisine ilk çağrı var sanki ServerCertificateValidationCallback davranacaktır olmasıdır.

ServicePointManager'da herhangi bir temsilci/etkinliği temizleyen herhangi bir yöntem aramayı denedim ancak bulamadım.

Temizlenebilecek bir önbellek var mı? Umarım senaryo yeterince açıktır.

cevap

4

Neredeyse 4 yıl olduğunu biliyorum, ama aynı sorunu yaşadım ve başka birinin bunu bulması durumunda çözümümümü paylaşmak istedim.

public void EnsureNoServicePointCertificate(Uri uri) 
    { 
     // find the service point for the Uri 
     ServicePoint sp = ServicePointManager.FindServicePoint(uri); 
     // Check if there is a service point and there is a certificate 
     if (sp != null && sp.Certificate != null) 
     { 
      try 
      { 
       // ServicePointManager has a hashtable (private static Hashtable s_ServicePointTable) of all service points 
       Type servicePointType = sp.GetType(); 
       // ServicePoint.LookupString is the key for the hashtable 
       PropertyInfo lookupStringProperty = servicePointType.GetProperty("LookupString", BindingFlags.Instance | BindingFlags.NonPublic); 
       string lookupString = (string)lookupStringProperty.GetValue(sp, null); 

       // Get the hashtable from ServicePointManager 
       Hashtable s_ServicePointTable = (Hashtable)typeof(ServicePointManager).InvokeMember("s_ServicePointTable", 
        BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.GetField, null, null, null); 

       // ServicePointManager locks the hashtable and calls 
       // s_ServicePointTable.Remove(servicePoint.LookupString); 
       lock (s_ServicePointTable) 
       { 
        s_ServicePointTable.Remove(lookupString); 
       } 

       // At this point, ServicePointManager calls 
       // servicePoint.ReleaseAllConnectionGroups(); 
       MethodInfo release = servicePointType.GetMethod("ReleaseAllConnectionGroups", BindingFlags.Instance | BindingFlags.NonPublic); 
       release.Invoke(sp, null); 
      } 
      catch { } 
     } 
    } 
:

herhangi yani burada ServicePoint ve ServicePointManager kaynak koduna bakıp, bu işlemek için bir şekilde inşa bulamadı ben ile geldi ne