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를 다시 시작하고 웹 서비스를 다시 호출하십시오.
답변
맹목적으로 모든 사람을 믿지 않고 특정 호스트에 대해서만 신뢰 예외를 만들지 않으려면 다음 솔루션이 더 적합합니다.
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를 호출하십시오.
답변
누가는 이것에 대해 꽤 좋은 기사를 썼습니다.
이유 (자신의 기사에서 인용 (마이너스 빼기)) “.. 위 코드의 문제점은 인증서가 유효하지 않으면 작동하지 않는다는 것입니다. 왜 SSL 인증서를 사용하여 웹 페이지에 게시하고 SSL 인증서가 유효하지 않습니까? 나는 싸고 나는 Verisign이나 다른 **- * s를 인증서 상자에 내 테스트 상자에 지불하고 싶지 않아서 자체 서명했다. 요청을 보낼 때 나는 멋진 예외를 받았다.
System.Net.WebException
기본 연결이 닫혔습니다. 원격 서버와의 신뢰 관계를 설정할 수 없습니다.
나는 당신에 대해 모른다.하지만 나에게 예외는 내 코드에서 바보 같은 실수로 인해 POST가 실패하는 것처럼 보였습니다. 그래서 나는 계속해서 검색하고, 모든 종류의 이상한 일을 조정하고했습니다. 내가 *** n 일을 검색 한 후에 만 잘못된 SSL 인증서가 발생한 후의 기본 동작은이 예외를 던지는 것임을 알았습니다. .. “