304 votes

Comment importer un certificat .cer dans un keystore java ?

Au cours du développement d'un client de service Web Java, j'ai rencontré un problème. L'authentification pour le webservice 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 en format .cer format. Lorsque j'inspecte le fichier à l'aide d'un éditeur de texte, il présente 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 un mot de passe !) et l'utiliser pour m'authentifier auprès du webservice.

J'ai pu importer ce certificat dans un keystore 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 keystore (à l'aide de la commande keytool ). Lorsque je liste les entrées dans le keystore, cette entrée est du type trustedCertEntry . A cause de ce type d'entrée ( ?) je ne peux pas utiliser ce certificat pour m'authentifier avec le webservice. 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 la forme d'un fichier de type .pfx fichier. Ce fichier peut être chargé en tant que keystore et peut être utilisé pour s'authentifier avec le webservice. Cependant, je ne peux pas demander à mes clients d'effectuer ces étapes chaque fois qu'ils reçoivent un nouveau certificat. J'aimerais donc charger le fichier .cer directement dans Java. Des idées ?

Info supplémentaire : la société derrière le webservice m'a dit que le certificat devrait être demandé (en utilisant IE et le site web) à partir du PC et de l'utilisateur qui importera le certificat plus tard.

431voto

lujop Points 3066
  • 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 la société, le pays, ...) qui est signée par une autorité de certification qui garantit que les propriétés jointes sont vraies.
  • .CER sont des certificats et n'ont pas la clé privée. La clé privée est fournie avec un .PFX keystore normalement. Si vous vous authentifiez vraiment, c'est parce que vous aviez déjà importé la clé privée.
  • Vous pouvez normalement importer .CER sans aucun problème avec

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

4 votes

Il s'avère que la clé privée est générée par un plugin pour IE. La seule solution pour le moment est d'importer le certificat dans IE et d'exporter un fichier .pfx.

5 votes

Les fichiers .CER ont la clé publique. Ils n'ont pas la clé privée. Suggérer l'édition..

1 votes

Vous avez raison, j'ai fait la réponse originale rapidement et je fais une faute de frappe et personne n'a argumenté jusqu'à vous. J'ai corrigé et ajouté quelques petites informations supplémentaires.

65voto

Patrick M Points 343

Voici le code que j'ai utilisé pour importer de manière programmée 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);
}

26voto

dogbane Points 85749

Vous ne devriez pas avoir à apporter de modifications au certificat. Etes-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-----

2 votes

Lorsque j'essaie d'importer le certificat non modifié dans le keystore, j'obtiens l'erreur "keytool error : java.lang.Exception : Input not an X.509 certificate". Après avoir modifié le certificat de la manière décrite dans mon post, je suis en mesure 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 webservice.

0 votes

Pouvez-vous ajouter la commande l'exception à la question ? Êtes-vous sûr de spécifier un alias dans votre commande d'importation ?

0 votes

N'oubliez pas d'exécuter cmd en tant qu'administrateur si vous utilisez Windows.

8voto

Chochos Points 3364

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, en plus, vous avez besoin d'effectuer une authentification du client avec SSL, vous devez obtenir votre propre certificat, pour authentifier le client de votre 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 (email, nom, nom de domaine, etc.) à un fichier appelé demande de certificat. Vous envoyez ensuite cette demande de certificat à l'entreprise qui vous l'a déjà demandée, qui créera votre certificat en signant votre clé publique avec sa clé privée, et vous renverra un fichier X509 avec votre certificat, que vous pouvez maintenant ajouter à votre base de données de clés, et vous serez prêt à vous connecter à un service Web utilisant SSL et nécessitant une authentification du client.

Pour générer votre demande de certificat, utilisez "keytool -certreq -alias -file -keypass -keystore". Envoyez le fichier obtenu à 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 keystore est protégé (ce qui est une bonne idée).

1voto

musiKk Points 6933

Je ne suis pas sûr que le certificat ait le bon format pour mon approche, mais peu importe : J'ai écrit une fois un entrée de blog sur ce type de problème. Peut-être cela vous sera-t-il utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X