Je travaille sur une ancienne IBM iSeries (IBM-i, i5OS, AS / 400, etc.), avec une machine virtuelle Java Java 5 (Classic, pas JTI J9) sur la version O / S V5R3M0.
Voici la scénario en un mot: p>
Tout cela a fonctionné comme prévu. P>
Cependant, quand je courais la machine virtuelle Java, correctement configuré pour pointer vers la boutique et lui fournir son mot de passe (que je l'ai fait dans le passé avec l'auto certificats signé: créés dans Portecle pour les tests), et essayez de démarrer mon serveur web sur 443, je reçois l'exception de sécurité suivant: p>
java.security.KeyStoreException: Cannot store non-PrivateKeys
3 Réponses :
Le « Impossible de stocker non-PrivateKeys » message d'erreur indique généralement que vous essayez d'utiliser des clés symétriques secrètes avec un JKS de type keystore. Le JKS de type ne supporte que les clés asymétriques (public / privé). Vous devez créer un nouveau fichier de clés de type JCEKS pour soutenir les clés secrètes. P>
Merci oui. Le mystère était pourquoi i> créer une prise SSL essayait d'ajouter toutes les clés i> au magasin de clés. Il s'avère que j'essayais d'ajouter une clé nulle à un magasin de clés - Détail est dans ma réponse de soi à cette question.
Comme il s'avère, c'était un problème subtil, et cela vaut la peine de donner la réponse ici au cas où quelqu'un d'autre ait quelque chose de similaire.
La réponse TLDR est que je n'ai pas vérifié que ma clé et ma certificat n'étaient pas nulles et En conséquence, a tenté d'ajouter une clé nulle et un certificat à un magasin de clés. La réponse la plus longue suit. P>
La manière dont nous avons notre serveur Web configuré pour utiliser SSL, spécifiquement pour prendre en charge la configuration typique de notre utilisateur où l'adresse IP est utilisée pour configurer l'adresse d'écoute du site Web plutôt qu'un nom DNS. , est-ce qu'il localise le certificat dans le magasin de clés maître à l'aide de l'alias et crée un magasin de clé-clés éphémère contenant uniquement le certificat de ce site Web, en utilisant ce magasin de clé pour configurer un contexte SSL et une prise SSL Factory, comme Donc: P>
// CREATE EPHEMERAL KEYSTORE FOR THIS SOCKET USING THE DESIRED CERTIFICATE try { final char[] BLANK_PWD=new char[0]; SSLContext ctx=SSLContext.getInstance("TLS"); KeyManagerFactory kmf=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); Key ctfkey=mstkst.getKey(svrctfals,BLANK_PWD); Certificate[] ctfchn=mstkst.getCertificateChain(svrctfals); KeyStore sktkst; if(ctfkey==null) { throw new IOException("Cannot create server socket factory: No key found for alias '"+svrctfals+"'"); } if(ctfchn==null || ctfchn.length==0) { throw new IOException("Cannot create server socket factory: No certificate found for alias '"+svrctfals+"'"); } sktkst=KeyStore.getInstance("jks"); sktkst.load(null,BLANK_PWD); sktkst.setKeyEntry(svrctfals,ctfkey,BLANK_PWD,ctfchn); kmf.init(sktkst,BLANK_PWD); ctx.init(kmf.getKeyManagers(),null,null); ssf=ctx.getServerSocketFactory(); } catch(java.security.GeneralSecurityException thr) { throw new IOException("Cannot create server socket factory using ephemeral keystore ("+thr+")",thr); }
Au lieu d'utiliser un keystore éphémère, vous pouvez tout gérer dans un seul Vous auriez besoin de votre initialiser De cette façon, vous ne seriez pas à vous soucier de copier la clé privée d'un keystore à l'autre, et cela même pour les types de travaux keystore à partir de laquelle vous ne pouvez pas extraire (et donc copier) mais seulement utiliser la clé privée , par exemple PKCS # 11. P> SSLContext code>. P>
SSLContext code> en utilisant une commande
X509KeyManager code>
au lieu d'utiliser celle donnée par la valeur par défaut KeyManagerFactory code>. Dans ce
X509KeyManager code>,
chooseServerAlias (String keyType, les émetteurs, châsse principaux []) code> doit retourner un alias différents en fonction de l'adresse locale obtenue à partir de la douille. P>
Merci; Je vais regarder dans ça.