Java adgang til mellemliggende CA'er fra Windows keystores?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal opbygge en certifikatkæde på Windows, fra en X.509 smart card cert gennem en eller flere mellemliggende CA'er til en root CA. Det er nemt, når CA certs er i et JKS keystore, men jeg skal også bruge Windows keystores.


Jeg kan få root CA cert fra 'Windows-ROOT', men jeg kan ikke komme til 'Intermediate Certification Authorities' keystore.


Har nogen gjort dette?


Tak!

Bedste reference


Den SunMSCAPI kryptografiske udbyder understøtter kun to keystores: Windows-MY (personlig certifikatbutik) og Windows-ROOT (tillid til autoriseret certifikatbutik). Jeg mener derfor ikke, det er muligt at få direkte adgang til andre Windows-certifikatforretninger . Det kan dog ikke være nødvendigt, da det ser ud til, at Windows-MY keystore er i stand til at opbygge certifikatkæder med certifikaterne fra andre butikker.


Her er et kodestykke, jeg bruger til at teste det:


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);
    }
}


Hvis jeg tilføjer et enkelt certifikat med privat nøgle i personlig certifikatbutik, er kædelængden 1. Efter at have tilføjet CA i den mellemliggende CA-certifikatbutik lancerer jeg programmet en anden gang, og kædelængden er nu 2.


UPDATE (april, 2nd)
Det er muligt at programmere tilføje certifikater i Windows-MY og Windows-ROOT keystore med nogle begrænsninger:



  • Når du tilføjer et certifikat i Windows-ROOT, bliver brugeren bedt om bekræftelse

  • Alt certifikat, der er tilføjet i Windows-MY -tastaturet, er en TrustedCertificateEntry (fra hovedbutikens synsvinkel, ikke Windows-synspunktet). Keystore synes at bygge den længst mulige kæde med alle tilgængelige certifikater.

  • Certifikaterne uden tilknyttet privat nøgle er ikke synlige i Windows-certifikatbutikken, men det er muligt at programmere slette dem.



Tilføjelse af et certifikat i et keystore er retfærdigt:


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);

Andre referencer 1


Jcs havde svaret, men jeg vil gerne vise noget pseudokode så:


// 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);


Windows-certifikatkæder er ikke validerede, da de er bygget, men nu kan du gøre det sædvanlige ved at oprette en CertPath- og PKIXparametre og bruge dem til at validere kæden.


CertPathValidator certPathValidator = CertPathValidator.getInstance(CertPathValidator.getDefaultType());
certPathValidator.validate(certPath, params);