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

226

Lors du développement d'un client de service Web 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 webservice est au .cerformat. Lorsque j'inspecte le fichier à l'aide d'un éditeur de texte, il a 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 à saisir de mot de passe!) Et l'utiliser pour m'authentifier auprès du webservice.

J'ai pu importer ce certificat dans un magasin de clés en supprimant d'abord la première et la dernière ligne, en les convertissant en nouvelles lignes Unix et en exécutant un décodage base64. Le fichier résultant peut être importé dans un magasin de clés (à l'aide de la keytoolcommande). Lorsque je répertorie les entrées dans le 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 qui est utilisé pour l'authentification ...

Une solution de contournement que j'ai trouvée consiste à importer le certificat dans IE et à l'exporter sous forme de .pfxfichier. 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 effectuent ces étapes chaque fois qu'ils reçoivent un nouveau certificat. Je voudrais donc charger le .cerfichier directement dans Java. Des pensées?

Informations supplémentaires: la société derrière le service Web m'a dit que le certificat devrait être demandé (en utilisant IE et le site Web) au PC et à l'utilisateur qui importerait le certificat plus tard.

Jan-Pieter
la source

Réponses:

317
  • 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 (comme le nom de l'entreprise, le pays, ...) qui est signée par une autorité de certification qui garantit que les propriétés attachées sont vraies.
  • .CERles fichiers sont des certificats et n'ont pas la clé privée. La clé privée est .PFX keystorenormalement fournie avec un fichier. Si vous vous authentifiez vraiment, c'est parce que vous avez déjà importé la clé privée.
  • Vous pouvez normalement importer des .CERcertificats sans aucun problème avec

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
lujop
la source
3
Il s'avère que la clé privée est générée par un plugin pour IE. La seule solution pour l'instant est d'importer le certificat dans IE et d'exporter un fichier .pfx.
Jan-Pieter
5
Les fichiers .CER ont la clé publique. Ils n'ont pas la clé privée. Suggérer une modification ..
KyleM
6
Que fait -alias ici?
hop
5
:( -> erreur keytool: java.lang.Exception: ne pas entrer un certificat X.509
nécromancien
1
@hop Un magasin de clés java peut avoir plusieurs certificats chacun avec un alias différent pour l'identifier. Vous pouvez l'utiliser comme référence pour l'identifier et / ou le récupérer par programme par nom d'alias.
lujop
85

L'importation du .cerfichier de certificat téléchargé à partir du navigateur (ouvrez l'URL et fouillez pour plus de détails) dans le magasin de clés de cacerts ajava_home\jre\lib\security fonctionné pour moi, par opposition aux tentatives de générer et d'utiliser mon propre magasin de clés.

  1. Allez à votre java_home\jre\lib\security
  2. ( Windows ) Ouvrez la ligne de commande admin à l'aide de cmdet CTRL+ SHIFT+ENTER
  3. Exécutez keytool pour importer le certificat:
    • (Remplacer yourAliasNameet path\to\certificate.cerrespectivement)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

De cette façon, vous n'avez pas besoin de spécifier d'options JVM supplémentaires et le certificat doit être reconnu par le JRE.

jediz
la source
chemin \ vers \ cert. Si mon fichier se trouve sur le bureau, comment puis-je le suivre? C: / user / desktop / ou ../../../../desktop/filename
Jesse
sous MacOS / Linux, cette commande fonctionne avec sudo. Merci. mais qu'est-ce que noprompt param? Je ne l'ai pas utilisé et j'ai quand même réussi.
Evgeniy Mishustin
Notez que lorsque vous utilisez le JDK pour le développement, le chemin correct est java_home\jdk_x.xx\jre\lib\security Pour un chemin absolu, utilisez une barre oblique inverse, par exemple, les "C:\myCert.crt"guillemets sont facultatifs si le chemin ne contient pas d'espaces.
jp-jee
Merci un million de fois.
vikingsteve
Question: qu'en est-il de la clé privée? La discussion porte sur les certificats clients. Ma compréhension est que l'on a besoin de créer un CSR avec une clé privée, puis de recevoir un certificat client de la société de site Web distant, puis de faire correspondre le certificat client à la clé privée. Votre réponse ne semble rien mentionner sur la clé privée. Je ne faisais que demander.
user2367418
51

Voici le code que j'ai utilisé pour importer par programme des 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);
}
Patrick M
la source
20

Vous ne devriez pas avoir à apporter de modifications au certificat. Êtes-vous sûr d'exécuter 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-----
dogbane
la source
2
Lorsque j'essaie d'importer le certificat non modifié dans le magasin de clés, j'obtiens l'erreur "erreur keytool: java.lang.Exception: ne saisissez pas un certificat X.509". Après avoir modifié le certificat de la manière décrite dans mon article, je suis capable d'importer le certificat sans erreur avec une commande similaire à la vôtre. Cependant, il est importé en tant que trustedCertEntry et n'est pas utilisé lors de l'accès au service Web.
Jan-Pieter
Pouvez-vous s'il vous plaît ajouter la commande l'exception à la question? Êtes-vous sûr de spécifier un alias dans votre commande d'importation?
Dogbane
N'oubliez pas d'exécuter cmd en tant qu'administrateur si vous utilisez Windows
SilentBob470
9

Un outil GUI open source est disponible sur keystore-explorer.org

Explorateur KeyStore

KeyStore Explorer est un remplacement d'interface graphique open source pour 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

entrez la description de l'image ici

Et aller Examineet Examine a URLoption, puis donner l'URL Web que vous souhaitez importer.

La fenêtre de résultat sera comme ci-dessous si vous donnez un lien vers le site google. entrez la description de l'image ici

C'est l'un des cas d'utilisation et le reste appartient à l'utilisateur (tous les crédits vont au keystore-explorer.org )

Shantha Kumara
la source
7

Le certificat que vous avez 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.

Mais si vous devez également effectuer l'authentification client avec SSL, vous devez obtenir votre propre certificat pour authentifier votre client de service Web. Pour cela, vous devez créer une demande de certificat; le processus consiste à créer votre propre clé privée et la clé publique correspondante et à attacher cette clé publique ainsi que certaines de vos informations (e-mail, nom, nom de domaine, etc.) à un fichier appelé la demande de certificat. Ensuite, vous envoyez cette demande de certificat à l'entreprise qui vous l'a déjà demandée, et ils créeront votre certificat, en signant votre clé publique avec leur clé privée, et ils vous renverront un fichier X509 avec votre certificat, que vous pouvez ajoutez maintenant à votre fichier de clés et vous serez prêt à vous connecter à un service Web en 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 à l'entreprise 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).

Chochos
la source
5

Voici un script que j'ai utilisé pour importer par lots un tas de fichiers crt dans le répertoire actuel dans le magasin de clés java. Enregistrez-le simplement dans le même dossier que votre certificat et exécutez-le comme suit:

./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
Brad Parks
la source
1

Voici comment cela a fonctionné pour moi:

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

    ----- BEGIN CERTIFICATE ----- [données sérialisées par Microsoft] ----- END CERTIFICATE -----

  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 Importer le .txt à l'étape 1
  3. Sélectionnez et exportez ce certificat au format encodé en Base-64. Enregistrez-le sous .cer
  4. Vous pouvez maintenant utiliser keytool ou Portecle pour l'importer dans votre magasin de clés java
code4kix
la source