programing

SSL/TLS 보안 채널에 대한 신뢰 관계를 설정할 수 없습니다. -- SOAP

nicescript 2023. 5. 22. 23:27
반응형

SSL/TLS 보안 채널에 대한 신뢰 관계를 설정할 수 없습니다. -- SOAP

Visual Studio에서 생성한 웹 서비스 프록시를 통해 C#(2.0)로도 작성된 웹 서비스에 대해 .NET(C#) 2.0 Windows 앱에서 생성한 간단한 웹 서비스 호출이 있습니다.이것은 몇 년 동안 효과가 있었고, 그것이 운영되고 있는 12개 정도의 장소에서 계속 그렇게 하고 있습니다.

새 사이트의 새 설치에서 문제가 발생했습니다.웹 서비스를 호출하려고 하면 실패하고 다음과 같은 메시지가 표시됩니다.

SSL/TLS 보안 채널에 대한 신뢰 관계를 설정할 수 없습니다.

웹 서비스의 URL은 SSL(https://)을 사용하지만 다른 많은 위치에서 오랫동안 작동하고 계속 작동합니다.

어디를 봐야 하나요?이 설치에 고유한 Windows와 .NET 간의 보안 문제일 수 있습니까?그렇다면 어디에서 신뢰 관계를 설정해야 합니까?길을 잃었어요!

다음 스니펫은 호출 중인 서버의 SSL 인증서에 문제가 있는 경우를 해결합니다.예를 들어, 인증서가 자체 서명되었거나 인증서와 서버 간의 호스트 이름이 일치하지 않을 수 있습니다.

연결된 것으로 생각되는 서버와 더 이상 대화하고 있는지 확인할 수 없으므로 직접 제어가 불가능한 서버를 호출하는 경우 위험합니다.그러나 내부 서버를 처리하고 있으며 "올바른" 인증서를 얻는 것이 실용적이지 않은 경우 다음을 사용하여 웹 서비스에 인증서 문제를 무시하고 용감하게 계속 진행하도록 지시하십시오.

처음 두 개는 람다 식을 사용하고, 세 번째는 정규 코드를 사용합니다.첫 번째는 모든 인증서를 허용합니다.마지막 두 개는 적어도 인증서의 호스트 이름이 사용자가 예상하는 호스트 이름인지 확인합니다.
이 되길 .

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

매우 간단한 "catch all" 솔루션은 다음과 같습니다.

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

세바스찬-카스탈디의 해결책은 조금 더 상세합니다.

생각(과거 고통 기준):

  • 서버에 대한 DNS와 가시선이 있습니까?
  • 인증서의 올바른 이름을 사용하고 있습니까?
  • 인증서가 여전히 유효합니까?
  • 잘못 구성된 로드 밸런서가 문제를 일으키고 있습니까?
  • 새로운 서버 기계가 시계를 정확하게 설정했습니까? (즉, UTC 시간이 정확하게 설정되어 있습니다. [현지 시간을 무시하고 대부분 무관합니다.] - 이것은 WCF에 확실히 중요하므로 일반 SOAP에 영향을 미칠 수 있습니까?
  • 인증서 신뢰 체인 문제가 있습니까?만약 당신이 서버에서 soap 서비스로 브라우징한다면, 당신은 SSL을 얻을 수 있습니까?
  • 위와 관련된 - 인증서가 올바른 위치에 설치되었습니까?(신뢰할 수 있는 루트 인증 기관에서 사본이 필요할 수 있습니다.)
  • 서버의 컴퓨터 수준 프록시가 올바르게 설정되어 있습니까?(사용자의 프록시와 다름), XP/2003에 대한 proxycfg 참조(Vista 등에 대한 확실하지 않음)

저는 개인적으로 다음 솔루션을 가장 좋아합니다.

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

그런 다음 오류 확인을 요청하기 전에 다음을 수행합니다.

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

루크의 해결책과 상의한 후에 발견했습니다.

모든 사용자를 맹목적으로 신뢰하고 특정 호스트에 대해서만 신뢰 예외를 만들지 않으려면 다음 솔루션이 더 적합합니다.

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

그럼 Ssl에 전화하세요.신뢰할 수 있음앱이 시작될 때 호스트입니다.

Windows 2003을 사용하는 경우 다음을 시도할 수 있습니다.

Microsoft Management Console(시작 --> 실행 --> mmc.exe)을 엽니다.

파일 --> 스냅인 추가/제거를 선택합니다;

독립 실행형 탭에서 추가를 선택합니다.

인증서 스냅인을 선택하고 추가를 클릭합니다.

마법사에서 컴퓨터 계정을 선택한 다음 로컬 컴퓨터를 선택합니다.마침을 눌러 마법사를 종료합니다.

스냅인 추가/제거 대화 상자를 닫습니다.

인증서(로컬 컴퓨터)로 이동하여 가져올 저장소를 선택합니다.

인증서를 발급한 회사의 루트 CA 인증서가 있는 경우 신뢰할 수 있는 루트 인증 기관을 선택합니다.

서버 자체에 대한 인증서가 있는 경우, [기타 사용자]를 선택합니다.

스토어를 마우스 오른쪽 단추로 클릭하고 모든 작업 --> 가져오기를 선택합니다.

마법사에 따라 보유한 인증서 파일을 제공합니다.

그런 다음 IIS를 다시 시작하고 웹 서비스를 다시 호출하십시오.

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

루크는 이것에 대해 꽤 좋은 기사를 썼습니다.꽤 솔직합니다.이것을 한번 해보세요.

루크의 해결책

이유(그의 글에서 인용한 (욕설을 뺀)"..위 코드의 문제는 인증서가 유효하지 않으면 작동하지 않는다는 것입니다.잘못된 SSL 인증서를 사용하여 웹 페이지에 게시하는 이유는 무엇입니까?왜냐하면 저는 싸기 때문에 베리사인이나 다른 **-* 중 하나에게 제 테스트 박스에 대한 확실한 비용을 지불하고 싶지 않아서 스스로 서명했습니다. 그래서 저는 스스로 서명했습니다.제가 요청을 보냈을 때 저에게 던져진 사랑스러운 예외가 있었습니다.

시스템.넷.웹 예외 기본 연결이 닫혔습니다.원격 서버와 신뢰 관계를 설정할 수 없습니다.

당신에 대해서는 모르겠지만, 제가 보기에 그 예외는 POST가 실패하게 만든 제 코드의 어리석은 실수로 인해 발생하는 것처럼 보였습니다.그래서 저는 계속 검색하고, 수정하고, 온갖 이상한 일들을 했습니다.***n 항목을 구글에 검색한 후에야 잘못된 SSL 인증서가 발견된 후 기본 동작이 바로 이 예외를 던지는 것이라는 것을 알게 되었습니다.

Microsoft의 SSL 진단 도구를 통해 문제를 식별할 수 있습니다.

지금 링크가 수정되었습니다.

추가할 내용:

 ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;}

서비스에 전화하는 줄 바로 앞에

방금 이 문제가 발생했습니다.제 해결책은 타임 서버에 수동으로 동기화하여 시스템 시간을 업데이트하는 것이었습니다.이를 위해 다음을 수행할 수 있습니다.

  • 작업 표시줄에서 시계를 마우스 오른쪽 버튼으로 클릭합니다.
  • 를 선택합니다.Adjust Date/Time
  • 다음을 선택합니다.Internet Time
  • Change Settings
  • 를 선택합니다.Update Now

제 경우에는 동기화가 잘못되어 올바르게 업데이트되기 전에 여러 번 클릭해야 했습니다.계속 잘못 업데이트되는 경우 서버 드롭다운에서 다른 타임 서버를 사용할 수도 있습니다.

사용해 보십시오.

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

적어도 4.5.NET 프레임워크를 사용해야 합니다.

도 저도비문있다니었습제에서 비슷한 ..NET응용프로그램을 검색할 수 있습니다.

신뢰할 수 있는 편집자 인증서에 인증서(이 경우 VeriSign Class 3 인증서)를 추가하는 문제를 해결했습니다.

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

다음에서 인증서를 내보낼 경우 인증서를 얻을 수 있습니다.

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

감사해요.

다음과 같은 URL을 가진 웹 서버에서 이 오류가 발생했습니다.

a.b.domain.com

하지만 그것에 대한 인증서가 없어서 DNS라는 이름을 받았습니다.

a_b.domain.com

이것이 구글에서 상위권에 올랐기 때문에 여기에 이 해결책에 대한 힌트를 덧붙입니다.

VS 클라이언트 측에서 서비스 참조를 성공적으로 추가하고 첫 번째 호출을 실행하려고 하면 다음과 같은 예외가 발생합니다. "기본 연결이 닫혔습니다.SSL/TLS 보안 채널에 대한 신뢰 관계를 설정할 수 없습니다." IP 주소로 엔드포인트 URL을 사용하고 있으며 이 예외가 발생한 경우 다음 단계를 수행하여 서비스 참조를 다시 추가해야 합니다.

  • Internet Explorer에서 엔드포인트 URL을 엽니다.
  • 인증서 오류 클릭(주소 표시줄의 빨간색 아이콘)
  • 인증서 보기를 클릭합니다.
  • 발급된 "name"을 가져가서 IP 주소 또는 사용하던 이름을 바꾸고 이 "name"에 대한 오류를 확인합니다.

다시 시도합니다.감사해요.

이 경우 IIS 7을 사용하여 Visual Studio 환경에서 SSL을 테스트하려고 했습니다.

이것이 제가 그것을 작동시키기 위해 하게 된 것입니다.

  • 바인딩의 내 사이트 아래에..IIS의 오른쪽 섹션에서 포트 443에 'https' 바인딩을 추가하고 "IIS Express Development Certificate"를 선택해야 했습니다.

  • 내 사이트의 '고급 설정...오른쪽 섹션에서 '사용 가능한 프로토콜'을 "http"에서 "https"로 변경해야 했습니다.

  • 'SSL 설정' 아이콘에서 클라이언트 인증서에 대해 '승인'을 선택했습니다.

  • 그리고 나서 저는 앱 풀을 재활용해야 했습니다.

  • 또한 mmc.exe를 사용하여 로컬 호스트 인증서를 개인 저장소로 가져와야 했습니다.

나의web.config파일이 이미 올바르게 구성되어 있기 때문에 위의 내용을 모두 정리한 후 테스트를 계속할 수 있었습니다.

나의 솔루션(VB).Net, 이 응용 프로그램의 "스테이지"(UAT) 버전은 "스테이지" 인증서와 함께 작동해야 하지만 요청이 라이브 사이트에 있는 경우에는 영향을 주지 않습니다.):

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

누군가에게 도움이 된다면 제가 한동안 사용해온 변형입니다.

호출자는 신뢰할 수 없는 인증이 필요한지 명시적으로 요청해야 하며 완료 시 콜을 기본 상태로 되돌려야 합니다.

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

잘못된 인증서가 작동하지 않는 경우, ServerCertificateValidationCallback이 true를 반환할 때, MyServerCertificateValidationCallback 코드:

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

에서 서버 인증서 유효성 검사 콜백 실행을 차단한 내 코드:

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

OnValidateCertificateError 함수:

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 코드 및 ServerCertificateValidationCallback이 매우 잘 실행되지 않도록 설정했습니다.

언급URL : https://stackoverflow.com/questions/703272/could-not-establish-trust-relationship-for-ssl-tls-secure-channel-soap

반응형