Programing

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

lottogame 2020. 3. 10. 08:19
반응형

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


C # (2.0)으로 작성된 웹 서비스에 대해 Visual Studio에서 생성 된 웹 서비스 프록시를 통해 .NET (C #) 2.0 Windows 앱으로 생성 된 간단한 웹 서비스 호출이 있습니다. 이것은 몇 년 동안 일해 왔으며, 수십 개 또는 그 곳에서 계속 작동하고 있습니다.

새 사이트에서 새로 설치하면 문제가 발생합니다. 웹 서비스를 호출하려고 시도하면 다음과 같은 메시지와 함께 실패합니다.

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

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

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


생각 (과거의 고통에 근거) :

  • 서버에 대한 DNS 및 가시선이 있습니까?
  • 인증서에서 올바른 이름을 사용하고 있습니까?
  • 인증서가 여전히 유효합니까?
  • 로드 밸런서가 잘못 구성되어 있습니까?
  • 서버 시스템에 시계가 올바르게 설정되어 있습니까 (예 : UTC 시간이 정확하도록 [현지 시간 무시, 크게 영향을받지 않음]) 이것은 확실히 WCF에 중요하므로 일반 SOAP에 영향을 줄 수 있습니까?
  • 인증서 신뢰 체인 문제가 있습니까? 서버에서 SOAP 서비스를 탐색하면 SSL을 얻을 수 있습니까?
  • 위와 관련된-인증서가 올바른 위치에 설치 되었습니까? (신뢰할 수있는 루트 인증 기관에 사본이 필요할 수 있습니다)
  • 서버의 머신 레벨 프록시가 올바르게 설정되어 있습니까? (사용자의 프록시와 다릅니다); XP / 2003 용 proxycfg를 참조하십시오 (Vista 등에 대해서는 확실하지 않음)

다음 코드 조각은 호출하는 서버의 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;
}

매우 간단한 "모두 포착"솔루션은 다음과 같습니다.

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

sebastian-castaldi의 솔루션이 조금 더 자세합니다.


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

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

... 오류를 요청하기 전에 다음을 수행하십시오.

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

Luke의 솔루션을 참조한 후 이것을 발견


Windows 2003을 사용하는 경우 다음을 시도하십시오.

Microsoft 관리 콘솔을 엽니 다 (시작-> 실행-> mmc.exe).

파일-> 스냅인 추가 / 제거를 선택하십시오.

독립형 탭에서 추가를 선택하십시오.

인증서 스냅인을 선택하고 추가를 클릭하십시오.

마법사에서 컴퓨터 계정을 선택한 다음 로컬 컴퓨터를 선택하십시오. 완료를 눌러 마법사를 종료하십시오.

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

인증서 (로컬 컴퓨터)로 이동하여 가져올 상점을 선택하십시오.

인증서를 발행 한 회사의 루트 CA 인증서가있는 경우 신뢰할 수있는 루트 인증 기관을 선택하십시오.

서버 자체에 대한 인증서가있는 경우 기타 사용자를 선택하십시오.

상점을 마우스 오른쪽 단추로 클릭하고 모든 태스크-> 가져 오기를 선택하십시오.

마법사를 따라 인증서 파일을 제공하십시오.

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

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


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

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.EnableTrustedHosts를 호출하십시오.


Microsoft의 SSL 진단 도구 가 문제를 식별하는 데 도움이 될 수 있습니다.

업데이트 링크가 수정되었습니다.


누가는 이것에 대해 꽤 좋은 기사를 썼습니다.

누가의 해결책

이유 (자신의 기사에서 인용 (마이너스 빼기)) ".. 위 코드의 문제는 인증서가 유효하지 않으면 작동하지 않는다는 것입니다. 왜 SSL 인증서를 사용하여 웹 페이지에 게시하고 SSL 인증서가 유효하지 않습니까? 나는 싸고 나는 Verisign이나 다른 **- * s를 인증서 상자에 내 테스트 상자에 지불하고 싶지 않아서 스스로 서명했다. 요청을 보낼 때 나는 멋진 예외를 받았다.

System.Net.WebException 기본 연결이 닫혔습니다. 원격 서버와의 신뢰 관계를 설정할 수 없습니다.

나는 당신에 대해 모른다. 그러나 나에게 예외는 내 코드에서 바보 같은 실수로 인해 POST가 실패하는 것처럼 보였습니다. 그래서 나는 계속해서 검색하고, 모든 종류의 이상한 일을 조정하고했습니다. 내가 *** n 일을 검색 한 후에 만 ​​잘못된 SSL 인증서가 발생한 후의 기본 동작은이 예외를 던지는 것임을 알았습니다. .. "


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

  • 작업 표시 줄에서 시계를 마우스 오른쪽 버튼으로 클릭
  • 고르다 Adjust Date/Time
  • Internet Time탭을 선택 하십시오
  • 딸깍 하는 소리 Change Settings
  • 고르다 Update Now

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


.NETInternet Explorer의 앱에서도 비슷한 문제가 발생했습니다 .

신뢰할 수있는 편집자 인증서에 인증서 (필자의 경우 VeriSign 클래스 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

감사


이 시도:

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

4.5 .NET 프레임 워크 이상으로 작업해야합니다.


URL과 같은 웹 서버에 대해이 오류가 발생했습니다.

a.b.domain.com

하지만 인증서가 없어서 DNS라는

a_b.domain.com

이 솔루션은 Google에서 최고이기 때문에 여기에 힌트를 넣으십시오.


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

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

다시 시도하십시오 :). 감사


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

이것이 내가 작동하게하는 일입니다.

  • IIS의 오른쪽에있는 'Bindings ...'섹션에있는 내 사이트에서 포트 443에 'https'바인딩을 추가하고 "IIS Express Developement 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

ServerCertificateValidationCallback이 true를 반환 할 때 잘못된 sertificate가 작동하지 않으면; 내 서버 인증서 ValidationCallback 코드 :

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

ServerCertificateValidationCallback을 실행하지 못하게하는 코드 :

     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

반응형