web-dev-qa-db-fra.com

java.lang.Exception: les clés publiques de la réponse et du magasin de clés ne correspondent pas

Je dois accéder à un service Web hébergé sur le port 443. Le fournisseur de services a partagé trois certificats avec nous.

  1. ABCD.cer
  2. CA_Certificate.cer
  3. CCA_Certificate.cer

Je dois les ajouter au fichier de clés en créant une chaîne de formulaire pour la communication SSL. J'ai suivi les étapes ci-dessous.

  1. keytool -keystore npci_keystore_test.jks -genkey -alias npci_client_testore 

       Result :- keystore npci_keystore_test.jks created.
    
  2. keytool -import -keystore npci_keystore_test.jks -file CA_Certificate.cer -alias theCARoot

       Result :- certificate CA_Certificate.cer is added to keystore.
    
  3. keytool -import -keystore npci_keystore_test.jks -file CCA_Certificate.cer -alias theCCARoot

       Result :- certificate CCA_Certificate.cer is added to keystore.
    
  4. keytool -import -keystore npci_keystore_test.jks -file ABCD.cer -alias npci_client_testore

    À l'étape 4, j'ai une exception ci-dessous

    Entrez le mot de passe du magasin de clés: (et lorsque j'entre un mot de passe, j'ai l'exception ci-dessous)

    Erreur keytool: Java.lang.Exception: les clés publiques de réponse et de magasin de clés ne correspondent pas

J'ai déjà fait des recherches dans SO, mais jusqu'à présent pas de chance.

Je suis ci-dessous source pour créer le magasin et importer le certificat en elle . JKS Keystore

MODIFIER:---

Je l'ai testé en modifiant l'ordre d'importation du certificat, mais pas de chance jusqu'à présent.

10
RE350

Le lien dans votre question explique comment créer un magasin de clés SSL pour un serveur, ce que vous ne souhaitez pas faire. Ce que tu as fait était:

  1. Créer une nouvelle paire de clés
  2. Ajouter un certificat de confiance au magasin de clés
  3. Ajouter un autre certificat de confiance au magasin de clés
  4. Essayez d'importer le certificat SSL du serveur en tant que certificat pour votre paire de clés.

L'étape 4 échoue car le certificat SSL a été généré pour une paire de clés complètement différente.

Les trois certificats sont probablement: 

  1. Le certificat SSL du webservice
  2. Le certificat de l'autorité de certification qui a signé le certificat SSL
  3. Le certificat racine qui a signé l'autorité de certification

Vous devez maintenant ajouter une ancre de confiance à votre fichier de clés certifiées (par défaut: ${Java_HOME}/jre/lib/security/cacerts), afin que votre client accepte le certificat SSL du service Web. 

Habituellement, le serveur SSL envoie toute la chaîne, à l'exception du certificat racine, au client lors de l'établissement de la liaison SSL. Cela signifie que vous devez ajouter le certificat racine à votre magasin de clés de confiance:

keytool -import -keystore ${Java_HOME}/jre/lib/security/cacerts -file CCA_Certificate.cer -alias theCCARoot

Des étapes supplémentaires sont nécessaires si le service Web requiert l’authentification du client SSL, mais que vous n’avez jamais mentionné l’authentification du client, je suppose donc que ce n’est pas nécessaire. 

14
Omikron

Le problème ici est l’alias que vous avez utilisé lors de l’importation du certificat, qui est similaire à celui que vous avez utilisé lors de la création du magasin JKS. Il suffit de changer le pseudonyme et cela résoudra votre problème. Le document source [1] doit être corrigé en conséquence.

[1] http://docs.Oracle.com/cd/E19509-01/820-3503/ggfgo/index.html

26
Ravindra Ranwala

Au point 4 (où vous obtenez une erreur: erreur keytool: Java.lang.Exception: les clés publiques en réponse et le magasin de clés ne correspondent pas ) où vous importez le certificat, modifiez l'alias. L'alias ne doit pas être npci_client_testore car il est déjà utilisé pour l'alias du magasin de clés.

4
Rishi Raj Tandon

Dans mon cas, le "certificat racine ayant signé l'autorité de certification" était absent de la chaîne. Vérifiez si vous disposez du certificat approprié de l'autorité de certification ROOT, sinon exportez-le à partir de l'intermédiaire et importez-le dans le magasin de clés. en important l'autorité de certification racine dans mon magasin de clés a fonctionné pour moi.

3
azhar buttar

cela a fonctionné pour moi

keytool -keystore votre nom de système -importcert -alias certificatealiasname -file certificatename.cer

0
guest98

J'ai eu la même erreur d'exception (le fichier de clés ne correspond pas) lors de l'hébergement avec Tomcat8. Si vous avez entré un wrong domain name ou no domain name lors de la création de votre magasin de clés, vous devrez recréer votre fichier de magasin de clés à nouveau et soumettre à nouveau votre CSR à votre autorité de certification (CA) autorisée/reconnue/approuvée pour émettre des certificats de signature numérique Cas). 

Voici les commandes permettant de créer un fichier de clés: 

keytool -keysize 2048 -genkey -alias Tomcat -keyalg RSA -keystore Tomcat.keystore
keytool -importkeystore -srckeystore Tomcat.keystore -destkeystore Tomcat.keystore -deststoretype pkcs12

(Vous devez entrez le nom de domaine lorsque l'invite vous demande un prénom et un nom, il demande le nom de domaine complet (FDQN), par exemple www.example.com). De la ville, de l'état et de la province - do not abbreviate

Entrez la commande suivante pour créer la CSR (à partir du même répertoire que votre emplacement Tomcat.keystore): 

keytool -certreq -keyalg RSA -alias Tomcat -file myFQDN.csr -keystore Tomcat.keystore

Remarque: en raison de mon erreur précédente, j'ai dû supprimer tous mes certificats Godaddy de ma console Windows ( MMC ). 

Une fois que vos fichiers de certificat sont prêts de votre autorité de certification. Téléchargez les fichiers et double-cliquez sur chacun des 2 fichiers .crt pour les réinstaller à nouveau dans Windows (Choisissez l’installation automatique sur la machine locale). Assurez-vous de sauvegarder votre fichier Tomcat.keystore, puis importez ces fichiers de certificat dans l'ordre dans votre fichier Tomcat.keystore (à partir de zéro) dans le même ordre que dans l'exemple suivant:

keytool -import -alias root -keystore Tomcat.keystore -trustcacerts -file gdig2.crt.pem
keytool -import -alias intermed -keystore Tomcat.keystore -trustcacerts -file Gd_bundle-g2-g1.crt
keytool -import -alias Tomcat -keystore Tomcat.keystore -trustcacerts -file namewithnumbersandletters.crt

Assurez-vous d'avoir mis à jour votre fichier server.xml, puis redémarrez votre Tomcat. 

<Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="443" />  
    <Connector 
    URIEncoding="UTF-8"
    SSLEnabled="true" 
    clientAuth="false"
    keystoreFile="C:\Program Files\Java\jdk1.8.0_181\bin\Tomcat.keystore" 
    keystorePass="changeme" 
    maxThreads="200" 
    port="443" 
    scheme="https" 
    secure="true" 
    sslProtocol="TLS" />

Voilà! L'icône Verrouillé (Connexion sécurisée) apparaît lorsque vous naviguez sur le domaine. 

0
QA Specialist