web-dev-qa-db-fra.com

Comment importer un certificat .cer dans un magasin de clés Java?

Lors du développement d'un client Webservice Java, j'ai rencontré un problème. L'authentification pour le service Web utilise un certificat client, un nom d'utilisateur et un mot de passe. Le certificat client que j'ai reçu de la société derrière le service Web est au format .cer. Lorsque j'inspecte le fichier à l'aide d'un éditeur de texte, il contient le contenu suivant:

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

Je peux importer ce fichier en tant que certificat dans Internet Explorer (sans avoir à entrer de mot de passe!) Et l'utiliser pour s'authentifier auprès du WebService.

J'ai été en mesure d'importer ce certificat dans un magasin de clés en supprimant d'abord les première et dernière lignes, en convertissant les nouvelles lignes unix et en exécutant un décodage en base64. Le fichier résultant peut être importé dans un fichier de clés (à l'aide de la commande keytool). Lorsque je liste les entrées du magasin de clés, cette entrée est du type trustedCertEntry. En raison de ce type d'entrée (?), Je ne peux pas utiliser ce certificat pour m'authentifier auprès du service Web. Je commence à penser que le certificat fourni est un certificat public utilisé pour l'authentification ...

Une solution de contournement que j'ai trouvée consiste à importer le certificat dans IE et à l'exporter sous la forme d'un fichier .pfx. Ce fichier peut être chargé en tant que fichier de clés et peut être utilisé pour s'authentifier auprès du service Web. Cependant, je ne peux pas m'attendre à ce que mes clients exécutent ces étapes chaque fois qu'ils reçoivent un nouveau certificat. Je voudrais donc charger le fichier .cer directement dans Java. Des pensées?

Informations supplémentaires: la société derrière le service Web m'a dit que le certificat devait être demandé (à l'aide de IE et du site Web) auprès du PC et de l'utilisateur qui importerait ultérieurement le certificat.

197
Jan-Pieter
  • Si vous voulez vous authentifier, vous avez besoin de la clé privée - il n'y a pas d'autre option.
  • Un certificat est une clé publique avec des propriétés supplémentaires (telles que le nom de la société, le pays, ...) signée par une autorité de certification garantissant que les propriétés attachées sont vraies.
  • Les fichiers .CER sont des certificats et ne possèdent pas de clé privée. La clé privée est normalement fournie avec un fichier .PFX keystore. Si vous vous authentifiez réellement, c'est que vous avez déjà importé la clé privée.
  • Vous pouvez normalement importer .CER certificats sans aucun problème avec

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
    
282
lujop

Importer le fichier de certificat .cer téléchargé depuis le navigateur (ouvrir l’URL et Dig pour plus de détails) dans cacerts le fichier de clés dans Java_home\jre\lib\security a fonctionné pour moi, par opposition à la tentative de générer et d’utiliser le mien magasin de clés.

  1. Allez dans votre Java_home\jre\lib\security
  2. ( Windows ) Ouvrez la ligne de commande de l'administrateur à l'aide de cmd et CTRL+SHIFT+ENTER
  3. Exécutez keytool pour importer le certificat:
    • (Remplacez yourAliasName et path\to\certificate.cer respectivement)
 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

De cette façon, vous n'avez pas à spécifier d'options supplémentaires pour la machine virtuelle Java et le certificat doit être reconnu par le JRE.

69
jediz

Voici le code que j'ai utilisé pour importer par programme les fichiers .cer dans un nouveau KeyStore.

import Java.io.BufferedInputStream;
import Java.io.IOException;
import Java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import Java.security.GeneralSecurityException;
import Java.security.KeyStore;
import Java.security.cert.Certificate;
import Java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}
48
Patrick M

Vous ne devriez pas avoir à modifier le certificat. Êtes-vous sûr que vous exécutez la bonne commande d'importation?

Ce qui suit fonctionne pour moi:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

où mycert.cer contient:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----
17
dogbane

Un outil graphique à code source ouvert est disponible sur keystore-Explorer.org

KeyStore Explorer

KeyStore Explorer est une interface graphique à source ouverte remplaçant les utilitaires de ligne de commande Java keytool et jarsigner. KeyStore Explorer présente leurs fonctionnalités, et plus encore, via une interface utilisateur graphique intuitive.

Les écrans suivants vous aideront (ils proviennent du site officiel)

Écran par défaut que vous obtenez en exécutant la commande:

shantha@shantha:~$./Downloads/kse-521/kse.sh

enter image description here

Et allez à l'option Examine et Examine a URL, puis indiquez l'URL Web que vous souhaitez importer.

La fenêtre de résultat sera comme ci-dessous si vous indiquez un lien vers un site Google. enter image description here

C'est un cas d'utilisation et le reste est à la charge de l'utilisateur (tous les crédits vont au keystore-Explorer.org )

8
Shantha Kumara

Le certificat que vous possédez déjà est probablement le certificat du serveur ou le certificat utilisé pour signer le certificat du serveur. Vous en aurez besoin pour que votre client de service Web puisse authentifier le serveur.

Toutefois, si vous devez en outre effectuer l'authentification du client avec SSL, vous devez vous procurer votre propre certificat pour authentifier votre client de service Web. Pour cela, vous devez créer une demande de certificat. le processus implique la création de votre propre clé privée et de la clé publique correspondante, et l'attachement de cette clé publique avec certaines de vos informations (courrier électronique, nom, nom de domaine, etc.) à un fichier appelé demande de certificat. Ensuite, vous envoyez cette demande de certificat à la société qui vous l'a déjà demandée. Cette dernière créera votre certificat en signant votre clé publique avec sa clé privée et vous renverra un fichier X509 avec votre certificat. Ajoutez maintenant à votre magasin de clés et vous serez prêt à vous connecter à un service Web utilisant SSL nécessitant une authentification client.

Pour générer votre demande de certificat, utilisez "keytool-certreq -alias -file -keypass -keystore". Envoyez le fichier résultant à la société qui va le signer.

Lorsque vous récupérez votre certificat, exécutez "keytool -importcert -alias -keypass -keystore".

Vous devrez peut-être utiliser -storepass dans les deux cas si le magasin de clés est protégé (ce qui est une bonne idée).

6
Chochos

Voici un script que j'ai utilisé pour importer par lots plusieurs fichiers crt du répertoire en cours dans le magasin de clés Java. Sauvegardez simplement ceci dans le même dossier que votre certificat et lancez-le comme ceci:

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/Java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_Java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_Java_keystore
else
  echo "This script needs to be run as root!"
fi
5
Brad Parks

Voici comment cela a fonctionné pour moi:

  1. Enregistrez sous .txt les données du certificat au format suivant dans un éditeur de texte

    ----- BEGIN CERTIFICATE ----- [données sérialisées par Microsoft] ----- CERTIFICAT DE FIN -----

  2. Ouvrez le navigateur chrome (cette étape peut également fonctionner avec d'autres navigateurs) paramètres> afficher les paramètres avancés> HTTPS/SSL> gérer les certificats Importez le fichier .txt à l'étape 1
  3. Sélectionnez et exportez ce certificat au format codé Base 64. Enregistrez-le sous .cer
  4. Vous pouvez maintenant utiliser keytool ou Portecle pour l'importer dans votre magasin de clés Java
1
code4kix