2011-03-11 6 views
8

현재 주어진 IP 및 포트에 연결하고 HttpWebRequest를 사용하여 SSL 인증서의 정보를 확인하는 유틸리티 응용 프로그램을 작성 중입니다. 인증서 추출을 시도 할 때 예외가 발생했다는 오류가 발생합니다. 예외는 SSL 인증서를 처리하는 동작이 또 다른 유효성 검사를 트리거하는 것으로 보이기 때문인 것으로 보입니다.C#에서 HttpWebRequest와 함께 SSL 인증서를 사용하려면 어떻게해야합니까?

여기 코드가 있습니다. 어쩌면 다른 사람이 나에게 더 나은 방법을 제시하거나 내가 누락 된 부분을 표시 할 수 있습니다. SSL 인증서가 만료되었거나 URL과 일치하지 않는 경우 걱정하지 않습니다. 그것의 아무 것도 내가하는 일과 관련이 없습니다. 나는 새로운 변수에 위임의 X509Certificate에 할당하고 디버거에서 변수를 볼 때

는, 모든 속성은 SSLCert.Issuer가 'System.Security.Cryptography.CyrptographicException'

유형의 예외가 발생했습니다 보여 m_safeCertContext이

I'be 그 예외를 검색 잘못된 핸들이지만, 잘못된 인증서에 이르기까지 모든 포인트가 될 수있는 :

나는 SSLCert의 속성에 액세스하려고 는, 나는 다음과 같은 예외가 던져 증명서가 만료 한 경우는 true, IP의 경우는 true 및 포트 조합이 연결됩니다. 그러나 IP를 사용하여 IP에 연결 했으므로 일반 이름과 일치하는 것이 아니기 때문에 나는 그 정보를 필요로하므로 그 정보를 기대하고 덜 신경 쓸 수 있습니다.

아래 코드는 작동하지 않는 코드와 작동하는 코드에 대한 몇 가지 주석을 넣었습니다.

// To get around the SSL validation in the HttpWebRequest 
     System.Net.ServicePointManager.ServerCertificateValidationCallback = 
      delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, 
         System.Security.Cryptography.X509Certificates.X509Chain chain, 
         System.Net.Security.SslPolicyErrors sslPolicyErrors) 
      { 
       // The below works but isn't what I want. CertName and ExpireDate are both Strings 
       this.CertName = ProcessSubject(certificate.Subject); 
       this.ExpireDate = certificate.GetExpirationDateString(); 
       // The below works but the X509Certificate SSLCert shows exceptions in the debugger for most of the properties. 
       this.SSLCert = certificate; 

       return true; // **** Always accept 
      }; 
     HttpWebRequest myRequest = (HttpWebRequest)System.Net.WebRequest.Create("https://" + this.IP + ":" + this.Port + "/SSLCheck.html"); 
     myRequest.KeepAlive = false; 
     myRequest.Method = "GET"; 

     try 
     { 
      HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse(); 
     } 
     catch (Exception e) 
     { 
      if (e.Message != "The remote server returned an error: (404) Not Found.") 
      { 
       throw Exception("Error"); 
      } 

     } 

     // THE BELOW FAILS 
     this.CertName = this.SSLCert.Subject; 
+0

'HttpWebRequest'에서 SSL 및 인증서로 작업하는 것에 대해 많은 질문과 답변이 있습니다. 오른쪽의 "관련"질문을 보았습니까? 아니면 [ssl certificate httpwebrequest]를 검색 했습니까? –

+1

예, 거의 모든 사람들이 사용하지 않는 클라이언트 인증서를 사용하는 방법을 묻습니다. 또는 이미 처리하고있는 잘못된 인증서로 인해 HttpWebRequest에서 오류가 발생합니다. – omniplex

+0

큰 문제는 X509Certificate을 다른 X509Certificate 형식 변수에 복사하고 .NET에서 "this.SSLCert = certificate;"할 때 인증서의 유효성을 다시 확인하는 것입니다. – omniplex

답변

0

(아래의 코멘트에서 편집) 난 당신이 사용자 정의 클래스를 생성하면됩니다 당신이 실제 인증서 주위에 통과하기보다는, 대리인 코드 내부에 거기에 필요한 데이터를 저장하는 데 필요한 가정 참고.

+0

불행히도 같은 문제입니다. 대리자가 X509Certificate 형식을 사용하는 동안 실제로 전달 된 형식은 X509Certificate2이므로 그냥 그대로 전달합니다.나는 그것을 시도하고 재검사했지만, 같은 문제. – omniplex

+0

아마도 구성원 별 복제본을 대신 사용해보십시오. –

+0

좋은 시도입니다. 그러나 이상하게도이 메서드는 MSDN 사이트에서 보호 된 메서드로 간주되지만 어떤 이유로 든 사용할 수있는 것으로 보입니다. VS가 오류로 강조 표시하고 컴파일되지 않습니다. 또한 intellisense는 올바른 방법으로 그것을 보여주지 않습니다. – omniplex

1

이것은 내 생각에 불과합니다. 내가 생각하는 것은 SSL 핸드 셰이크를 통해 들어오는 인증서 정보가 .NET에 의해 델리게이트에서 전달 된 인증서 개체를 만드는 데 사용된다는 것입니다. 위임자는 유효성 확인 목적으로 만 사용됩니다. 호출이 완료되면 .NET은 인증서의 안전한 핸들을 닫습니다. 따라서 콜백 외부의 인증서에 액세스하려고 할 때 호출이 실패하는 것입니다.

이 문제를 해결하려면 대리인 내에서 인증서를 serialize하고 대리인 외부에서 deserialize 할 수 있습니다.

+0

감사합니다.이 도움이되었습니다 (인증서 속성 만 필요하므로 대리인의 클래스 범위 변수에 할당했습니다). –

관련 문제