2011-03-29 5 views
8

X.509 스마트 카드 인증서에서 하나 이상의 중간 CA를 통해 루트 CA에 이르기까지 Windows에서 인증서 체인을 구축해야합니다. CA 인증서가 JKS 키 저장소에있는 경우는 간단하지만 Windows 키 저장소를 사용해야합니다.Windows 키 스토어에서 중간 CA에 Java 액세스가 가능합니까?

"Windows-ROOT"에서 루트 CA 인증서를 얻을 수 있지만 "중간 인증 기관"키 저장소에 연결할 수 없습니다.

누구에게이 작업을 수행 했습니까?

감사합니다.

답변

8

SunMSCAPI 암호화 공급자는 Windows-MY (개인 인증서 저장소)과 Windows-ROOT (신뢰할 수있는 기관 인증서 저장소)의 두 가지 키 저장소 만 지원하므로 다른 Windows 인증서 저장소에 직접 액세스 할 수 있다고 생각하지 않습니다. 그러나 Windows-MY 키 스토어가 다른 상점의 인증서로 인증서 체인을 구축 할 수 있기 때문에 필요하지 않을 수 있습니다. 중간 CA에서 CA를 추가 한 후

KeyStore ks = KeyStore.getInstance("Windows-MY"); 
ks.load(null, null) ; 
Enumeration en = ks.aliases() ; 
while (en.hasMoreElements()) { 
    String aliasKey = (String)en.nextElement() ; 
    Certificate c = ks.getCertificate(aliasKey) ; 
    System.out.println("---> alias : " + aliasKey) ; 
    if (ks.isKeyEntry(aliasKey)) { 
     Certificate[] chain = ks.getCertificateChain(aliasKey); 
     System.out.println("---> chain length: " + chain.length); 
     for (Certificate cert: chain) { 
      System.out.println(cert); 
    } 
} 

나는 체인의 길이가 1 인 개인 인증서 저장소에서 개인 키와 하나의 인증서를 추가하는 경우 : 여기

내가 그것을 테스트하는 데 사용하는 코드입니다 인증서 저장소의 I 프로그램을 한 번 실행하고 체인의 길이가 지금 2

UPDATE이다 (, 2 에이프릴) 이 프로그램 몇 가지 제한과 Windows-MYWindows-ROOT 키 저장소에 인증서를 추가 할 수 있습니다 :

  • 사용자가 모든 인증서가 Windows-MY 스토어에서 추가 확인
  • 를 입력하라는 메시지가있는 Windows-ROOT에 인증서를 추가, TrustedCertificateEntry (보기보기의 키 스토어의 관점에서가 아니라 윈도우 점)입니다. 키 저장소는 사용 가능한 모든 인증서로 가능한 가장 긴 체인을 만드는 것으로 보입니다.
  • 개인 키가없는 인증서는 Windows 인증서 저장소 브라우저에 표시되지 않지만 프로그래밍 방식으로 삭제할 수 있습니다. 키 저장소에 인증서를 추가

간단하다 :

Certificate c = CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream("C:/Users/me/Downloads/myca.crt")); 
KeyStore.TrustedCertificateEntry entry = new KeyStore.TrustedCertificateEntry(c); 
ks.setEntry("CA1", entry , null); 
+0

예, 사용자의 인증서가 개인 상점에있는 경우 문제가 없습니다. 프로그래밍 방식으로 추가 할 수 있을지 궁금해합니다. – Mermeister

+0

예 가능합니다. 내 대답을 더 자세하게 업데이트합니다. – Jcs

+0

그게 효과가! 스마트 카드에서 내 사용자의 인증서를 검색하고 프로그래밍 방식으로 Windows-MY 저장소에 추가 한 다음 Windows 키 저장소를 사용하여 체인을 작성합니다. – Mermeister

1

JCS는 대답을했다,하지만 난 그렇게 약간의 의사 표시하려면 :

// load the Windows keystore 
KeyStore winKeystore = KeyStore.getInstance("Windows-MY", "SunMSCAPI"); 
winKeystore.load(null, null); 

// add the user's smart card cert to the keystore 
winKeystore.setCertificateEntry(myAlias, userCertificate); 

// build the cert chain! this will include intermediate CAs 
Certificate[] chain = winKeystore.getCertificateChain(myAlias); 

윈도우 인증서 체인이 확인되지 않습니다 하지만 이제는 CertPath 및 PKIXParameters를 만들고이를 사용하여 체인의 유효성을 검사하는 일반적인 작업을 수행 할 수 있습니다.

CertPathValidator certPathValidator = CertPathValidator.getInstance(CertPathValidator.getDefaultType()); 
certPathValidator.validate(certPath, params); 
관련 문제