Jak zaimportować certyfikat .cer do magazynu kluczy Java?

226

Podczas opracowywania klienta Java Webservice napotkałem problem. Uwierzytelnianie dla usługi internetowej polega na użyciu certyfikatu klienta, nazwy użytkownika i hasła. Certyfikat klienta, który otrzymałem od firmy za usługą internetową, ma .cerformat. Kiedy sprawdzam plik za pomocą edytora tekstu, ma on następującą zawartość:

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

Mogę zaimportować ten plik jako certyfikat w Internet Explorerze (bez konieczności podawania hasła!) I użyć go do uwierzytelnienia w usłudze internetowej.

Byłem w stanie zaimportować ten certyfikat do magazynu kluczy, najpierw usuwając pierwszą i ostatnią linię, konwertując na nowe znaki unix i uruchamiając dekodowanie base64. Plik wynikowy można zaimportować do magazynu kluczy (za pomocą keytoolpolecenia). Gdy wymieniam wpisy w magazynie kluczy, ten wpis jest tego typu trustedCertEntry. Z powodu tego typu wpisu (?) Nie mogę użyć tego certyfikatu do uwierzytelnienia w usłudze sieciowej. Zaczynam myśleć, że podany certyfikat jest certyfikatem publicznym używanym do uwierzytelniania ...

Rozwiązaniem, które znalazłem, jest zaimportowanie certyfikatu do IE i wyeksportowanie go jako .pfxpliku. Ten plik można załadować jako plik kluczy i można go użyć do uwierzytelnienia w usłudze sieciowej. Nie mogę jednak oczekiwać, że moi klienci wykonają te kroki za każdym razem, gdy otrzymają nowy certyfikat. Chciałbym więc załadować .cerplik bezpośrednio do Java. jakieś pomysły?

Informacje dodatkowe: firma odpowiedzialna za serwis internetowy powiedziała mi, że należy zażądać certyfikatu (przy użyciu IE i strony internetowej) z komputera i użytkownika, który zaimportuje certyfikat później.

Jan-Pieter
źródło

Odpowiedzi:

317
  • Jeśli chcesz się uwierzytelnić, potrzebujesz klucza prywatnego - nie ma innej opcji.
  • Certyfikat jest kluczem publicznym z dodatkowymi właściwościami (takimi jak nazwa firmy, kraj, ...) podpisanym przez niektóre urzędy certyfikacji, które gwarantują, że załączone właściwości są prawdziwe.
  • .CERpliki są certyfikatami i nie mają klucza prywatnego. Klucz prywatny jest .PFX keystorezwykle dostarczany z plikiem. Jeśli naprawdę się uwierzytelniasz, to dlatego, że już zaimportowałeś klucz prywatny.
  • Zwykle możesz importować .CERcertyfikaty bez żadnych problemów

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
lujop
źródło
3
Okazuje się, że klucz prywatny jest generowany przez wtyczkę do IE. Jedynym rozwiązaniem na razie jest zaimportowanie certyfikatu do IE i wyeksportowanie pliku .pfx.
Jan-Pieter,
5
Pliki .CER mają klucz publiczny. Nie mają klucza prywatnego. Zaproponuj edycję ..
KyleM
6
Co tu robi -alias?
hop
5
:( -> błąd keytool: java.lang.Exception: Nie wprowadzaj certyfikatu X.509
nekromanta
1
@hop Magazyn kluczy Java może mieć wiele certyfikatów, każdy z innym aliasem, aby go zidentyfikować. Możesz użyć go jako odniesienia do jego identyfikacji i / lub do programowego wyszukiwania według nazwy aliasu.
lujop
85

Importowanie .cerpliku certyfikatu pobranego z przeglądarki (otwórz adres URL i wyszukaj szczegóły) do magazynu kluczy cacerts w java_home\jre\lib\securitymnie działało, w przeciwieństwie do prób generowania i używania własnego magazynu kluczy.

  1. Idź do swojego java_home\jre\lib\security
  2. ( Windows ) Otwórz tam wiersz komend administratora za pomocą cmdi CTRL+ SHIFT+ENTER
  3. Uruchom keytool, aby zaimportować certyfikat:
    • (Zamień yourAliasNamei path\to\certificate.cerodpowiednio)

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

W ten sposób nie musisz określać żadnych dodatkowych opcji JVM, a certyfikat powinien być rozpoznawany przez środowisko JRE.

jediz
źródło
ścieżka \ do \ cert. Jeśli mój plik znajduje się na pulpicie, jak mogę go ścieżkę? C: / user / desktop / or ../../../../desktop/filename
Jesse
w MacOS / Linux to polecenie działa z sudo. Dzięki. ale czym jest noprompt param? Nie użyłem go i nadal mi się udało.
Evgeniy Mishustin
Zauważ, że gdy używasz JDK do programowania, poprawną ścieżką jest java_home\jdk_x.xx\jre\lib\security Dla ścieżki bezwzględnej użyj ukośnika odwrotnego, np. "C:\myCert.crt"Znaki cudzysłowu są opcjonalne, jeśli ścieżka nie zawiera białych znaków.
jp-jee
Dzięki milion razy.
vikingsteve
Pytanie: Co z kluczem prywatnym? Dyskusja dotyczy certyfikatów klientów. Rozumiem, że należy utworzyć CSR z kluczem prywatnym, a następnie otrzymać certyfikat klienta od zdalnej firmy internetowej, a następnie dopasować certyfikat klienta do klucza prywatnego. Twoja odpowiedź nie wspomina nic o kluczu prywatnym. Tylko pytam.
user2367418,
51

Oto kod, którego używałem do programowego importowania plików .cer do nowego magazynu kluczy.

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.
źródło
20

Nie powinieneś wprowadzać żadnych zmian w certyfikacie. Czy na pewno używasz właściwego polecenia importu?

Poniższe działa dla mnie:

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

gdzie mycert.cer zawiera:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----
dogbane
źródło
2
Kiedy próbuję zaimportować niezmodyfikowany certyfikat do magazynu kluczy, pojawia się błąd „błąd keytool: java.lang.Exception: Nie wprowadzaj certyfikatu X.509”. Po zmodyfikowaniu certyfikatu w sposób opisany w moim poście mogę zaimportować certyfikat bez błędów za pomocą polecenia podobnego do twojego. Jest jednak importowany jako trustCertEntry i nie jest używany podczas uzyskiwania dostępu do usługi internetowej.
Jan-Pieter,
Czy możesz dodać polecenie do wyjątku? Czy na pewno określasz alias w poleceniu importu?
dogbane
Nie zapomnij uruchomić cmd jako administrator, jeśli korzystasz z systemu Windows
SilentBob470
9

Narzędzie GUI typu open source jest dostępne na keystore-explorer.org

KeyStore Explorer

KeyStore Explorer jest otwartym zamiennikiem GUI dla narzędzia i narzędzia jarsigner z linii poleceń Java. KeyStore Explorer prezentuje ich funkcjonalność i nie tylko, poprzez intuicyjny graficzny interfejs użytkownika.

Pomogą Ci następujące ekrany (pochodzą z oficjalnej strony)

Domyślny ekran wyświetlany po uruchomieniu polecenia:

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

wprowadź opis zdjęcia tutaj

Idź do ExamineiExamine a URL opcję, a następnie podaj adres URL, który chcesz zaimportować.

Okno wyników będzie wyglądać jak poniżej, jeśli podasz link do witryny Google. wprowadź opis zdjęcia tutaj

Jest to jeden z przypadków użycia, a reszta należy do użytkownika (wszystkie kredyty trafiają do keystore-explorer.org )

Shantha Kumara
źródło
7

Certyfikat, który już masz, jest prawdopodobnie certyfikatem serwera lub certyfikatem używanym do podpisywania certyfikatu serwera. Będziesz go potrzebował, aby Twój klient usługi WWW mógł uwierzytelnić serwer.

Ale jeśli dodatkowo musisz przeprowadzić uwierzytelnianie klienta za pomocą protokołu SSL, musisz uzyskać własny certyfikat, aby uwierzytelnić klienta usługi WWW. W tym celu musisz utworzyć żądanie certyfikatu; proces ten obejmuje utworzenie własnego klucza prywatnego i odpowiedniego klucza publicznego oraz dołączenie tego klucza publicznego wraz z niektórymi informacjami (e-mail, nazwa, nazwa domeny itp.) do pliku zwanego żądaniem certyfikatu. Następnie wysyłasz tę prośbę o certyfikat do firmy, która już o to poprosiła, a ona utworzy Twój certyfikat, podpisując Twój klucz publiczny za pomocą swojego klucza prywatnego, i odeśle Ci plik X509 z Twoim certyfikatem, który możesz teraz dodaj do swojego magazynu kluczy, a będziesz gotowy do połączenia z usługą internetową za pomocą protokołu SSL wymagającego uwierzytelnienia klienta.

Aby wygenerować żądanie certyfikatu, użyj „keytool -certreq -alias -file -keypass -keystore”. Wyślij wynikowy plik do firmy, która zamierza go podpisać.

Po odzyskaniu certyfikatu uruchom polecenie „keytool -importcert -alias -keypass -keystore”.

Może być konieczne użycie -storepass w obu przypadkach, jeśli magazyn kluczy jest chroniony (co jest dobrym pomysłem).

Chochos
źródło
5

Oto skrypt, którego użyłem do wsadowego zaimportowania kilku plików CRT z bieżącego katalogu do magazynu kluczy Java. Po prostu zapisz to w tym samym folderze co twój certyfikat i uruchom go w następujący sposób:

./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
źródło
1

Oto jak to dla mnie działało:

  1. Zapisz jako .txt dane certyfikatu w następującym formacie w edytorze tekstu

    ----- ROZPOCZNIJ CERTYFIKAT ----- [dane zserializowane przez Microsoft] ----- KONIEC CERTYFIKAT -----

  2. Otwórz przeglądarkę Chrome (ten krok może działać również z innymi przeglądarkami) ustawienia> pokaż ustawienia zaawansowane> HTTPS / SSL> zarządzaj certyfikatami. Importuj .txt w kroku 1
  3. Wybierz i wyeksportuj ten certyfikat w formacie zakodowanym w standardzie Base-64. Zapisz jako .cer
  4. Teraz możesz użyć keytool lub Portecle, aby zaimportować go do magazynu kluczy Java
code4kix
źródło