Як імпортувати сертифікат .cer у сховище Java?


226

Під час розробки клієнта веб-сервісу Java я зіткнувся з проблемою. Для аутентифікації веб-сервісу використовується клієнтський сертифікат, ім’я користувача та пароль. Сертифікат клієнта, який я отримав від компанії за веб-сервісом, має .cerформат. Коли я перевіряю файл за допомогою текстового редактора, він містить такий вміст:

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

Я можу імпортувати цей файл як сертифікат в Internet Explorer (не вводячи пароль!) Та використовувати його для автентифікації з веб-службою.

Мені вдалося імпортувати цей сертифікат у сховище клавіш, спочатку знімаючи перший та останній рядок, перетворюючи на нові рядки Unix та виконуючи декодування base64. Отриманий файл можна імпортувати в сховище ключів (за допомогою keytoolкоманди). Коли я перелічую записи в сховищі ключів, цей запис має тип trustedCertEntry. Через цей тип запису (?) Я не можу використовувати цей сертифікат для автентифікації з веб-службою. Я починаю вважати, що наданий сертифікат - це державний сертифікат, який використовується для автентифікації ...

Я знайшов вирішення, щоб імпортувати сертифікат в IE та експортувати його як .pfxфайл. Цей файл може бути завантажений як сховище ключів і може використовуватися для аутентифікації за допомогою веб-сервісу. Однак я не можу очікувати, що мої клієнти будуть виконувати ці дії щоразу, коли отримують новий сертифікат. Тому я хотів би завантажити .cerфайл безпосередньо на Java. Будь-які думки?

Додаткова інформація: компанія, що стоїть за веб-сервісом, сказала мені, що сертифікат (із використанням IE та веб-сайту) потрібно запитувати від ПК та користувача, який імпортує сертифікат пізніше.

Відповіді:


317
  • Якщо ви хочете пройти автентифікацію, вам потрібен приватний ключ - іншого варіанту немає.
  • Сертифікат - це відкритий ключ із додатковими властивостями (наприклад, назва компанії, країна, ...), який підписується органом сертифікації, який гарантує, що додані властивості відповідають дійсності.
  • .CERФайли є сертифікатами і не мають приватного ключа. Приватний ключ зазвичай надається з .PFX keystoreфайлом. Якщо ви справді підтверджуєте автентифікацію, це те, що ви вже імпортували приватний ключ.
  • Зазвичай ви можете імпортувати .CERсертифікати без проблем

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

3
Виявляється, приватний ключ генерується плагіном для IE. Наразі єдиним рішенням є імпорт сертифіката в IE та експорт файлу .pfx.
Ян-Пітер

5
Файли .CER мають відкритий ключ. У них немає приватного ключа. Запропонувати редагування ..
KyleM

6
Що тут робить -alias?
хоп

5
:( -> помилка keytool: java.lang.Exception: Введіть не сертифікат X.509
некромант

1
@hop У магазині ключів Java може бути декілька сертифікатів, кожен з яких має інший псевдонім для його ідентифікації. Ви можете використовувати його як посилання для його ідентифікації та / або для отримання програмного забезпечення за псевдонімом.
lujop

85

Імпорт .cerфайлу сертифіката , завантажений з браузера (відкрити URL і рити для деталей) в cacerts KeyStore в java_home\jre\lib\securityпрацював для мене, на відміну від намагається встановити створювати і використовувати власні сховища ключів.

  1. Переходьте до свого java_home\jre\lib\security
  2. ( Windows ) Відкрийте там командний рядок адміністратора, використовуючи cmdта CTRL+ SHIFT+ENTER
  3. Запустіть keytool для імпорту сертифіката:
    • (Замінити yourAliasNameі path\to\certificate.cerвідповідно)

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

Таким чином, вам не потрібно вказувати будь-які додаткові параметри JVM, і сертифікат повинен бути розпізнаний JRE.


шлях \ до \ cert. Якщо мій файл знаходиться на робочому столі, як я можу до нього відстежувати? C: / user / desktop / or ../../../../desktop/filename
Jesse

на MacOS / Linux ця команда працює з sudo. Дякую. але що таке непростий парам? Я не користувався цим і все-таки досяг успіху.
Євгеній Мішустін

Зауважте, що при використанні JDK для розробки правильний шлях: java_home\jdk_x.xx\jre\lib\security Для абсолютного шляху використовуйте зворотній косу рису, напр., "C:\myCert.crt"Лапки необов’язкові, якщо шлях не містить пробілів.
jp-jee

Дякую мільйон разів.
vikingsteve

Питання: А що з приватним ключем? Дискусія ведеться про сертифікати клієнта. Я розумію, що потрібно створити КСВ з приватним ключем, потім отримати сертифікат клієнта від віддаленої компанії веб-сайту, а потім зіставити сертифікат клієнта з приватним ключем. Здається, ваша відповідь нічого не згадує про приватний ключ. Просто питаю.
користувач2367418

51

Ось код, який я використовував для програмного імпорту файлів .cer у новий 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);
}

20

Вам не потрібно було робити жодних змін у сертифікаті. Ви впевнені, що виконуєте правильну команду імпорту?

Наступні роботи для мене:

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

де mycert.cer містить:

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

2
Коли я намагаюся імпортувати немодифікований сертифікат у сховище ключів, я отримую помилку "помилка keytool: java.lang.Exception: Введіть не сертифікат X.509". Змінивши сертифікат так, як я описав у своєму дописі, я можу імпортувати сертифікат без помилок із командою, подібною вашій. Однак він імпортується як довіренийCertEntry і не використовується під час доступу до веб-сервісу.
Ян-Пітер

Чи можете ви додайте команду виключення до питання? Ви впевнені, що в команді імпорту вказуєте псевдонім?
dogbane

Не забувайте запускати cmd як адміністратор, якщо ви використовуєте Windows
SilentBob470,

9

Інструмент графічного інтерфейсу з відкритим кодом доступний на keystore-explorer.org

Провідник KeyStore

Провідник KeyStore - це заміна графічного інтерфейсу з відкритим кодом для утиліти командного рядка Java keytool та jarsigner. KeyStore Explorer представляє їх функціональність та інше за допомогою інтуїтивного графічного інтерфейсу користувача.

Наступні екрани допоможуть (вони з офіційного сайту)

Екран за замовчуванням, який ви отримуєте, виконавши команду:

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

введіть тут опис зображення

І піти Examineі Examine a URLваріант , а потім дати веб - адреса , який ви хочете імпортувати.

Вікно результатів буде таким, як нижче, якщо ви надаєте посилання на сайт google. введіть тут опис зображення

Це один із випадків використання, а решта залежить від користувача (усі кредити йдуть на keystore-explorer.org )


7

Сертифікат, який у вас уже є, це, мабуть, сертифікат сервера або сертифікат, який використовується для підписання сертифіката сервера. Він вам знадобиться, щоб ваш клієнт веб-служби міг підтвердити автентифікацію сервера.

Але якщо додатково вам потрібно виконати автентифікацію клієнта за допомогою SSL, тоді вам потрібно отримати власний сертифікат для аутентифікації вашого клієнта веб-служби. Для цього вам потрібно створити запит на сертифікат; процес включає створення власного приватного ключа та відповідного відкритого ключа та приєднання цього відкритого ключа разом із частиною вашої інформації (електронною поштою, іменем, доменним іменем тощо) до файлу, який називається запитом на сертифікат. Потім ви надсилаєте цей запит на сертифікат компанії, яка вже просила вас про це, і вони створять ваш сертифікат, підписавши ваш відкритий ключ своїм приватним ключем, і вони надішлють вам файл X509 зі своїм сертифікатом, який ви можете тепер додайте у свою сховище ключів, і ви будете готові підключитися до веб-служби за допомогою SSL, що вимагає аутентифікації клієнта.

Щоб створити ваш запит на сертифікат, використовуйте "keytool -certreq -alias -file -keypass -keystore". Відправте отриманий файл компанії, яка збирається його підписати.

Коли ви повернете свій сертифікат, запустіть "keytool -importcert -alias -keypass -keystore".

Можливо, вам потрібно буде використовувати -storepass в обох випадках, якщо сховище ключів захищено (що є хорошою ідеєю).


5

Ось сценарій, який я використовував для пакетного імпортування купівлі файлів crt у поточний каталог у сховище Java. Просто збережіть це в тій самій папці, що і ваш сертифікат, і запустіть її так:

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

1

Ось як це працювало для мене:

  1. Збережіть у форматі .txt дані сертифіката у наступному форматі у текстовому редакторі

    ----- НАЧАЙТЕ СЕРТИФІКАТ ----- [дані, серіалізовані мікрософт] ----- КОНТРОЛЬНИЙ СЕРТИФІКАТ -----

  2. Відкрийте браузер Chrome (цей крок може працювати і з іншими веб-переглядачами) налаштуваннями> показати розширені налаштування> HTTPS / SSL> керувати сертифікатами Імпортуйте .txt на кроці 1
  3. Виберіть та експортуйте цей сертифікат у закодованому Base-64 форматі. Збережіть це як .cer
  4. Тепер ви можете скористатися keytool або Portecle, щоб імпортувати його до своєї сховища Java
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.