[Xamarin]The SSL connection could not be established, see inner exception

해내면 그만!XX·2023년 1월 29일
0

앱에서 api테스트를 하는데 오류가 발생했다.
포스트맨에서는 잘 되는데 app에서는 왜...https란 무엇인가...

이 경우에는 시스템에서 신뢰할 수 없는 CA를 보유했기 때문에 SSLHandshakeException이 발생합니다.
신뢰할 수 있는 인증서를 사용하는 한 제대로 작동합니다. 그러나 대부분의 QA/Dev 환경은 일반적으로 자체 호스팅 인증서를 사용하여 비용을 절감하므로 다음과 같은 오류가 발생합니다.

기본 연결이 닫혔습니다. SSL/TLS 보안 채널에 대한 신뢰 관계를 설정할 수 없습니다.
이 문제를 해결하는 가장 간단한 방법은 ServerCertificateValidationCallback속성을 사용하여 서버 인증서의 사용자 지정 유효성 검사를 만드는 것입니다.

위의 코드는 상호 작용하는 서버에서 반환되는 모든 보안 인증서를 신뢰하므로 신뢰할 수 있는지 확인하십시오. 대부분의 경우 상대방에서 서버를 제어하므로 문제가 되지 않습니다.

아는 개발자의 말로는...
Https 를 쓰는 이유는 데이터 무결성 체크도 있고 암호화도 되고 인증할때 주로 하는건 맞긴한데케바케지만 안써도 된다보단 이왕이면 쓴다? 정도가 낫지않을까 싶습니다

왜 오류가 발생했을까 생각을 해보니 cloudflare에서 제공하는 무료 https를 사용해서 인데 제대로된 보안은 아니고 보안처럼 보이는 약한 보안이라고 한다... 아마도 이것 때문이 아닐까 하는데 다음에 시간이 되면 cloudflare ssl 인증 방법도 찾아봐야겠다.

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

이렇게 설정을 해줘도 오류가 안없어지고

HttpClientHandler handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true;
HttpClient client = new HttpClient(handler);

이것도 안되었다
왜냐하면 나는 restsharp를 사용하기 때문에 ...

            HttpClientHandler clientHandler = new HttpClientHandler();
            clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };

            HttpClient httpClient = new HttpClient(clientHandler);
            httpClient.BaseAddress = new Uri("https://localhost:44361/");

            var restClient = new RestClient(httpClient);
            var request = new RestRequest("UserLog/GetData", Method.Get) { RequestFormat = DataFormat.Json };
            var response = restClient.Execute<List<QueryExecutionModel>>(request);

이렇게 해서 해결하였다.

참조
https://github.com/restsharp/RestSharp/issues/1127
https://robertgreiner.com/could-not-establish-trust-relationship-for-the-ssl-tls-secure-channel/

0개의 댓글