2011-11-29 2 views
5

내 코드에 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); 
+0

더 자세히 설명해 드리겠습니다 : ** validate()'호출에서'CertPathValidatorException'을 얻었습니다. ** org.bouncycastle.jce.exception.ExtCertPathValidatorException : 발급자 "OU = Equifax Secure Certificate Authority"에 대한 CRL이 없습니다. , O = Equifax, C = 미국 "** – Conrad

답변

2

구현 자신의 TrustManager은 일반적으로 좋은 생각입니다. 더 좋은 방법은 인증서를 키 스토어에 추가하고이를 신뢰 저장소로 추가하는 것입니다. 수행 방법의 예는 this을 참조하십시오.

아마도 기본 신뢰 저장소를 유효성 검사기에 추가해야 할 것입니다. 또한 Android는 기본적으로 해지 (CRL) 확인을하지 않으므로 사용 설정 한 경우 관련 CRL을 수동으로 가져와야합니다. 코드를 게시하십시오.

+0

링크를 제공해 주셔서 감사합니다. – Conrad

+0

이것은 올바른 대답 인 것처럼 보입니다. 그러나'DefaultHttpClient'를 호출하는 제 3 자 라이브러리를 사용하고 있으며 다시 컴파일하려고하지 않으므로 maps.googleapis.com에 대한 호출이 안전하지 않게됩니다. 이 점. 포인터 주셔서 감사. – Conrad

+0

@Nikolay, "자신 만의 TrustManager를 구현하는 것은 일반적으로 좋지 않습니다." 동의합니다. 그러나 인증서를 CRL로 확인해야합니다. 안드로이드는 그렇지 않습니다. 어떻게 해결할 수 있을까요? –