É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
Vous devez vous connecter pour publier un commentaire.
Votre code erreur 2:
première: Vous définissez pas de l'Émetteur du certificat (cert client doit être émis par une CA à faire de la chaîne).
deuxième: Vous utilisez le mauvais ordre lors de la création de la chaîne de certificat (qui devrait être client ferts, CA dernier)
est ici retravaillé SSCCE, et il fonctionne sans erreurs.
JKS
. Il s'avère que c'était de l'ordre! Ainsi, la commande est: endpointtrust d'ancrage dernier.En fonction de la JDK que vous utilisez, il y a différentes façon de package de votre application. Il nous arrive lorsque certaines personnes où l'utilisation de Linux et de l'OpenJDK et quelques autres à développer sur Windows avec SunJDK (Oracle).
Les dernières ont une configuration supplémentaire à faire pour être en mesure d'utiliser la plus forte des algorithmes. Cet article peut vous aider si votre problème est lié à l'entreprise criminelle commune Politique.