웹 서비스를 사용할 수 있는지 확인하는 방법을 구현해야합니다. 주요 문제는 URL이 HTTPS이고 에 인증서가 필요하다는 것입니다.. 그래서 컴퓨터에서 인증서를 가져온 다음 을 얻으려면 HttpWebRequest
을 만들어야합니다. 내 실제 구현HttpWebRequest 및 X509 SSL 인증서로 HTTPS 웹 서비스를 사용할 수 있는지 확인하십시오.
I 인증서를 검색 할 수 있지만, I는 request.GetResponse()
메소드를 호출 할 때이 예외가 발생 :
는는 [System.Net.WebException] = { "기본 연결이 종료 하였다 : 예상치 못한 오류가 발생한 송신에 "}
의 InnerException :
는 [System.IO.IOException] = {"에서 EOF 예기치 0 바이트를 수신전송 스트림 "}
나는 여러 가지 가능한 해결책을 읽었지 만 나에게는 효과가없는 것으로 보입니다. 안녕하세요. 입니다. .NET 3.5입니다.
이
은using (WebClient client = new WebClient())
{
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certificates = store.Certificates.Find(X509FindType.FindByThumbprint, CertificateThumbprint, false);
if (certificates.Count == 0)
throw new Exception("No corresponding certificate found.");
X509Certificate2 certificate = certificates[0];
// Not compiling on .NET 3.5
// Error: cannot apply '+=' operator to
//'System.Net.Security.RemoteCertificateValidationCallback'
//and 'anonymous method'
//ServicePointManager.ServerCertificateValidationCallback +=
// delegate(
// object sender,
// X509Certificate certificate,
// X509Chain chain,
// SslPolicyErrors sslPolicyErrors)
// {
// return true;
// };
// Not compiling on .NET 3.5
// Error: cannot apply '+=' operator to 'System.Net.Security.RemoteCertificateValidationCallback' and 'lambda expression'
// ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
// Not working
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
// Not working
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(UrlWSInvioComunicazioni);
request.ClientCertificates.Add(certificate);
request.Method = "HEAD";
// throws Exception...
HttpWebResponse webResponse = request.GetResponse() as HttpWebResponse;
webResponse.Close();
response.ResultCode = ResultCode.Success;
response.ResultMessage = "Service available.";
}
업데이트 2017년 5월 10일 내 코드입니다
나는 TLS 1.2, 내가 사용하고 있습니다 지원하지 않았다 .NET 3.5에있어 이후 Microsoft의 패치 (KB3154519 참조)는 SecurityProtocolTypeExtensions
및 SslProtocolsExtensions
확장 클래스를 사용하여 TLS 1.2를 사용할 수있게합니다.
이미 2017 년 1 월 (Microsoft에서 패치를 릴리스 한 이후) 다른 웹 서비스에서이 메서드를 사용했으며 문제없이 작동합니다.
내가 생각하는 내가 지금 가지고있는 문제 :
[System.Net.WebException] = { "요청이 중단되었습니다. SSL/TLS 보안 채널을 생성 할 수 없습니다"}
은 내 PC에있는 것과 관련이 있습니다.
업데이트 2017년 5월 12일는
드디어 문제가 IIS 관련 것을 발견했다. 내 PC에있는 웹 응용 프로그램의 응용 프로그램 풀이 Identity가 ApplicationPoolIdentity
으로 설정된 상태로 실행되고있었습니다. LocalSystem
또는 현재 사용자 (관리자)로 설정하면 작동했습니다.
그래서 응용 프로그램 풀이 ApplicationPoolIdentity로 실행되는 동안 인증서에 대한 액세스가 올바르지 않습니다.
감사를 위해 작동하는지! 훌륭한 사이트! ;-) TLS 1.2 ([link] (https://www.ssllabs.com/ssltest/analyze.html?d=testservizi.fatturapa.it)) 만 사용 된 것 같습니다. 하지만 내 코드에는'SecurityProtocolType.Sls3'과'SecurityProtocolType.Tls' 만 있고'SecurityProtocolType.Tls12'는 아닙니다. 그래서 내가 무엇을 할 수 있니...? –
SLL 공급자는 OS에 설치되므로 어떤 공급자가 시스템에 설치되어 있는지 확인할 필요가 있습니다. [IISCrypto] (https://www.nartac.com/Products/IISCrypto)를 사용하면 사용할 수있는 공급자를 알려줍니다. Tls 1.2가 설치되어 있지 않으면 OS를 변경해야합니다. Windows Server 2008 R2는 tls 1.2를 지원하는 첫 번째 창입니다. – migabriel
저는 Windows 10 최신 빌드입니다. 하지만 VS 2012와 .NET 3.5를 사용하고 있습니다. –