381 Stimmen

Konnte keine Vertrauensbeziehung für den sicheren SSL/TLS-Kanal herstellen - SOAP

Ich habe einen einfachen Webdienstaufruf, der von einer .NET (C#) 2.0 Windows-Anwendung über den von Visual Studio generierten Webdienst-Proxy für einen ebenfalls in C# (2.0) geschriebenen Webdienst generiert wird. Dies hat mehrere Jahre lang funktioniert und tut es auch weiterhin an den etwa ein Dutzend Orten, an denen es ausgeführt wird.

Bei einer Neuinstallation an einem neuen Standort gibt es ein Problem. Beim Versuch, den Webdienst aufzurufen, schlägt er mit der folgenden Meldung fehl:

Es konnte keine Vertrauensbeziehung für die SSL/TLS Secure Kanal

Die URL des Webdienstes verwendet SSL (https://) - aber das funktioniert schon seit langem (und auch weiterhin) von vielen anderen Orten aus.

Wo muss ich suchen? Könnte dies ein Sicherheitsproblem zwischen Windows und .NET sein, das nur bei dieser Installation auftritt? Wenn ja, wo kann ich Vertrauensbeziehungen einrichten? Ich bin ratlos!

0voto

toepoke.co.uk Punkte 827

Eine Variante, die ich schon seit einiger Zeit verwende, falls es jemandem hilft.

Der Aufrufer muss ausdrücklich verlangen, dass nicht vertrauenswürdige Zertifizierungen erforderlich sind, und setzt den Rückruf nach Abschluss in den Standardzustand zurück.

    /// <summary>
    /// Helper method for returning the content of an external webpage
    /// </summary>
    /// <param name="url">URL to get</param>
    /// <param name="allowUntrustedCertificates">Flags whether to trust untrusted or self-signed certificates</param>
    /// <returns>HTML of the webpage</returns>
    public static string HttpGet(string url, bool allowUntrustedCertificates = false) {
        var oldCallback = ServicePointManager.ServerCertificateValidationCallback;
        string webPage = "";
        try {
            WebRequest req = WebRequest.Create(url);

            if (allowUntrustedCertificates) {
                // so we can query self-signed certificates
                ServicePointManager.ServerCertificateValidationCallback = 
                    ((sender, certification, chain, sslPolicyErrors) => true);
            }

            WebResponse resp = req.GetResponse();

            using (StreamReader sr = new StreamReader(resp.GetResponseStream())) {
                webPage = sr.ReadToEnd().Trim();
                sr.Close();
            }
            return webPage;
        }
        catch {
            // if the remote site fails to response (or we have no connection)
            return null;
        }
        finally {
            ServicePointManager.ServerCertificateValidationCallback = oldCallback;
        }
    }

0voto

GreenRock Punkte 81

Meine Lösung (VB.Net, die "Staging"-Version (UAT) dieser Anwendung muss mit dem "Staging"-Zertifikat funktionieren, darf aber keine Auswirkungen auf Anfragen haben, sobald diese auf der Live-Site sind):

    ...
        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

0voto

Popo Punkte 2382

In meinem Fall habe ich versucht zu testen SSL in meiner Visual Studio-Umgebung mit IIS 7.

Das habe ich getan, um es zum Laufen zu bringen:

  • Unter meiner Website im Abschnitt "Bindungen..." auf der rechten Seite in IIS musste ich die "https"-Bindung zu Port 443 hinzufügen und "IIS Express Developement Certificate" auswählen.

  • Bei meiner Website musste ich im Abschnitt "Erweiterte Einstellungen" auf der rechten Seite die Option "Aktivierte Protokolle" von "http" auf "https" ändern.

  • Unter dem Symbol "SSL-Einstellungen" habe ich "Akzeptieren" für Client-Zertifikate ausgewählt.

  • Dann musste ich den App-Pool recyceln.

  • Außerdem musste ich das lokale Host-Zertifikat mit mmc.exe in meinen persönlichen Speicher importieren.

Meine web.config Datei bereits korrekt konfiguriert war, konnte ich meine Tests fortsetzen, nachdem ich die oben genannten Punkte geklärt hatte.

-3voto

Roberto Gata Punkte 247

Wenn ein schlechtes Zertifikat nicht funktioniert, gibt der ServerCertificateValidationCallback true zurück; Mein ServerCertificateValidationCallback-Code:

ServicePointManager.ServerCertificateValidationCallback += delegate
{
    LogWriter.LogInfo("  ,   ServerCertificateValidationCallback");
    return true;
};

Mein Code, der die Ausführung von ServerCertificateValidationCallback verhindert:

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

OnValidateCertificateError-Funktion:

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

Ich deaktivierte CertificateValidation-Code und ServerCertificateValidationCallback läuft sehr gut

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X