2017-11-03 17 views
0

私はプロバイダSunMSCAPIを使用してWindows KeyStoreからプライベートキーをロードする必要があるこのJavaプロジェクトで作業していますが、パスワードをまったく提供しません。私はそうする必要があるかどうかわからない。 これは私がやっているのサンプルテストケースである:私はこれを実行するとJava KeyStoreを使用して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キーストアの鍵と証明書を一覧表示する質問から最初のコードを使用して、私は、秘密鍵OKを得ました。

重要な詳細は、証明書と秘密鍵をインポートするときに、チェーン全体ではなくユーザー証明書を渡すだけです。少なくともそれが私のために働いた唯一の方法です。

関連する問題