it-gundan.com

SSL/TLS 보안 채널에 대한 트러스트 관계를 설정할 수 없습니다 - SOAP

Visual Studio에서 생성 한 웹 서비스 프록시를 통해 .NET (C #) 2.0 Windows 응용 프로그램에서 생성 된 간단한 웹 서비스 호출이 C # (2.0)로 작성된 웹 서비스에도 생성됩니다. 이것은 수년 동안 일해 왔으며, 계속 진행되고있는 12 개 또는 그 이상의 장소에서 계속하고 있습니다.

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

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

웹 서비스의 URL은 SSL (https : //)을 사용하지만 이는 다른 많은 위치에서 오랜 시간 동안 (그리고 계속해서) 작동했습니다.

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

306
Rob Schripsema

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

  • 서버에 DNS와 가시선이 있습니까?
  • 인증서에서 올바른 이름을 사용하고 있습니까?
  • 인증서가 아직 유효합니까?
  • 로드 밸런서를 엉망으로 만드는 구성이 잘못 되었습니까?
  • 새로운 것을한다. 섬기는 사람 컴퓨터가 시계가 올바르게 설정되어 있어야합니다 (즉, UTC 시간이 정확하도록 [현지 시간 무시, 대부분 무효입니다]). 이것은 WCF에서 중요한 문제이므로 정기적 인 SOAP에 영향을 줄 수 있습니까?
  • 인증서 트러스트 체인 문제가 있습니까? 서버에서 비누 서비스를 탐색하면 SSL을 얻을 수 있습니까?
  • 위와 관련된 - 올바른 위치에 인증서가 설치 되었습니까? (신뢰할 수있는 인증 기관에서 사본이 필요할 수 있음)
  • 서버의 컴퓨터 수준 프록시가 올바르게 설정되어 있습니까? (사용자의 프록시와 다름). XP/2003에 대한 proxycfg 참조 (Vista에 대해서는 확실하지 않음)
156
Marc Gravell

다음 스 니펫은 호출하는 서버의 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;
}
346

매우 간단한 "모든 것을 잡으십시오"해결책은 다음과 같습니다.

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

Sebastian-castaldi의 해결책은 좀 더 자세합니다.

159
Remy

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

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 's Solution

32
cusman

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

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

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

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

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

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

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

인증서 (로컬 컴퓨터)로 이동하고 가져올 저장소를 선택하십시오.

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

서버 자체에 대한 인증서가있는 경우 다른 사람을 선택하십시오.

저장소를 마우스 오른쪽 단추로 클릭하고 모든 작업 -> 가져 오기를 선택하십시오.

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

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

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

18
Diogo

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

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를 호출하면됩니다.

15
Gregor Slavec

Microsoft SSL 진단 도구 는 문제를 식별하는 데 도움을 줄 수 있습니다.

UPDATE링크가 수정되었습니다.

7
sipwiz

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

루크의 해결책

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

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

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

6
Hans

방금이 문제가 발생했습니다. 내 결심은 시간 서버에 수동으로 동기화하여 시스템 시간을 업데이트하는 것이 었습니다. 이렇게하려면 다음을 수행 할 수 있습니다.

  • 작업 표시 줄에서 시계를 마우스 오른쪽 단추로 클릭하십시오.
  • Adjust Date/Time 선택
  • Internet Time 탭을 선택하십시오.
  • Change Settings를 클릭하십시오.
  • Update Now 선택

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

Internet Explorer의 .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

감사

2
debiasej

이 시도:

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

최소한 .NET Framework 4.5 이상에서 작업해야합니다.

2
Manuel Roldan

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

  • Internet Explorer에서 끝점 URL을 엽니 다.
  • 인증서 오류 (주소 표시 줄의 빨간색 아이콘)를 클릭하십시오.
  • 인증서보기를 클릭하십시오.
  • "이름"을 발급 받고 IP 주소 또는 우리가 사용하고 있던 이름을 대체하고이 "이름"에 대한 오류를 가져옵니다.

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

1
Ernest

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

a.b.domain.com

하지만 그것에 대한 인증서가 없었습니다, 그래서 나는 전화 DNS를 가지고

a_b.domain.com

이것이 Google에서 최고를 내놓은 이래로이 솔루션에 대한 힌트를 둡니다.

1
Thomas Koelle

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

이것이 내가 일을 끝내기 위해 끝낸 것입니다.

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

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

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

  • 그런 다음 앱 풀을 재활용해야했습니다.

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

web.config 파일이 이미 올바르게 구성되어 있으므로 위의 모든 항목을 정렬 한 후에 테스트를 계속할 수있었습니다.

0
Popo

내 솔루션 (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
0
GreenRock