Ошибка Java Keytool после импорта сертификата, «ошибка keytool: java.io.FileNotFoundException & Access Denied»

129

Я пытаюсь подключить Java Web API через HTTPS; однако возникает исключение:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException

Я выполнил следующие шаги, которые я узнал из онлайн-руководств по использованию инструментов для ключей и SSL-сертификатов:

  1. Я скопировал URL-адрес HTTPS в браузер, загрузил сертификаты SSL и установил их в браузере с помощью Internet Explorer.

  2. Экспортировал сертификаты в путь на моем компьютере, сертификаты были сохранены как .cer

  3. Использовал опцию импорта keytool. Приведенная ниже команда выполнена без ошибок.

    keytool -import -alias downloadedCertAlias -keystore C:\path\to\my\keystore\cacerts.file -file C:\path\of\exportedCert.cer
  4. Мне было предложено ввести пароль в командной строке, который я ввел, а затем прошел аутентификацию.

  5. В cmdокне были напечатаны некоторые данные сертификата и подписи, и мне был предложен вопрос:

    Доверять этому сертификату?

    Я ответил да.

  6. Отображается приглашение cmd

    Сертификат добавлен в хранилище ключей

    Однако после этого сообщения было отображено другое исключение:

    keytool error: java.io.FileNotFoundException: C:\Program files\...\cacerts <Access Denied>

Наконец, когда я проверил хранилище ключей, сертификат SSL не был добавлен, и мое приложение выдает то же исключение, которое я получал ранее при попытке подключения:

(javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException)
cyber101
источник
не могли бы вы опубликовать точную keytoolкоманду, которую вы выполнили, и ее вывод? некоторые из очевидных проблем здесь - это опечатка в -keystoreаргументе и тот факт, что keytool не смог найти хранилище ключей для импорта ключа
Alex
Я хотел написать: keytool -import -alias loadedCertAlias ​​-keystore C: \ path \ to \ my \ keystore \ cacerts.file -file C: \ path \ of \ exportedCert.cer Я также упомянул команду, выполненную без ошибок, поэтому очевидно это просто орфографическая ошибка в моем вопросе !!! В любом случае спасибо
cyber101

Ответы:

268

Это могло произойти, если вы не запускаете командную строку в режиме администратора. Если вы используете Windows 7, вы можете запустить, ввести cmd и нажать Ctrl + Shift + Enter. Это откроет командную строку в режиме администратора. Если нет, вы также можете перейти в Пуск -> все программы -> аксессуары -> щелкните командную строку правой кнопкой мыши и выберите «Запуск от имени администратора».

Шаран Раджендран
источник
9
Для пользователей Mac простое sudo решит эту проблему.
trueful_ness
13
работать от имени администратора - неправильное решение. Большинство компаний блокируют доступ администратора. Лучше исправить причину отказа в доступе, а не увеличивать количество голосов.
skword
введите cmd и нажмите Ctrl + Shift + Enter, и сертификат успешно добавлен - он сработал для меня
deadend
Спасибо. Control-shift CMD был единственным способом, которым я мог изменить хранилище cacerts.
Malcolm Boekhoff
@Afshar, большое спасибо, я довольно долго боролся с этим.
Раджан Чаухан,
21

У меня была такая же проблема под Windows, и я мог решить ее, запустив cmd.exe от имени администратора (щелкните правой кнопкой мыши в меню «Пуск», затем «Запуск от имени администратора»).

Даниил
источник
19

У меня была такая же проблема при импорте сертификата в локальное хранилище ключей. Всякий раз, когда я запускаю команду keytool, я получаю следующую ошибку.

Сертификат был добавлен к ошибке keytool хранилища ключей: java.io.FileNotFoundException: C: \ Program Files \ Java \ jdk1.8.0_151 \ jre \ lib \ security (доступ запрещен)

Следующее решение работает для меня.

1) убедитесь, что вы запускаете командную строку в Rus в режиме администратора

2) Измените текущий каталог на% JAVA_HOME% \ jre \ lib \ security

3) затем выполните следующую команду

keytool -import -alias "mycertificatedemo" -file "C: \ Users \ name \ Downloads \ abc.crt" -keystore cacerts

3) дать смену пароля

4) введите y

5) при успешном завершении вы увидите следующее сообщение: «Сертификат был добавлен в хранилище ключей».

Убедитесь, что вы указываете « cacerts » только в значении параметра -keystore, поскольку я давал полный путь, например «C **: \ Program Files \ Java \ jdk1.8.0_151 \ jre \ lib \ security **».

Надеюсь, это сработает

Вакас Ахмед
источник
1
Как упоминалось здесь, на самом деле у меня сработало нахождение в каталоге безопасности и указание только имени сертификата «cacerts» вместо полного пути.
riseTide
Я использовал sudo -i, чтобы сделать себя суперпользователем на первом этапе на Mac, и выполнил шаги, и это сработало. Я открыл файл кареток как текстовый файл и нашел свой сертификат, выполнив команду f, чтобы найти его имя (или что-нибудь еще, относящееся к сертификату).
Chigozie A.
11

Проверьте разрешения на запись в хранилище ключей.

партха сарадхи
источник
2
Если кто-то может расширить это, простая проверка разрешений ничего не изменит.
user3071284 05
установка каталога tomcat в режим только для чтения вызовет это исключение
svarog
как проверить разрешение weite?
Ахмад Арслан
3

Для пользователей Mac обязательно выполните sudo и при появлении запроса сначала укажите пароль администратора, а затем пароль хранилища ключей, который обычно должен быть «changeit», если вы его не изменили.

В.К.
источник
1

Если вы используете windows8:

  1. Нажмите кнопку запуска
  2. В поле поиска введите command prompt
  3. В результате щелкните правой кнопкой мыши command promptи щелкните Run as administrator. Затем выполните команду keytool.
arungopal
источник
1

Вы можете дать себе разрешение на решение этой проблемы.

Щелкните правой кнопкой мыши cacerts> выберите свойства> выберите вкладку Securit> Разрешить все разрешения для всех имен групп и пользователей.

Это сработало для меня.

goyalshub1509
источник
0

Я даже запускаю командную строку как администратор, но у меня это не сработало из-за ошибки ниже.

'keytool' is not recognized as an internal or external command,
 operable program or batch file.

Если путь к keytool отсутствует в ваших системных путях, вам нужно будет использовать полный путь для использования keytool, который

C:\Program Files\Java\jre<version>\bin

Итак, команда должна быть такой

"C:\Program Files\Java\jre<version>\bin\keytool.exe" -importcert -alias certificateFileAlias -file CertificateFileName.cer -keystore cacerts

это сработало для меня.

sher17
источник
0

Я тоже получил эту ошибку, даже если запустил cmd как администратор.

Основная причина: файл из VCS (subversion, perforce и т. Д.), И когда я проверил свойства этого файла, его «Атрибуты» доступны только для чтения .

Итак, решение:

  • (1) отключите атрибут «только чтение»;
  • (2) извлечение из VCS, пусть файл находится в состоянии чтения и записи.
Schroeder
источник
-1

РЕШИТЬ

  1. Просто запустите CMD от имени администратора.
  2. Убедитесь, что вы используете правильный пароль хранилища доверенных сертификатов
Исмаил Озил
источник
-2

Вы можете сохранить другой диск или путь (не C) EX: D \

C:\Program Files\Java\jre1.8.0_101\bin>keytool -genkey -alias server -keyalg RSA -keysize 2048 -keystore D:\myserver.jks -dname "CN=myserver,OU=IT-WebDev, O=TIACHOP, L=HCM, ST=0753, C=VN" && keytool -certreq -alias server -file D:\myserver.csr -keystore D:\myserver.jks

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

maithanhduyan
источник