Hoe importeer ik een .cer-certificaat in een java-sleutelarchief?

Tijdens de ontwikkeling van een Java-webserviceclient liep ik tegen een probleem aan. Authenticatie voor de webservice maakt gebruik van een clientcertificaat, een gebruikersnaam en een wachtwoord. Het clientcertificaat dat ik heb ontvangen van het bedrijf achter de webservice heeft de indeling .cer. Als ik het bestand inspecteer met een teksteditor, heeft het de volgende inhoud:

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

Ik kan dit bestand als certificaat in Internet Explorer importeren (zonder een wachtwoord in te voeren!) en het gebruiken om te authenticeren bij de webservice.

Ik heb dit certificaat in een keystore kunnen importeren door eerst de eerste en laatste regel te strippen, te converteren naar unix newlines en een base64-decode uit te voeren. Het resulterende bestand kan worden geïmporteerd in een keystore (met behulp van de opdracht keytool). Als ik de vermeldingen in de keystore opsom, is deze vermelding van het type trustedCertEntry. Vanwege dit invoertype (?) kan ik dit certificaat niet gebruiken om te authenticeren bij de webservice. Ik begin te denken dat het geleverde certificaat een openbaar certificaat is dat wordt gebruikt voor authenticatie…

Een oplossing die ik heb gevonden is om het certificaat in IE te importeren en het te exporteren als een .pfx-bestand. Dit bestand kan als keystore worden geladen en kan worden gebruikt voor authenticatie bij de webservice. Ik kan echter niet van mijn klanten verwachten dat ze deze stappen telkens uitvoeren als ze een nieuw certificaat ontvangen. Dus ik zou het bestand .cerrechtstreeks in Java willen laden. Enig idee?

Aanvullende info: het bedrijf achter de webservice vertelde me dat het certificaat moest worden aangevraagd (met behulp van IE & de website) van de pc en de gebruiker die het certificaat later zou importeren.


Antwoord 1, autoriteit 100%

  • Als je je wilt authenticeren, heb je de privésleutel nodig – er is geen andere optie.
  • Een certificaat is een openbare sleutel met extra eigenschappen (zoals bedrijfsnaam, land,…) die is ondertekend door een certificeringsinstantie die garandeert dat de bijgevoegde eigenschappen waar zijn.
  • .cer-bestanden zijn certificaten en hebben geen privésleutel. De privésleutel wordt normaal gesproken geleverd met een .PFX keystore-bestand.
    Als je echt authenticeert, is dat omdat je de privésleutel al had geïmporteerd.
  • U kunt normaal gesproken zonder problemen .cer-certificaten importeren met

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

Antwoord 2, autoriteit 30%

Importeren van .cercertificaatbestand gedownload van browser (open de url en zoek naar details) in cacertskeystore in java_home\jre\lib\securitywerkte voor mij, in tegenstelling tot pogingen om mijn eigen keystore te genereren en te gebruiken.

  1. Ga naar uw java_home\jre\lib\security
  2. (Windows) Open daar de admin-opdrachtregel met cmden CTRL+SHIFT+ENTER
  3. Voer keytool uit om certificaat te importeren:
    • (Vervang respectievelijk yourAliasNameen path\to\certificate.cer)
..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

Op deze manier hoeft u geen extra JVM-opties op te geven en moet het certificaat worden herkend door de JRE.


Antwoord 3, Autoriteit 16%

Hier is de code die ik heb gebruikt voor het programmeerbaar importeren van .cer-bestanden in een nieuwe 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);
}

Antwoord 4, Autoriteit 6%

U hoeft geen wijzigingen in het certificaat te halen. Weet u zeker dat u de juiste importopdracht uitvoert?

De volgende werken voor mij:

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

waar MyCert.cer bevat:

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

Antwoord 5, Autoriteit 4%

Er is een open source GUI-tool beschikbaar op keystore-explorer.org

KeyStore Explorer

Keystore Explorer is een open source GUI-vervanging voor de Java
Opdrachtregelhulpprogramma’s Keytool en Jarsigner. Keystore Explorer
presenteert hun functionaliteit, en meer, via een intuïtief grafisch
gebruikersinterface.

Volgende schermen zullen helpen (ze zijn van de officiële site)

Standaardscherm die u krijgt door de opdracht uit te voeren:

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

en ga naar Examineen Examine a URL-optie en geef dan de web-URL die u wilt importeren.

Het resultaatvenster is hieronder zoals u Google Site Link geeft.

Dit is een van de gebruikscase en de rest is up-to the user (alle credits ga naar de KeyStore-Explorer.org )


Antwoord 6, Autoriteit 2%

Het certificaat dat u al hebt, is waarschijnlijk het certificaat van de server of het certificaat dat wordt gebruikt om het certificaat van de server te ondertekenen. U hebt het nodig, zodat uw webserviceclient de server kan verifiëren.

Maar als u daarnaast clientauthenticatie met SSL moet uitvoeren, dan moet u uw eigen certificaat aanschaffen om uw webserviceclient te authenticeren. Hiervoor dient u een certificaataanvraag aan te maken; het proces omvat het maken van uw eigen privésleutel en de bijbehorende openbare sleutel, en het toevoegen van die openbare sleutel samen met een deel van uw informatie (e-mail, naam, domeinnaam, enz.) aan een bestand dat de certificaataanvraag wordt genoemd. Vervolgens stuurt u dat certificaatverzoek naar het bedrijf dat u er al om heeft gevraagd, en zij zullen uw certificaat maken door uw openbare sleutel te ondertekenen met hun privésleutel, en zij zullen u een X509-bestand terugsturen met uw certificaat, dat u kunt voeg nu toe aan uw keystore en u bent klaar om verbinding te maken met een webservice die SSL gebruikt waarvoor clientverificatie is vereist.

Gebruik “keytool -certreq -alias -file -keypass -keystore” om uw certificaataanvraag te genereren. Stuur het resulterende bestand naar het bedrijf dat het gaat ondertekenen.

Als u uw certificaat terugkrijgt, voert u “keytool -importcert -alias -keypass -keystore ” uit.

Misschien moet u in beide gevallen -storepass gebruiken als de keystore is beveiligd (wat een goed idee is).


Antwoord 7

Hier is een script dat ik heb gebruikt om een aantal crt-bestanden in de huidige map in batches te importeren in de java-keystore. Sla dit gewoon op in dezelfde map als uw certificaat en voer het als volgt uit:

./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

Antwoord 8

Zo werkte dit voor mij:

  1. Sla de certificaatgegevens op als .txt in de volgende indeling in een teksteditor

    —–BEGIN CERTIFICAAT—–
    [gegevens geserialiseerd door microsoft]
    —–EINDE CERTIFICAAT—–

  2. Open Chrome-browser (deze stap werkt mogelijk ook met andere browsers)
    instellingen > toon geavanceerde instellingen > HTTPS/SSL > certificaten beheren
    Importeer de .txt in stap 1
  3. Selecteer en exporteer dat certificaat in Base-64-gecodeerde indeling. Sla het op als .cer
  4. U kunt nu keytool of Portecle gebruiken om het naar uw Java-sleutelarchief te importeren

Other episodes