실제로이 문제가 해결되었다고 생각했지만 이전에는 위장되었습니다.
HTTPS를 사용하여 IIS 7에서 호스팅되는 WCF 서비스가 있습니다. 내가 Internet Explorer에서이 사이트를 탐색 할 때, 내가 때문이다, 매력처럼 작동 한 로컬 루트 인증 기관 저장소에 인증서를 추가했다.
하나의 컴퓨터에서 개발 중이므로 클라이언트와 서버가 동일한 컴퓨터입니다. 인증서는 IIS 7 관리 스냅인에서 직접 자체 서명됩니다.
나는 지금이 오류가 계속 발생합니다 …
권한이있는 SSL / TLS 보안 채널에 대한 신뢰 관계를 설정할 수 없습니다.
… 클라이언트 콘솔에서 호출 될 때.
사용 findprivatekey
하고 사용하여 인증서에 대한 권한과 네트워크 서비스를 수동으로 제공했습니다 cacls.exe
.
SOAPUI를 사용하여 서비스에 연결하려고 시도했지만 작동하므로 클라이언트 응용 프로그램에서 문제가되어야합니다.
다른 곳에서 볼 수없는 이유는 내가 연결할 수없는 모든 가능성을 소진 한 것 같습니다.
답변
해결 방법으로 클라이언트 측 ServicePointManager
의 ServerCertificateValidationCallback
에 핸들러를 추가 할 수 있습니다 .
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
(se, cert, chain, sslerror) =>
{
return true;
};
그러나 이는 서버 인증서를 완전히 무시하고 서비스 지점 관리자에게 클라이언트 인증서를 심각하게 손상시킬 수있는 인증서는 무엇이든 알려주므로 바람직하지 않습니다 . 이를 구체화하고 일부 사용자 지정 검사 (인증서 이름, 해시 등)를 수행 할 수 있습니다. 최소한 테스트 인증서를 사용할 때 개발 중에 문제를 피할 수 있습니다.
답변
이 문제가 발생하면 client.config에 다음과 같은 끝 점이 있기 때문입니다.
https://myserver/myservice.svc
그러나 인증서는 기대했다
https://myserver.mydomain.com/myservice.svc
서버의 FQDN과 일치하도록 끝점을 변경하면 문제가 해결됩니다. 이것이 이것이이 문제의 유일한 원인은 아니라는 것을 알고 있습니다.
답변
첫 번째는 람다를 사용하고 세 번째는 정규 코드를 사용합니다.
//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 = false;
if (cert.Subject.ToUpper().Contains("YourServerName"))
{
result = true;
}
return result;
}
답변
자체 서명 된 키를 사용하기 때문에 문제가 발생합니다. 클라이언트는이 키를 신뢰하지 않으며 키 자체가 유효성 검증을위한 체인 또는 인증서 해지 목록을 제공하지도 않습니다.
몇 가지 옵션이 있습니다.
-
클라이언트에서 인증서 유효성 검사를 끕니다 (잘못된 이동, 중간 공격에있는 사람이 많음)
-
makecert를 사용하여 루트 CA를 작성하고 그로부터 인증서를 작성하십시오 (이전에는 CRL이 없습니다)
-
Windows 인증서 서버 또는 다른 PKI 솔루션을 사용하여 내부 루트 CA를 만든 다음 해당 루트 인증서를 신뢰합니다 (관리하기가 약간 어려움)
-
신뢰할 수있는 CA 중 하나에서 SSL 인증서 구매
답변
한 줄 솔루션. 클라이언트 측에서 서버를 호출하기 전에이 위치를 추가하십시오.
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };
클라이언트는 SSL / TLS 보안 검사를 건너 뛰므로 테스트 목적으로 만 사용해야합니다.
답변
같은 문제가 발생하여 두 가지 해결 방법으로 문제를 해결할 수있었습니다. 먼저 “컴퓨터 계정”에 MMC 스냅인 “인증서”를 사용하고 자체 서명 된 인증서를 “신뢰할 수있는 루트 인증 기관”폴더로 끌어 놓았습니다. . 즉, 로컬 컴퓨터 (인증서를 생성 한 컴퓨터)는 이제 해당 인증서를 신뢰합니다. 두 번째로 내부 컴퓨터 이름에 대한 인증서가 생성되었지만 다른 이름을 사용하여 웹 서비스에 액세스하고 있음을 알았습니다. 인증서를 검증 할 때 불일치가 발생했습니다. computer.operations.local에 대한 인증서를 생성했지만 https://computer.internaldomain.companydomain.com을 사용하여 웹 서비스에 액세스했습니다 . 인증서를 생성하는 데 사용 된 URL로 URL을 전환하면 더 이상 오류가 발생하지 않습니다.
URL을 바꾸는 것만으로는 효과가 있었지만 인증서를 신뢰할 수있게하면 Internet Explorer에서 인증서를 신뢰하지 않는다는 빨간색 화면이 표시되지 않습니다.
답변
.net core를 사용하는 경우 다음을 시도하십시오.
client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
new X509ServiceCertificateAuthentication()
{
CertificateValidationMode = X509CertificateValidationMode.None,
RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck
};