내 코드에 javax.net.ssl.X509TrustManager
을 구현 했으므로 소프트웨어에 액세스하는 자체 서명 된 인증서를 확인할 수 있습니다. 그러나 여전히 다른 "표준"웹 사이트 SSL 인증서의 유효성을 검사해야합니다. 나는 이것을 수행하기 위해 CertPathValidator.validate()
을 사용하고 있지만, 나는 (maps.googleapis.com에 대해) 전달되는 하나의 인증서 체인이 실제로 완전한 체인을 포함하고 있지 않다는 사실을 깨달았다. 전체 체인을 포함하지만 루트 CA (Equifax), 전화에 존재하지만 validate()
은 분명히 체인에 명시 적으로 없기 때문에 여전히 실패합니다. 유효성 검사가 성공할 수 있도록 여기에 무엇을 놓치고 있습니까? 모든 입력에 감사드립니다.안드로이드 매뉴얼 X509 인증서 체인 유효성 확인
편집 - 관련 코드 (제외 제거 검사) :
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// chain is of type X509Certificate[]
CertPath cp = cf.generateCertPath(Arrays.asList(chain));
CertPathValidator cpv = CertPathValidator.getInstance(CertPathValidator.getDefaultType());
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream is = new FileInputStream("/system/etc/security/cacerts.bks");
ks.load(is, null);
PKIXParameters params = new PKIXParameters(ks);
CertPathValidatorResult cpvr = cpv.validate(cp, params);
더 자세히 설명해 드리겠습니다 : ** validate()'호출에서'CertPathValidatorException'을 얻었습니다. ** org.bouncycastle.jce.exception.ExtCertPathValidatorException : 발급자 "OU = Equifax Secure Certificate Authority"에 대한 CRL이 없습니다. , O = Equifax, C = 미국 "** – Conrad