2017-05-09 1 views
0

웹 서비스를 사용할 수 있는지 확인하는 방법을 구현해야합니다. 주요 문제는 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 참조)는 SecurityProtocolTypeExtensionsSslProtocolsExtensions 확장 클래스를 사용하여 TLS 1.2를 사용할 수있게합니다.

이미 2017 년 1 월 (Microsoft에서 패치를 릴리스 한 이후) 다른 웹 서비스에서이 메서드를 사용했으며 문제없이 작동합니다.

내가 생각하는 내가 지금 가지고있는 문제 :

[System.Net.WebException] = { "요청이 중단되었습니다. SSL/TLS 보안 채널을 생성 할 수 없습니다"}

은 내 PC에있는 것과 관련이 있습니다.

업데이트 2017년 5월 12일는

드디어 문제가 IIS 관련 것을 발견했다. 내 PC에있는 웹 응용 프로그램의 응용 프로그램 풀이 Identity가 ApplicationPoolIdentity으로 설정된 상태로 실행되고있었습니다. LocalSystem 또는 현재 사용자 (관리자)로 설정하면 작동했습니다.

그래서 응용 프로그램 풀이 ApplicationPoolIdentity로 실행되는 동안 인증서에 대한 액세스가 올바르지 않습니다.

답변

1

URL을 검사하여 서버가 사용하는 SSL 공급자를 확인하십시오.당신은 여기서 할 수 있습니다 ->https://www.ssllabs.com/ssltest/analyze.html

protocols

일부 서버는 보안상의 이유로 비활성화 SSL3 있습니다. 따라서이 설정을 대신 사용해야합니다.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls; 

또는 클라이언트에서 사용할 수있는 경우 Tls 1.2를 사용해야합니다.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls12; 

업데이트 확인이 코드는 힌트 당신

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (SecurityProtocolType)3072; 
var httpRequest = (HttpWebRequest)WebRequest.Create("https://google.com"); 
httpRequest.Method = "GET"; 
httpRequest.ContentType = "text/html"; 

httpRequest.KeepAlive = false; 
httpRequest.MaximumAutomaticRedirections = 30; 

var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 
var responseStream = new StreamReader(httpResponse.GetResponseStream()); 

var strResponse = responseStream.ReadToEnd(); 

httpResponse.Close(); 
responseStream.Close(); 
+0

감사를 위해 작동하는지! 훌륭한 사이트! ;-) TLS 1.2 ([link] (https://www.ssllabs.com/ssltest/analyze.html?d=testservizi.fatturapa.it)) 만 사용 된 것 같습니다. 하지만 내 코드에는'SecurityProtocolType.Sls3'과'SecurityProtocolType.Tls' 만 있고'SecurityProtocolType.Tls12'는 아닙니다. 그래서 내가 무엇을 할 수 있니...? –

+0

SLL 공급자는 OS에 설치되므로 어떤 공급자가 시스템에 설치되어 있는지 확인할 필요가 있습니다. [IISCrypto] (https://www.nartac.com/Products/IISCrypto)를 사용하면 사용할 수있는 공급자를 알려줍니다. Tls 1.2가 설치되어 있지 않으면 OS를 변경해야합니다. Windows Server 2008 R2는 tls 1.2를 지원하는 첫 번째 창입니다. – migabriel

+0

저는 Windows 10 최신 빌드입니다. 하지만 VS 2012와 .NET 3.5를 사용하고 있습니다. –

관련 문제