기술나눔

Okhttp 호스트 이름 검증자에 대한 자세한 설명

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

호스트 이름 검증기

방법 소개

이 블로그 게시물은 Okhttp 4.6.0을 사용하여 분석되었습니다.hostnameVerfier이름에서 알 수 있듯이 이 방법의 주요 기능은 식별하는 것입니다.hostnname 적법성의. 초기화 중에 Okhttp를 직접 구성할 수 있습니다.hostnameVerfier

new OkHttpClient.Builder()
    .connectTimeout(20, TimeUnit.SECONDS)
    .readTimeout(20, TimeUnit.SECONDS)
    .writeTimeout(35, TimeUnit.SECONDS)  
    .hostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            //注意这里在生产环境中千万不要直接写死true          
            return true;
        }
    })
    .build();

하지만온라인에 관한 많은 정보가 있습니다.verfiytrue를 직접 반환하는 것은 매우 위험합니다.물론, vertify가 fasle을 반환하면 호스트 이름 확인이 실패하고 http 요청이 성공할 수 없다는 의미입니다. 예를 들어, 내 블로그 주소로 http 요청을 시작하면 오류 메시지는 다음과 같습니다.
여기에 이미지 설명을 삽입하세요.

{http errorCode=-500, mErrorMsg=Hostname yanchen.blog.csdn.net not verified:
    certificate: sha256/tlnf6pbfeu257hnJ9e6j4A1ZWH3vVMzn3Zn3F9kLHdg=
    DN: CN=*.blog.csdn.net
    subjectAltNames: [*.blog.csdn.net]}

vertify가 실행되는 장소는 다음과 같다.실제 연결내부, 실행 후.
여기에 이미지 설명을 삽입하세요.

커스터마이징 외에도hostnameVerfier또한 Okhttp는 기본 구현을 제공합니다. 이제 내부 원칙을 분석해 보겠습니다.

핵심 원칙

OkHostnameVerifier는 Okhttp에 내장되어 있으며 이 메서드는session.peerCertificates[0] as X509Certificate인증서 객체 가져오기

override fun verify(host: String, session: SSLSession): Boolean {
    return try {
      verify(host, session.peerCertificates[0] as X509Certificate)
    } catch (_: SSLException) {
      false
    }
  }

fun verify(host: String, certificate: X509Certificate): Boolean {
    return when {
      host.canParseAsIpAddress() -