프로그래머의 관점에서 보면 X.509 인증서의 유효성을 검사하는 데 몇 가지 사항이 필요합니다.
- 신뢰할 수있는 CA의 루트 인증서 인 "신뢰할 수있는 앵커"— 집합입니다. 공격자가 CA 인증서를 자신의 위조품으로 바꾸지 못하도록 변조를 방지해야합니다. 이 인증서의 공개 키는 다른 인증서의 디지털 서명을 확인하는 데 사용됩니다.
- 중간 인증서 모음입니다. 응용 프로그램은 이러한 컬렉션을 유지할 수 있지만 인증서를 사용하는 SSL 및 S/MIME과 같은 대부분의 프로토콜은 추가 인증서를 제공하는 표준 방법을 제공합니다.이것들을 저장하는 데 특별한주의가 필요하지 않습니다. 그들의 무결성은 루트 CA의 서명으로 보호됩니다.
- 해지 정보. CA가 인증서를 발급 한 경우에도 개인 키가 공개되었거나 최종 엔터티가 자신의 ID를 변경했기 때문에 인증서가 일찍 취소되었을 수 있습니다. 예를 들어 한 사람이 작업을 전환하고 이전 회사 이름이있는 인증서를 해지합니다. OCSP와 같은 CRL 또는 웹 서비스를 사용하여 인증서 상태에 대한 업데이트를 얻을 수 있습니다.
이러한 입력을 사용할 수있는 경우 built-in PKIX support을 사용하여 인증서 경로를 구성하고 유효성을 검사 할 수 있습니다.
/* Givens. */
InputStream trustStoreInput = ...
char[] password = ...
List<X509Certificate> chain = ...
Collection<X509CRL> crls = ...
/* Construct a valid path. */
KeyStore anchors = KeyStore.getInstance(KeyStore.getDefaultType());
anchors.load(trustStoreInput, password);
X509CertSelector target = new X509CertSelector();
target.setCertificate(chain.get(0));
PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, target);
CertStoreParameters intermediates = new CollectionCertStoreParameters(chain)
params.addCertStore(CertStore.getInstance("Collection", intermediates));
CertStoreParameters revoked = new CollectionCertStoreParameters(crls);
params.addCertStore(CertStore.getInstance("Collection", revoked));
CertPathBuilder builder = CertPathBuilder.getInstance("PKIX");
/*
* If build() returns successfully, the certificate is valid. More details
* about the valid path can be obtained through the PKIXBuilderResult.
* If no valid path can be found, a CertPathBuilderException is thrown.
*/
PKIXBuilderResult r = (PKIXBuilderResult) builder.build(params);
중요한 점은 경로를 찾을 수없는 경우 그 이유에 대해 많은 정보를 얻지 못한다는 것입니다. 이것은 실망 스러울 수 있지만 디자인 상 그 방법입니다. 일반적으로 많은 잠재적 경로가 있습니다. 다른 이유로 인해 모두 실패하는 경우 경로 작성자는 이유를보고 할 대상을 어떻게 결정할 것입니까?
CA 개념에 대한 자세한 설명을 주셔서 감사합니다. 나는 그것을 지금 이해한다. 이제는 프로그래밍 레벨에 대한 세부 사항을 파악해야합니다. – Rob