Во-первых, вы, кажется, используете Java 8 (8u73). Через 8 keytool
по умолчанию используется формат JKS , а не PKCS12. (9 up делает по умолчанию PKCS12.) Вот почему причиной вашего исключения является DerStuff; Формат PKCS12 - это / использует DER, а JKS - нет. Либо укажите -storetype pkcs12
в команде keytool
, либо укажите ..key-store-type=JKS
в конфигурации вашего приложения (и, предпочтительно, измените имя, чтобы оно не вводило людей в заблуждение и не вводило в заблуждение людей).
Во-вторых, keytool -import
в новом хранилище ключей (или записи) импортирует только сертификат в качестве записи 'trustcert', которую можно использовать только для проверки других сторон. TLS-сервер (или SSL до его устаревания), такой как Tomcat, или вообще любой проверяющий, должен иметь запись 'privatekey', содержащую сертификат И соответствующий PRIVATEKEY И обычно ЦЕПЬ CERT (S) . Чтобы быть точным, стандарты TLS требуют, чтобы сервер отправлял / все цепочечные сертификаты, необходимые для проверки сущности = серверный сертификат, опционально исключая корень или привязку; JSSE обычно отправляет сертификаты, которые находятся в PrivateKeyEntry, поэтому вы должны поместить туда необходимые сертификаты. Для любого общедоступного центра сертификации (например, Verisign ^ WSymantec ^ WDigicert, GoDaddy, LetsEncrypt / Identrust), начиная примерно с 1990 года, требуется как минимум один цепной сертификат, иногда два, а в редких случаях - больше. Для частного ЦС это может варьироваться в зависимости от ЦС. Если сервер не отправляет требуемые цепные сертификаты, некоторые клиенты могут по-прежнему иметь возможность проверить некоторые сертификаты; в частности, браузеры могут часто «заполнять» отсутствующие цепочки сертификатов из общедоступных ЦС. Это создает ситуацию, когда некоторые подключения к вашему серверу устанавливаются успешно, в то время как другие подключения к тому же серверу завершаются неудачно, что может сбивать с толку и расстраивать пользователей и не рекомендуется.
Если ваш .key
файл фактически содержит только сертификат, его имя .key
вводит в заблуждение и вводит в заблуждение. Если он содержит сертификат и , тогда ключ в PEM , Java может читать и отделять часть сертификата и игнорировать ключ; это позволяет запускать keytool
, но создает результирующий файл, который Tomcat не может использовать для приема соединений TLS / SSL. (В зависимости от версии и, возможно, конфигурации, он может выдать довольно конкретное исключение, например «не ключ» или «ключ не найден», или он может просто отклонить все попытки подключения с handshake_failure.) Если он содержит только ключ или затем нажмите сертификат или не PEM, команда keytool
потерпит неудачу, а ваша, очевидно, нет.
keytool
не может импортировать приватный ключ из чего-либо, кроме (другого) поддерживаемого хранилища ключей, что не очень вам помогает, потому что, если оно уже находится в хранилище ключей, вам не нужно его импортировать. Ваш выбор:
если у вас есть openssl
командная строка, используйте ее для преобразования ключа + сертификата (ов) в PKCS12. (openssl pkcs12 -export
будет включать цепочку сертификатов (сертификатов), если вы предоставите их / их явно, или явно укажете -chain
и предоставите или по умолчанию хранилище доверенных сертификатов, содержащее его / их.) Существуют десятки существующих стековых Q и As, возвращаясь ко многим лет, охватывающих эту распространенную и популярную альтернативу.
используйте keytool
до сгенерируйте пару ключей (уже в формате хранилища ключей, поддерживаемом Java) и CSR и получите сертификат, выданный для , что CSR, а затем используйте keytool -import
либо (1) импортировать сертификаты цепочки CA как доверенные, а затем сертификат сервера в существующую запись приватного ключа , которая автоматически заполняет цепочку, либо (2) импортировать целое Цепочка ЦС напрямую к существующей записи приватного ключа . Существует много существующих Qs и As на эту альтернативу, а также собственный документ Sun / Oracle для Java и адаптированные версии от каждого CA (или почти).
напишите, или найдите, и используйте программу, которая явно загружает приватный ключ и сертификаты из любого формата (форматов), которые у вас есть, в запись «приватного ключа» в поддерживаемом хранилище ключей. Это больше работы, и есть только несколько вопросов и ответов по этому вопросу.