SSL / TLS güvenli kanalı için güven ilişkisi kurulamadı - SOAP


326

Visual Studio tarafından oluşturulan web hizmeti proxy üzerinden bir .NET (C #) 2.0 windows uygulaması tarafından oluşturulan basit bir web hizmeti çağrısı var, ayrıca C # (2.0) ile yazılmış bir web hizmeti için. Bu birkaç yıl boyunca çalıştı ve çalıştığı düzine yerde yapmaya devam ediyor.

Yeni bir sitedeki yeni bir kurulum sorun yaşıyor. Web servisini çağırmaya çalışırken, şu mesajla başarısız olur:

SSL / TLS güvenli kanalı için güven ilişkisi kurulamadı

Web hizmetinin URL'si SSL (https: //) kullanıyor - ancak bu, diğer birçok konumdan uzun süredir çalışıyor (ve bunu yapmaya devam ediyor).

Nereye bakıyorum? Bu, Windows ve .NET arasında bu yüklemeye özgü bir güvenlik sorunu olabilir mi? Öyleyse, güven ilişkilerini nerede ayarlayabilirim? Kayboldum!


Benim durumumda bu hata IP adresi iletmekten kaynaklandı.
cja

Yanıtlar:


166

Düşünceler (geçmişte acıya dayanarak):

  • DNS ve sunucuya bakış açınız var mı?
  • sertifikadan doğru adı mı kullanıyorsunuz?
  • sertifika hala geçerli mi?
  • yapılandırılmış bir yük dengeleyici işleri karıştırıyor mu?
  • Yeni sunucu makinesinde saat doğru ayarlanmış mı (yani UTC saatinin doğru olması [yerel saati yoksay, büyük ölçüde ilgisiz]) - bu kesinlikle WCF için önemlidir, bu yüzden düzenli SOAP'ı etkileyebilir mi?
  • sertifika güven zinciri sorunu var mı? sunucudan sabun servisine göz atarsanız SSL alabilir misiniz?
  • yukarıdakilerle ilgili - sertifika doğru yere kurulmuş mu? (Güvenilen Kök Sertifika Yetkililerinde bir kopyaya ihtiyacınız olabilir)
  • sunucunun makine düzeyi proxy'si doğru ayarlanmış mı? (kullanıcının proxy'sinden farklı); XP / 2003 için proxycfg'ye bakın (Vista vb. hakkında emin değilim)

2
1) Web hizmeti web üzerinde. Tarayıcı üzerinden göz atabiliriz. 2) Yeni makine bir sunucu değil - sipariş bilgisini toplayan ve SOAP servisi üzerinden karşıya yüklenen uygulamamı çalıştıran bir masaüstü 3) Evet, ona göz atabiliriz. 4) Bu benim için yeni: makine düzeyinde proxy?
Rob Schripsema

2
Evet; kodu IE proxy ayarlarını kullanmaz; ayrı bir mağaza kullanır ... bunun yapılandırılmış olması önemlidir (proxy kullanıyorsanız). XP'de IE ayarlarını almak için en kolay seçenek (IIRC) "proxycfg -i" dir.
Marc Gravell

11
Teşekkürler Marc. Bu bana yardımcı oldu ve sorun, sunucunun henüz güvenmediğim bir 3. taraf CA tarafından imzalanmış bir sertifikaya sahip olmasıydı. Çözüm bu CA'yı Güvenilen Kök CA listesine eklemekti.
p.campbell

1
Bu özel durumu olan bilgisayar, zaman sunucularını kullanarak sistem saatini eşitleyemedi. İçeri girip çalışmadan önceki zamanı manuel olarak senkronize etmek zorunda kaldım.
Chris - Haddox Technologies

4
Hizmet çağrılarında hata ayıklamak için Fiddler kullanıyorsanız ve sertifika müdahale modunu kullandıysanız bunu alabilirsiniz. Sadece kemancının seçeneklerindeki müdahaleyi kaldırın ve iyi olmalısınız
Ruskin

363

Aşağıdaki kod parçacıkları, aradığınız sunucudaki SSL sertifikasında bir sorun olduğunda durumu düzeltir. Örneğin, kendinden imzalı olabilir veya sertifika ile sunucu arasındaki ana bilgisayar adı eşleşmeyebilir.

Doğrudan kontrolünüz dışındaki bir sunucuyu çağırıyorsanız bu tehlikelidir , çünkü artık bağlı olduğunuzu düşündüğünüz sunucuyla konuştuğunuzdan emin olamazsınız. Bununla birlikte, dahili sunucularla uğraşıyorsanız ve "doğru" bir sertifika almak pratik değilse, web servisine sertifika sorunlarını ve cesur askıyı yok saymasını söylemek için aşağıdakileri kullanın.

İlk ikisi lambda ifadelerini, üçüncüsü ise normal kodu kullanır. Birincisi herhangi bir sertifikayı kabul eder. Son ikisi en azından sertifikadaki ana bilgisayar adının beklediğiniz ad olup olmadığını kontrol eder.
... umarım faydalı bulursun

//Trust all certificates
System.Net.ServicePointManager.ServerCertificateValidationCallback =
    ((sender, certificate, chain, sslPolicyErrors) => true);

// trust sender
System.Net.ServicePointManager.ServerCertificateValidationCallback
                = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));

// validate cert by calling a function
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

// callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
    bool result = cert.Subject.Contains("YourServerName");
    return result;
}

6
ServicePointManager ile yaşadığım deneyim. Herhangi bir değişiklik tüm uygulama etki alanını etkiler. Cevabı bunun nasıl uygulanabileceği çok açık bir şekilde açıklansa da, bu noktayı atmaktan hoşlanıyorum.
Amzath

Geri
aramanın

@Amzath Belirli bir istek tamamlandıktan sonra bunu sıfırlama konusunda herhangi bir öneriniz var mı? Bir kişinin sertifikasız bir sunucuya bir istekte bulunması ve ardından işleri eski haline getirmesi gerekebilir.
Isaac Lyman

1
@Isaac Lyman: ServicePointManager.ServerCertificateValidationCallback = null;varsayılan davranışa geri dönmelidir .
Mike Chamberlain

1
@MikeChamberlain Önerinizle ilgili tek sorun, global bir uygulama ayarıyla uğraştığınız için eşzamanlı isteklerin güvenli olmayabileceğidir.
Isaac Lyman

178

Çok basit "hepsini yakala" çözümü şudur:

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Sebastian-castaldi'nin çözümü biraz daha ayrıntılı.


21
Ben sadece bir #If CONFIG = "Debug"deyim koydu böylece sadece hata ayıklama modunda etkinleştirilir. Harika çalışıyor!
cjbarth

1
Ayrıntı iyi olabilir, ancak hızlı, kısa ve kolay bir kod satırı için söylenecek bir şey vardır. Bu kod kısadır ve hile yapar.
allen1

bu sadece mevcut Eylem üzerinde mi etkili olacak (örneğin ASP MVC kullanılıyor)? yoksa ASP.NET uygulaması için varsayılan davranış olarak ayarlanır?
JeeShen Lee

2
Bu sadece test amaçlı kullanılmalıdır, bu çözüm geçersiz / süresi dolmuş olsa bile herhangi bir sertifikaya güvenmektedir
Shenron

1
Yukarıdaki yorumlarda açıklandığı gibi, SSL bağlantısının artık geçerli olup olmadığı doğrulanmamıştır. Böylece sisteminiz ve diğer sistemler arasındaki bağlantı bozulabilir. Bu her zaman bunun için neye ihtiyacınız olduğuna dair bir sorudur.
Remy

35

Şahsen en çok aşağıdaki çözümü beğendim:

using System.Security.Cryptography.X509Certificates;
using System.Net.Security;

... sonra hatayı alma isteğinde bulunmadan önce aşağıdakileri yapın

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

Bunu Luke'un Çözümüne danıştıktan sonra buldum


4
Bu yaklaşıma yönelik güvenlik uyarıları için Sebastian Castaldi'nin cevabına bakınız .
Edward Brey

Bunu üretimde kullanmanın güvenlik riski nedir?
Amjad

@Amjad güvenlik riski SSL / TLS kullanmanın tüm faydalarını tamamen ortadan kaldırmasıdır. Sunucu sevdiği herhangi bir sertifikayı sunabilir ve bu kod hatayı yok
1800 BİLGİ

18

Windows 2003 kullanıyorsanız şunları deneyebilirsiniz:

Microsoft Yönetim Konsolu'nu açın (Başlat -> Çalıştır -> mmc.exe);

Dosya -> Ek Bileşen Ekle / Kaldır'ı seçin;

Bağımsız sekmesinde Ekle'yi seçin;

Sertifikalar ek bileşenini seçin ve Ekle'yi tıklatın;

Sihirbazda Bilgisayar Hesabı'nı ve ardından Yerel Bilgisayar'ı seçin. Sihirbazı sonlandırmak için Son'a basın;

Ek Bileşen Ekle / Kaldır iletişim kutusunu kapatın;

Sertifikalar'a (Yerel Bilgisayar) gidin ve içe aktarmak için bir mağaza seçin:

Sertifikayı veren şirket için Kök CA sertifikanız varsa, Güvenilen Kök Sertifika Yetkilileri'ni seçin;

Sunucunun kendisi için sertifikanız varsa Diğer Kişiler'i seçin

Mağazayı sağ tıklayın ve Tüm Görevler -> İçe Aktar'ı seçin

Sihirbazı izleyin ve sahip olduğunuz sertifika dosyasını sağlayın;

Bundan sonra, IIS'yi yeniden başlatın ve web hizmetini tekrar aramayı deneyin.

Referans: http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-establish-trust-relationship-for-the-SSL/TLS- ...


2
Bu beni yolun bir parçası haline getirdi, ancak çalışmasını sağlamak için sertifikayı Güvenilen Kök Sertifika Yetkilileri bölümüne almam gerekiyordu. Gereğince blogs.msdn.com/b/jpsanders/archive/2009/09/16/...
Jacob Ewald

17

Herkese körü körüne güvenmek ve sadece belirli ana bilgisayarlar için güven istisnası yapmak istemiyorsanız, aşağıdaki çözüm daha uygundur.

public static class Ssl
{
    private static readonly string[] TrustedHosts = new[] {
      "host1.domain.com", 
      "host2.domain.com"
    };

    public static void EnableTrustedHosts()
    {
      ServicePointManager.ServerCertificateValidationCallback = 
      (sender, certificate, chain, errors) =>
      {
        if (errors == SslPolicyErrors.None)
        {
          return true;
        }

        var request = sender as HttpWebRequest;
        if (request != null)
        {
          return TrustedHosts.Contains(request.RequestUri.Host);
        }

        return false;
      };
    }
}

Ardından, uygulamanız başladığında Ssl.EnableTrustedHosts'u arayın.


@thelem Evet yeniden okuma İlk defa yanlış okumam gerektiğini düşünüyorum
Shiv

Üretimdeki tüm sertifikalara güvenmenin güvenlik riski nedir?
Amjad

Güvenlik riski, istemci ile sunucu arasındaki herkesin iletişimin ortasına yerleştirebilmesi, kendi SSL sertifikasını kullanabilmesi ve istemci ile sunucu arasındaki tüm trafiği okuyabilmesidir. Bunu yapmak SSL'yi etkili bir şekilde geçersiz kılar.
Rob Prouse

Wsdl sınıfları oluşturmak için WCF addon kullanarak iam çalışırken gerekir?
Kamil

7

Luke bunun hakkında oldukça iyi bir makale yazdı .. oldukça ileri .. bunu deneyin

Luke'un Çözümü

Sebep (makalesinden alıntı (eksi küfür)) ".. Yukarıdaki kodla ilgili sorun, sertifikanızın geçerli olmaması durumunda çalışmamasıdır. Neden geçersiz bir SSL sertifikası olan bir web sayfasına gönderiyorum? Çünkü Ben ucuzum ve Verisign ya da diğeri ** - * s test kutusuna bir sertifika için ödeme gibi hissetmedim, bu yüzden ben kendim imzaladı.İsteğe gönderildiğinde bana atılan hoş bir istisna var:

System.Net.WebException Temel bağlantı kapatıldı. Uzak sunucu ile güven ilişkisi kurulamadı.

Seni bilmiyorum, ama benim için bu istisna POST başarısız olmasına neden olan benim kodumda aptalca bir hata neden olacak bir şey gibi görünüyordu. Bu yüzden aramaya devam ettim, her türlü garip şeyi ayarladım ve yaptım. Sadece lanet olası şey n googled sonra ben geçersiz bir SSL sertifikası ile karşılaştıktan sonra varsayılan davranış bu istisna atmak olduğunu öğrendim. .."


1
Bu çözüm .Net 4.5 için kullanımdan kaldırılmıştır. Tüm sertifikaları kabul etmek istiyorsanız, aşağıdaki Sebastian Castaldi'ye veya yanıtıma bakın.
Remy


3

Bu sorunla yeni karşılaştım. Benim çözümüm, zaman sunucularıyla el ile eşitleyerek sistem saatini güncellemekti. Bunu yapmak için şunları yapabilirsiniz:

  • Görev çubuğundaki saate sağ tıklayın
  • seçmek Adjust Date/Time
  • Seçin Internet TimeSekmeyi
  • Tıklayın Change Settings
  • seçmek Update Now

Benim durumumda bu yanlış senkronize edildi, bu yüzden doğru güncellenmeden önce birkaç kez tıklamak zorunda kaldım. Yanlış bir şekilde güncellenmeye devam ederse, sunucu açılır menüsünden farklı bir zaman sunucusu kullanmayı bile deneyebilirsiniz.


KUTSAL İNEK. Tam olarak bu şeye kaçtı. Kolay düzeltme için teşekkürler!
TheGerm

3

Bunu dene:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

En azından 4.5 .NET framework ile çalışmanız gerektiğine dikkat edin


3

.NETInternet Explorer'daki uygulamada da benzer bir sorun yaşadım .

Sertifikayı (benim durumumda VeriSign Sınıf 3 sertifikası) güvenilir editörlerin sertifikalarına ekleme sorununu çözdüm.

Go to Internet Options-> Content -> Publishers and import it

Sertifikayı şu kaynaktan dışa aktarırsanız alabilirsiniz:

Internet Options-> Content -> Certificates -> Intermediate Certification Authorities -> VeriSign Class 3 Public Primary Certification Authority - G5

Teşekkürler


1

Ben url ile bir web sunucusu karşı çalışan bu hatayı vardı:

a.b.domain.com

ama bunun için bir sertifika yoktu, bu yüzden

a_b.domain.com

Google'da bu kadar üst sıralara geldiğinden beri bu çözüme bir ipucu koymak.


Benim durumumda, web sitesi bir joker karakter SSL sertifikası (* .abcd.com) altında yapılandırıldı. Yapılandırıldığında web sitesi bağlama soruna neden olan xyz-abcd.com gibiydi.
sree

1

Bir VS istemci tarafı aracılığıyla bu sorunu yaşayanlar için bir kez bir hizmet referansı başarıyla ekledi ve ilk çağrıyı yürütmeye çalışanlar için şu istisna oluştu: “Temel bağlantı kapatıldı: SSL / TLS güvenli kanalı için güven ilişkisi kurulamadı” (benim durumum gibi) IP adresiyle bir uç nokta URL'si kullanıyorsunuz ve bu istisnayı alıyorsanız, muhtemelen bu adımları uygulayarak hizmet referansını yeniden eklemeniz gerekir:

  • Internet Explorer'da uç nokta URL'sini açın.
  • Sertifika hatasını tıklayın (adres çubuğundaki kırmızı simge)
  • Sertifikaları görüntüle'yi tıklayın.
  • "Name" için verileni alın ve IP adresini veya kullandığımız herhangi bir ismi değiştirin ve bu "name" için hatayı alıyorum.

Tekrar deneyin :). Teşekkürler


0

Benim durumumda IIS 7'yi kullanarak Visual Studio ortamımda SSL'yi test etmeye çalışıyordum .

Ben işe almak için yaptığım budur:

  • IIS'nin sağındaki 'Bağlamalar ...' bölümündeki sitem altında, 443 numaralı bağlantı noktasına 'https' bağlayıcısını eklemek ve "IIS Express Geliştirme Sertifikası" nı seçmek zorunda kaldım.

  • Sağ taraftaki 'Gelişmiş Ayarlar ...' bölümündeki sitemin altında, 'Etkin Protokoller'i "http" yerine "https" olarak değiştirmek zorunda kaldım.

  • 'SSL Ayarları' simgesinin altında istemci sertifikaları için 'Kabul Et'i seçtim.

  • Sonra uygulama havuzunu geri dönüştürmek zorunda kaldım.

  • Ayrıca yerel ana bilgisayar sertifikasını mmc.exe kullanarak kişisel mağazama almak zorunda kaldım.

Dosyam web.configzaten doğru bir şekilde yapılandırılmıştı, bu yüzden yukarıdakilerin tümünü çözdükten sonra testime devam edebildim.


web.config dosyanız nasıl yapılandırıldı?
Chazt3n

@ Chazt3n Söyleyemedim, bir süre geri döndü, ancak temel bir http bağlama kurulumu olurdu, genellikle web servis istemcisi bilgileri için yapılandırma bilgisi oluşturmak için svcutil kullanıyorum.
Popo

0

Benim çözümüm (VB.Net, bu uygulamanın "evreleme" (UAT) sürümü "evreleme" sertifikası ile çalışması gerekir, ancak istekleri canlı sitede olduklarında etkilemez):

    ...
        Dim url As String = ConfigurationManager.AppSettings("APIURL") & "token"
        If url.ToLower().Contains("staging") Then
           System.Net.ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications
        End If
    ...

    Private  Function AcceptAllCertifications(ByVal sender As Object, ByVal certification As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
        Return True
    End Function

-3

Kötü çalışmıyorsa, ServerCertificateValidationCallback true değerini döndürdüğünde; ServerCertificateValidationCallback kodum:

ServicePointManager.ServerCertificateValidationCallback += delegate
{
    LogWriter.LogInfo("Проверка сертификата отключена, на уровне ServerCertificateValidationCallback");
    return true;
};

Engellenen kodumu ServerCertificateValidationCallback yürütmek benim kod:

     if (!(ServicePointManager.CertificatePolicy is CertificateValidation))
    {
        CertificateValidation certValidate = new CertificateValidation();
        certValidate.ValidatingError += new CertificateValidation.ValidateCertificateEventHandler(this.OnValidateCertificateError);
        ServicePointManager.CertificatePolicy = certValidate;
    }

OnValidateCertificateError işlevi:

private void OnValidateCertificateError(object sender, CertificateValidationEventArgs e)
{
    string msg = string.Format(Strings.OnValidateCertificateError, e.Request.RequestUri, e.Certificate.GetName(), e.Problem, new Win32Exception(e.Problem).Message);
    LogWriter.LogError(msg);
    //Message.ShowError(msg);
}

CertificateValidation kodunu devre dışı bıraktım ve ServerCertificateValidationCallback çok iyi çalışıyor


Hiçbir zaman sertifika doğrulamasını devre dışı bırakmamalısınız. Bunun yerine, başarısız doğrulama işlemine neden olan sorunu giderin.
Dan

Bunu üretimde kullanmanın güvenlik riski nedir?
Amjad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.