2017-11-03 11 views
0

이 Java 프로젝트에서 공급자 SunMSCAPI를 사용하여 Windows 키 저장소에서 개인 키를로드해야하지만 암호를 전혀 제공하지 않습니다. 내가 그렇게해야하는지 모르겠다. 이 내가 뭘하는지의 샘플 테스트 케이스이다 :이 프로그램을 실행할 때Java 키 저장소를 사용하여 Windows 저장소에서 개인 키를로드하는 방법

public static void main(String[] args) throws Throwable { 
    Provider provider = Security.getProvider("SunMSCAPI"); 
    KeyStore wins=KeyStore.getInstance("Windows-MY", provider); 
    wins.load(null, null); 
    Enumeration<String> aliases = wins.aliases(); 
    while (aliases.hasMoreElements()) { 
     String alias = (String) aliases.nextElement(); 
     System.out.println(alias); 
     Certificate[] chain = wins.getCertificateChain(alias); 
     X509Certificate[] x509 = CERManager.toX509(chain); 
     for (int i = 0; i < x509.length; i++) { 
      System.out.println(x509[i].getSubjectX500Principal()); 
     } 
     Key key = wins.getKey(alias, "1234".toCharArray()); 
     System.out.println(key); 

    } 

} 

은 내가 Adobe Reader를 사용하여 PFX 파일에서 이전에 가져온 몇 가지 인증서를 얻을,하지만 난 해당하는 개인 키를 얻을 수 없다 그 증명서 대신에, 나는 단지 null을 얻는다.

이 문제와 관련된 도움이 필요합니까? 미리 감사드립니다

답변

0

나는 내 문제를 해결 한 해결책을 찾았다 고 생각합니다. 나는 코드

private static void importPFX(File pfxFile, char pass[]) throws Exception { 
    SunMSCAPI providerMSCAPI = new SunMSCAPI(); 
    Security.addProvider(providerMSCAPI); 
    KeyStore wins=KeyStore.getInstance("Windows-MY", providerMSCAPI); 
    wins.load(null, null); 
    BouncyCastleProvider bcp = new BouncyCastleProvider(); 
    Security.addProvider(bcp); 
    KeyStore pfx = KeyStore.getInstance("PKCS12","BC"); 
    pfx.load(new FileInputStream(pfxFile), pass); 

    Enumeration<String> aliases = pfx.aliases(); 
    while (aliases.hasMoreElements()) { 
     String alias = (String) aliases.nextElement(); 
     Certificate[] chain = pfx.getCertificateChain(alias); 
     X509Certificate x509[]=new X509Certificate[chain.length]; 
     for (int i = 0; i < chain.length; i++) { 
      x509[i]=(X509Certificate) chain[i]; 
     } 
     X500Name x500name = new JcaX509CertificateHolder(x509[0]).getSubject(); 
     RDN cn = x500name.getRDNs(BCStyle.CN)[0]; 

     String commonName = IETFUtils.valueToString(cn.getFirst().getValue()); 
     PrivateKey pkey = (PrivateKey) pfx.getKey(alias, pass); 
     System.out.println(pkey); 
     wins.setKeyEntry(commonName, pkey, "1234".toCharArray(), new X509Certificate[]{x509[0]}); 
     wins.store(null, null); 
    } 
} 

이 조각을 사용하여 Java에 PFX를 가져올 시도하고 난 Windows 키 스토어의 키와 인증서를 나열 질문에서 첫 번째 코드를 사용하고, 나는 개인 키 확인을 얻었다.

중요한 세부 정보, 인증서 및 개인 키를 가져올 때 전체 체인이 아닌 사용자 인증서 만 전달하면됩니다. 적어도 그것이 나를 위해 일한 유일한 방법입니다.