-
HttpWebRequest 루트 인증서와 해당 도메인 인증서 확인하기.프로그래밍/C# + Unity 2020. 5. 18. 19:20728x90
RemoteCertificateValidationCallback은 HTTPS 인증서를 확인할 수 있게 해준다.
단, 'UNITYTLS_X509VERIFY_FLAG_NOT_TRUSTED'라는 메시지가 나오면서 Unity상에서는 위와 같은 방법을 사용할 수 없다. 왜냐하면 현재와 같이 루트 인증서와 비교하여 검증하기 위해 OpenSSL/MbedTLS를 사용하는 대신 시스템별 TLS API를 통해 검증을 수행함으로써 이 문제를 해결할 수 있을지 모르지만, 이 해결방법은 서로 다른 운영체제에서 작동되지 않을 가능성이 크기 때문에 Unity상에서 구현을 하지 않았다고 한다.
static void Main(string[] args) { try { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate); HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://원하는_도메인_주소"); request.Method = "GET"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream stream = response.GetResponseStream(); StreamReader reader = new StreamReader(stream, Encoding.UTF8); string text = reader.ReadToEnd(); stream.Close(); response.Close(); reader.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { try { if (sslPolicyErrors != SslPolicyErrors.None) {//SSL이 오류인 경우 Console.WriteLine(sslPolicyErrors); return false; } Console.WriteLine("Subject : " + certificate.Subject); Console.WriteLine("Issuer : " + certificate.Issuer); Console.WriteLine("Hash : " + certificate.GetCertHashString()); X509ChainElementCollection x509ChainElement = chain.ChainElements; X509Certificate rootCA = x509ChainElement[x509ChainElement.Count - 1].Certificate; Console.WriteLine("Root CA Subject : " + rootCA.Subject); Console.WriteLine("Root CA Issuer : " + rootCA.Issuer); Console.WriteLine("Root CA Hash : " + rootCA.GetCertHashString()); return true; } catch (Exception) { return false; } }
위의 그림에서는 본 블로그의 주소인 https://syudal.tistory.com을 입력하여 테스트하였다.
728x90댓글