Android에서 SSL 핸드셰이크 예외 문제를 해결하는 방법

최근에 저는 안드로이드 플랫폼용 채팅 애플리케이션을 작업하고 있었는데 원격/네트워킹 구현에 관한 모든 것이 완벽하게 작동했습니다. Retrofit 네트워킹 라이브러리와 socket.io를 사용했습니다. 당시 기본 URL에는 SSL(즉, HTTP 체계 - http://api.example.com)이 없었습니다.

베타 테스트용 MVP를 출시하기 직전에 도메인 이름을 획득하고 서버에서 SSL을 활성화했습니다. 이는 기본 URL 체계가 HTTPS가 됨을 의미합니다(예: https://api.example.com ).

보안 URL을 사용하도록 앱을 변경하면 전체 앱이 중단됩니다. 모든 엔드포인트가 서버에 성공적으로 연결되지 않았습니다. 기본적으로 클라이언트와 서버 간의 네트워크 핸드셰이크 프로세스가 성공하지 못했습니다. 다음은 로그의 오류 내용입니다.

<-- HTTP FAILED: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.


약간의 조사를 한 후 나는 그것이 안드로이드 시스템에서 신뢰하지 않는 서버 인증서에 문제가 있음을 발견했습니다. 이는 다음과 같은 이유 때문일 수 있습니다.
  • 서버 인증서를 발급한 인증 기관(CA)을 알 수 없습니다.
  • 서버 인증서가 CA에서 서명되지 않았지만 자체 서명되었습니다.
  • 서버 구성에 중간 CA가 없습니다.

  • 제 경우에는 서버 인증서가 자체 서명되었기 때문에 이 문제가 발생했습니다.

    Android 설명서에는 자체 서명된 인증서를 신뢰하도록 앱을 구성하는 명확한 방법이 있으며, 이에 대해 3단계로 설명하겠습니다.

    1 단계



    원시 폴더에 crt 파일을 추가합니다.

    이 파일은 서버에서 검색됩니다. 백엔드 엔지니어에게 디지털 인증서를 요청할 수 있습니다. 확장자는 .crt여야 합니다.



    2 단계



    아래와 같이 XML 네트워크 보안 구성 파일(network_security_config.xml)을 생성합니다.


    network_security_config.xml
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config>
            <domain includeSubdomains="true">api.example.com</domain>
            <trust-anchors>
                <certificates src="@raw/certificate" />
            </trust-anchors>
        </domain-config>
    </network-security-config>
    
    


    3단계



    애플리케이션의 Manifest.xml 파일에서 네트워크 구성 설정을 지정하십시오.



    이 3단계를 완료하면 추가 문제 없이 백엔드와 원활하게 연결해야 합니다.

    좋은 웹페이지 즐겨찾기