2013-12-12 2 views
1

Android 용 Mono에서 WebRequests를 사용 중이며 일부 서버의 경우 인증서 유효성 검사가 실패합니다. ICertificatePolicy을 구현했습니다 (ServerCertificateValidationCallback이 호출되지 않았으므로 안드로이드 용 Mono의 문제 일까?). 사용자가 앱 설정에서 모든 인증서를 허용 한 경우 true를 반환합니다. 사용자가이 설정을 사용 중지하면 유효성 검사에 문제가있을 경우 false가 표시됩니다. 이 경우 사용자에게 인증서 유효성 검사 문제가 발생했음을 알리는 메시지를 표시하고 싶습니다.WebException에서 인증서 유효성 검사 오류 확인

Problem SSL Certificate C#에 따르면, 나는

catch (WebException we) 
     { // If SSL throws exception that will be handled here 
      if (we.Status == WebExceptionStatus.TrustFailure) 
       throw new Exception("some nice message"); 
     } 

같은 catch 블록을 구현하지만이 상태가 SendFailure로 설정되어 있기 때문에 쓸모없는 것으로 밝혀졌습니다. 예외로 인해 유효성 검사가 실패했다는 것을 어떻게 알 수 있습니까? InnerException을 통해 http://msdn.microsoft.com/en-us/library/system.net.icertificatepolicy(v=vs.110).aspx에 나열된 코드 중 하나인지 확인하려면 TlsException을 찾아야합니까?

더 좋은 해결책이 있습니까? 내가 찾은

System.Net.WebException: Error getting response stream (Write: The authentication or decryption has failed.): SendFailure ---> System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: Invalid certificate received from server. Error code: 0xffffffff800b010a 
D/KP2A (17517): at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.RemoteValidation (Mono.Security.Protocol.Tls.ClientContext context, AlertDescription description) [0x00000] in <filename unknown>:0 
D/KP2A (17517): at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates (Mono.Security.X509.X509CertificateCollection certificates) [0x00000] in <filename unknown>:0 
D/KP2A (17517): at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1() [0x00000] in <filename unknown>:0 
D/KP2A (17517): at Mono.Security.Protocol.Tls.Handshake.HandshakeMessage.Process() [0x00000] in <filename unknown>:0 
D/KP2A (17517): at Mono.Security.Protocol.Tls.ClientRecordProtocol.ProcessHandshakeMessage (Mono.Security.Protocol.Tls.TlsStream handMsg) [0x00000] in <filename unknown>:0 
D/KP2A (17517): at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
D/KP2A (17517): --- End of inner exception stack trace --- 
D/KP2A (17517): at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
D/KP2A (17517): --- End of inner exception stack trace --- 
D/KP2A (17517): at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
D/KP2A (17517): at System.Net.HttpWebRequest.GetResponse() [0x00000] in <filename unknown>:0 
D/KP2A (17517): at System.Net.WebClient.GetWebResponse (System.Net.WebRequest request) [0x00000] in <filename unknown>:0 
D/KP2A (17517): at System.Net.WebClient.OpenRead (System.Uri address) [0x00000] in <filename unknown>:0 

답변

0

유일한 해결책은 그것은 "ToString()"방법을 사용하여 전체 전 스택을 확인하고 있는지 확인하는 것이 었습니다 :

거짓 내 ICertificatePolicy 반환 나는 경우에 얻을 예외 텍스트가 포함되어 있습니다.

catch(WebException ex) 
    { 
     string fullExStack = ex.ToString(); 
     if (fullExStack.Contains(("System.IO.IOException: The authentication or decryption has failed.").ToLower()) 
      || fullExStack.Contains(("Mono.Security.Protocol.Tls.TlsException: Invalid certificate received from server.").ToLower())) 

     { 
      // Do Anything you need here 
      // like throwing a custom exception 
     } 
    } 
관련 문제