2010-03-16 2 views
17

에서 bouncycastle wiki page X.509 루트 인증서 및 인증 요청을 작성하는 방법을 이해할 수 있었지만 개념을 진행하고 프로그래밍을 현명하게 수행하는 방법을 이해하지 못했습니다. .Java 및 Bouncycastle로 X.509 인증서 유효성 확인

당사자 A가 인증서 요청을 수행하고 CA로부터 클라이언트 인증서를 가져옵니다. 어떤 파티 B가 어떻게 A의 인증서를 검증 할 수 있습니까? 어떤 종류의 인증서가 필요합니까? 루트 인증서? '일반적인'클라이언트 인증서?

A가 B가 DER 또는 PEM 형식의 인증서를 성공적으로 보낸다고 가정하면 프로그래밍 수준에서 유효성 검사가 어떻게 작동합니까?

도움을 주시면 감사하겠습니다.

최고 감사합니다, 롭

다음과

답변

9

좋아, CA의 뒤에 아이디어가 될 때 :

  • CA의 사람들 모두가 신뢰입니다. 이를 위해 내 모바일에서도 브라우저/이메일 클라이언트/신뢰할 수있는 CA를 선택할 수 있습니다. 귀하의 경우 공개 루트 키 (인증서)가 귀하의 신청서에 있어야합니다.
  • 사용자는 공용 키로 PEM 형식의 인증서를 CA에 요청합니다. CA는 최종 사용자에게 돈을 청구하거나 향상된 확인 (녹색) 인증서, 백그라운드 확인의 경우와 같이 일부 (이 모호한 의도적으로) 최종 사용자의 확인 형식을 수행합니다.
  • CA가 사용자의 요청이 유효하다고 생각하지 않으면이 사실을 알립니다.
  • 그렇다면 공개 키에 서명하고이 정보가 포함 된 인증서를 생성합니다. 여기에서 cert-req를 처리하여 X.509 인증서로 변환합니다.
  • 다른 사용자는 우리 가상의 사용자를 발견하고 신뢰할 수 있는지 알고 싶어합니다. 따라서 인증서를보고 신뢰 목록에있는 사람이 디지털로 서명했는지 확인합니다. 따라서 루트 CA 만 신뢰하고 루트 CA만이이 사용자의 공개 키에 서명 할 수 있고 CA는 사용자를 신뢰하므로 새로운 사용자가 mr 架사를 신뢰할 수 있음을 알 수 있습니다.

프로그래밍 방식에서는 X.509 인증서를 읽고 CA가 있어야하는 사람을 찾아서 구현합니다. CA의 지문이 주어지면 데이터베이스에서 찾아서 서명을 확인하십시오. 일치하면 신뢰의 사슬을가집니다.

내가 말했듯이 CA 만 디지털 서명을 만들 수 있지만 누구나 확인할 수 있기 때문에 이러한 방식으로 작동합니다. 이것은 암호화 개념의 반대입니다. 당신이 서명하는 데이터를 "개인 키로 암호화"하고 "공개 키로 해독"이 당신이 가진 데이터와 동일한 지 확인합니다.

+0

CA 개념에 대한 자세한 설명을 주셔서 감사합니다. 나는 그것을 지금 이해한다. 이제는 프로그래밍 레벨에 대한 세부 사항을 파악해야합니다. – Rob

28

프로그래머의 관점에서 보면 X.509 인증서의 유효성을 검사하는 데 몇 가지 사항이 필요합니다.

  1. 신뢰할 수있는 CA의 루트 인증서 인 "신뢰할 수있는 앵커"— 집합입니다. 공격자가 CA 인증서를 자신의 위조품으로 바꾸지 못하도록 변조를 방지해야합니다. 이 인증서의 공개 키는 다른 인증서의 디지털 서명을 확인하는 데 사용됩니다.
  2. 중간 인증서 모음입니다. 응용 프로그램은 이러한 컬렉션을 유지할 수 있지만 인증서를 사용하는 SSL 및 S/MIME과 같은 대부분의 프로토콜은 추가 인증서를 제공하는 표준 방법을 제공합니다.이것들을 저장하는 데 특별한주의가 필요하지 않습니다. 그들의 무결성은 루트 CA의 서명으로 보호됩니다.
  3. 해지 정보. 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); 

중요한 점은 경로를 찾을 수없는 경우 그 이유에 대해 많은 정보를 얻지 못한다는 것입니다. 이것은 실망 스러울 수 있지만 디자인 상 그 방법입니다. 일반적으로 많은 잠재적 경로가 있습니다. 다른 이유로 인해 모두 실패하는 경우 경로 작성자는 이유를보고 할 대상을 어떻게 결정할 것입니까?

+0

답변을 주셔서 감사합니다.하지만 자바 ME를 사용하고 있으므로 인증서의 유효성 검사에 bouncycastle (lightweight) -API를 의지해야합니다. 당신은 아이디어가 있습니까? 아니면 코드 스 니펫 (snippet)을 다시 사용 하시겠습니까? 고마워. – Rob

+0

이것은 매우 명확하지만 어쨌든 XMLSignature에서 List 체인을 찾을 수 없습니다. 심지어 xmldsig xml 문서에서 모든 인증서를 볼 수 있습니다. –

+0

@jaime - ['X509Data' ] (http://download.oracle.com/javase/6/docs/api/javax/xml/crypto/dsig/keyinfo/X509Data.html)을 참조하십시오. XML 서명 지원에 익숙하지 않아 문서에서이 객체를 어떻게 생성하는지 잘 모르겠습니다. – erickson

관련 문제