Économie de la chaîne de certificat dans un pkcs12 keystore

Le code suivant:

//used Bouncy Castle provider for keyStore
keyStore.setKeyEntry(alias, (Key)keyPair.getPrivate(), pwd, certChain);  

où certChain détient le certificat de fin et le certificat de l'émetteur (c'est à dire deux certificats),

ne pas enregistrer le certificat de l'émetteur dans le cadre de la chaîne de l'enregistrées dans le système de fichiers fichier de magasin de clés si le fichier de clés est une instance de PKCS12.

Il ne économiser de deux certificats si le type de magasin de clés est PKCS12-3DES-3DES.
Pourquoi est-ce? N'est pas un PKCS12 suppose à la fois des certificats font partie de la chaîne?

EDIT: Voici un SSCCE. Cela fonctionne bien avec "JKS", échoue avec "PKCS12": Seul le premier certificat de la chaîne est accessible via getCertificateChain(String). Le fichier peut être ouvert avec openssl pkcs12 révélant à la fois les certificats.

    public void testKeyStore() {
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
Certificate[] outChain = { createCertificate("CN=CA", publicKey, privateKey), createCertificate("CN=Client", publicKey, privateKey) };
KeyStore outStore = KeyStore.getInstance("PKCS12");
outStore.load(null, "secret".toCharArray());
outStore.setKeyEntry("mykey", privateKey, "secret".toCharArray(), outChain);            
OutputStream outputStream = new FileOutputStream("c:/outstore.pkcs12");
outStore.store(outputStream, "secret".toCharArray());
outputStream.flush();
outputStream.close();
KeyStore inStore = KeyStore.getInstance("PKCS12");      
inStore.load(new FileInputStream("c:/outstore.pkcs12"), "secret".toCharArray());
Key key = outStore.getKey("myKey", "secret".toCharArray());
assertEquals(privateKey, key);
Certificate[] inChain = outStore.getCertificateChain("mykey");
assertNotNull(inChain);
assertEquals(outChain.length, inChain.length);
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
private static X509Certificate createCertificate(String dn, PublicKey publicKey, PrivateKey privateKey) throws Exception {
X509V3CertificateGenerator certGenerator = new X509V3CertificateGenerator();
certGenerator.setSerialNumber(new BigInteger("1"));
certGenerator.setIssuerDN(new X509Name(dn));
certGenerator.setSubjectDN(new X509Name(dn));
certGenerator.setNotBefore(Calendar.getInstance().getTime());
certGenerator.setNotAfter(Calendar.getInstance().getTime());
certGenerator.setPublicKey(publicKey);
certGenerator.setSignatureAlgorithm("SHA1withRSA");
X509Certificate certificate = (X509Certificate)certGenerator.generate(privateKey, "BC");
return certificate;
}
  • OOI, ne PKCS12 type de magasin de clés à partir d'Oracle (SunJSSE fournisseur) présentent les mêmes symptômes? Si non, alors ce pourrait être une bonne question pour le BC liste de diffusion.
  • demandé ce en colombie-britannique liste de diffusion et n'a pas obtenu de réponse depuis plus d'une semaine
  • PKCS#12 ne suppose pas que tout ce que c'est un conteneur pour un certain nombre de certificats et de leurs clés privées. C'est donc la mise en œuvre spécifique de ce qui va être mis à PKCS#12 conteneur.
  • tout ce que je suis en train de faire est de mettre la chaîne dans le cadre de l'entrée de clé.Ce n'est sûrement pas quelque chose qui ne serait pas pris en charge pour une raison quelconque
  • en tant que développeur de la bibliothèque (pas lié à BouncyCastle) j'ai un point de vue différent. Dans nos produits que vous spécifiez explicitement est ce que vous obtenez dans PKCS#12. Il y a des raccourcis à l'accaparement de l'ensemble de la chaîne, mais les raccourcis doivent être explicitement utilisés ainsi.
  • le mettre différemment ensuite.PKCS12-3DES-3DES ne diffèrent pas seulement dans le schéma de chiffrement?Alors, pourquoi est le comportement différent pour qui?
  • Windows (dans les versions antérieures comme d'origine XP) n'a pas le soutien des algorithmes forts comme 3DES dans PKCS#12. Cela peut être lié. Mais vous devriez demander à BouncyCrypto auteurs, pas moi.
  • Quel JDK utilisez-vous? OpenJDK ou Sun JDK ou un autre?
  • distribution

InformationsquelleAutor Cratylus | 2012-11-03