Как импортировать a.сертификат cer в хранилище ключей java?

во время разработки клиента Java webservice я столкнулся с проблемой. Аутентификация для webservice использует сертификат клиента, имя пользователя и пароль. Сертификат клиента, который я получил от компании за веб-сервисом, находится в . Когда я проверяю файл с помощью текстового редактора, он имеет следующее содержимое:

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

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

я смог импортировать этот сертификат в хранилище ключей, сначала очистив первую и последнюю строки, преобразовав в новые строки unix и запустив base64-декодирование. Полученный файл можно импортировать в хранилище ключей (используя keytool command). Когда я перечисляю записи в хранилище ключей, эта запись имеет тип trustedCertEntry. Из-за этого типа записи (?) Я не могу использовать этот сертификат для аутентификации в webservice. Я начинаю думать, что предоставленный сертификат является публичным сертификатом, который используется для аутентификации...

обходной путь, который я нашел, - это импортировать сертификат в IE и экспортировать его как . Этот файл может быть загружен как хранилище ключей и может использоваться для аутентификации в веб-сервисе. Однако я не могу ожидать, что мои клиенты будут выполнять эти шаги каждый раз, когда они получают новый сертификат. Поэтому я хотел бы загрузить .cer файл непосредственно в Java. Есть мысли?

дополнительные info: компания, стоящая за веб-сервисом, сказала мне, что сертификат должен быть запрошен (с помощью IE и веб-сайта) с ПК и пользователя, который импортирует сертификат позже.

8 ответов


  • Если вы хотите аутентифицировать, вам нужен закрытый ключ. Другого выхода нет.
  • сертификат-это открытый ключ с дополнительными свойствами (например, название компании, Страна,...) подписывается каким-либо центром сертификации, который гарантирует, что вложенные свойства являются истинными.
  • .Файлы CER являются сертификатами и не имеют закрытого ключа. Закрытый ключ имеется .Файл хранилища ключей PFX обычно. Если вы действительно аутентифицируетесь, потому что у вас уже есть импортированный закрытый ключ.
  • вы обычно можете импортировать .Сертификаты CER без каких-либо проблем с

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

импорт .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.


вот код, который я использовал для программного импорта .файлы cer в новое хранилище ключей.

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);
}

вам не нужно вносить какие-либо изменения в сертификат. Вы уверены, что используете правильную команду импорта?

для меня работает следующее:

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

где файл mycert.КВЖД содержит:

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

сертификат, который у вас уже есть, вероятно, является сертификатом сервера или сертификатом, используемым для подписи сертификата сервера. Это необходимо для проверки подлинности сервера клиентом веб-службы.

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

чтобы сгенерировать запрос сертификата, используйте "keytool-certreq-alias-file-keypass-keystore". Отправьте полученный файл в компанию, которая его подпишет.

когда вы вернете свой сертификат, запустите " keytool-importcert-alias-keypass-keystore ".

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


инструмент с открытым исходным кодом GUI доступно на keystore-explorer.org

KeyStore Explorer

KeyStore Explorer-это замена GUI с открытым исходным кодом для Java командной строки утилиты keytool и jarsigner. Keystore Explorer представляет их функциональность, и больше, через интуитивное графическое пользовательский интерфейс.

следующие экраны помогут (они от официального сайт)

экран по умолчанию, который вы получаете, выполнив команду:

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

enter image description here

и перейти к Examine и Examine a URL опция, а затем дайте веб-URL, который вы хотите импортировать.

окно результатов будет, как показано ниже, если вы дадите ссылку на сайт google. enter image description here

Это один из вариантов использования, а rest зависит от пользователя(все кредиты идут в keystore-explorer.org)


вот сценарий, который я использовал для пакетного импорта кучи файлов 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. Сохранить как .тхт данные сертификата, в следующем формате в текстовом редакторе

    ----- - НАЧНИТЕ СЕРТИФИКАТ----- [сериализация данных корпорацией Майкрософт] ----- СЕРТИФИКАТ КОНЦА - - - - -

  2. открыть браузер chrome (этот шаг может работать и с другими браузерами) параметры > Показать дополнительные параметры > HTTPS / SSL > управление сертификатами Импорт .txt в шаге 1
  3. выберите и экспортировать сертификат в кодировке base-64. Сохраните его как .cer
  4. Теперь вы можете использовать keytool или Portecle, чтобы импортировать его в хранилище ключей Java