Самозаверяющий сертификат и клиентское хранилище ключей для проверки подлинности SSL

Мне нужно создать и установить самозаверяющий сертификат на сервере (аппаратное устройство XML), чтобы выполнить SSL-аутентификацию клиента / приложения Java, которое через конфигурацию интерфейса может устанавливать хранилища ключей , то есть .jks. Мне эта установка нужна только для целей тестирования, а не для производства, по очевидным причинам. Вот как я создаю свое хранилище ключей (тип PKCS12):

1) Сгенерируйте закрытый ключ (пару)

$> openssl genrsa -des3 -out private.key 1024

2) Создайте запрос на сертификат (это необходимо?) - Я установил только значение CN.

$> openssl req -new -key private.key -out request.csr

3) Создайте самоподписанный сертификат

$> openssl x509 -req -days 365 -in request.csr -signkey private.key -out cert.crt

4) Создайте хранилище ключей PKCS12

$> openssl pkcs12 -export -in cert.crt -inkey private.key -out keystore.p12

5) Создайте клиент JKS

$> keytool -importkeystore -srckeystore keystore.p12 -srcstoretype pkcs12 -srcalias myalias -destkeystore client.jks -deststoretype jks -deststorepass <same pass as private key> -destalias myalias

Когда я устанавливаю keystore.p12 на сервере / устройстве, client.jks в клиентском приложении Java и делаю запрос, я получаю следующую ошибку:

javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate

Мне что-то принципиально не хватает в сертификатах и ​​SSL-аутентификации?


person Ulvon    schedule 18.06.2015    source источник
comment
Все это можно сделать с помощью keytool. Здесь вообще нет необходимости в OpenSSL.   -  person user207421    schedule 18.06.2015
comment
Похоже, вы используете один и тот же ключ + собственный сертификат для сервера (keystore.p12) и вашего Java-клиента (client.jks, по-видимому, также используется в качестве хранилища доверенных сертификатов); Обычно это плохая идея, но приемлемая для тестирования. Вы не идентифицируете сервер. но серверное программное обеспечение, которое настраивает свой ключ + собственный сертификат (хранилище ключей) с помощью p12, может настраивать свои доверенные сертификаты (хранилище доверенных сертификатов) отдельно. Это может быть другой файл, вероятно, в другом формате, или он может быть неявным, как хранилище сертификатов Windows или связка ключей MacOSX. Найдите способ добавить свой сертификат (НЕ ключ или p12, просто сертификат) в хранилище доверенных сертификатов сервера.   -  person dave_thompson_085    schedule 18.06.2015
comment
@ dave_thompson_085 Отделение хранилища ключей от доверенного хранилища, вы говорите, что мне нужно создать клиентское хранилище ключей (закрытый ключ + самозаверяющий сертификат), т.е. client.jks, извлеките его сертификат и в конечном итоге добавьте его в хранилище доверенных сертификатов сервера? Кстати, можно ли использовать p12 сервера server для добавления к нему сертификации client - больше похоже на использование server p12 одновременно как хранилище доверенных сертификатов и хранилище ключей? И если keystore сервера имеет собственный закрытый ключ + собственный сертификат, или я могу добавить только сертификат client на пустой TS / KS сервера?   -  person Ulvon    schedule 18.06.2015
comment
В этом сообщении содержится скрипт, использующий keytool для создания центр сертификации, сертификаты сервера и клиента, а также хранилище доверенных сертификатов.   -  person AceFunk    schedule 26.10.2017


Ответы (1)


Еще не ответ, но это слишком сложно для комментариев, поэтому я начну и отредактирую позже.

Должны ли (SSL / TLS) сервер (ы) и клиент (ы) совместно использовать ключ (и сертификат)? Подходит для разработки и, возможно, тестирования, зависит от производства. Как правило, каждая независимая система, которая должна быть аутентифицирована, должна иметь свой собственный закрытый ключ и сертификат для этого ключа (или иногда, но редко, несколько сертификатов). Если обе (или, в более общем смысле, все) задействованные системы и связь между ними будут находиться под контролем одного и того же администратора, не повредит ослабить это правило и (повторно) использовать один ключ + сертификат. Поскольку используемый ключ + сертификат (ы) всегда должен быть (пере) настраиваемым, это решение вы можете изменить позже, даже изменить несколько раз, если это окажется желательным или необходимым.

Должны ли сертификаты быть самоподписанными? Обычно подходят для разработки и тестирования, но могут отличаться для производственной среды. Опять же, если все соответствующие системы находятся под контролем одного администратора или, по крайней мере, ограниченной группы людей, которые знают друг друга (например, подразделения или офисы одной организации), ЦС не нуждается в реальной безопасности для проверки личности и определения доверия. Одно из соображений заключается в том, что сертификат сервера должен кодировать доменное имя (а) (или IP-адрес (а), если вы используете эту опцию) в сертификате, поэтому их изменение, которое часто требуется при разработке и тестировании, означает возврат к CA для получения нового сертификата, по крайней мере, незначительное неудобство, а иногда и задержка.

На данный момент у вас есть один ключ и самоподписанный сертификат, которым вы пытаетесь поделиться как для клиента, так и для сервера. Хотя вы, возможно, захотите изменить их позже, я бы порекомендовал сначала сосредоточиться на том, чтобы что-нибудь заработало. Изменение нескольких взаимосвязанных вещей одновременно может вызвать путаницу.

«Извлечь» сертификат? Для текущей настройки с одним (общим) ключом + сертификатом (самоподписанным) у вас уже есть ключ + сертификат в JKS, тот же ключ + сертификат в P12, и тот же сертификат в файле (cert.crt), поэтому вам не нужно ничего извлекать. Если вы (позже) сгенерируете для стороны Java (клиента) новый ключ и самоподписанный сертификат с помощью keytool, да, вам нужно будет извлечь этот сертификат. Если вы получаете сертификат, подписанный ЦС, для существующего или нового ключа, вам может потребоваться извлечь корень / якорь, но, возможно, он у вас уже есть, см. Ниже.

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

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

  • Для сертификата, выданного ЦС, привязкой может быть и (всегда?) Должен быть корневой сертификат для этого ЦС; корень CA обычно долговечен (например, 20 лет и более) и не нуждается в изменении, когда это делает сертификат партнера / организации.

  • Если вы используете хорошо известный ЦС, такой как Verisign или GoDaddy, в отличие от ЦС, управляемого вами или, возможно, «Магазином спиртных напитков и центром сертификации Joe's Dicount» в вашем местном районе красных фонарей, в некоторых system, корни для этих хорошо известных центров сертификации могут быть уже установлены, и в этом случае вам не нужно ничего делать.

Каким образом клиент доверял серверу? Очевидно, ваш Java-клиент использовал файл client.jks как хранилище ключей и как хранилище доверенных сертификатов. Это может легко сработать, потому что Java использует один формат файла, который может содержать оба типа данных, и дополнительно обрабатывает сертификат в записи с собственным ключом как также доверенный сертификат (привязку).

А как насчет хранилища доверенных сертификатов сервера? С другой стороны, программное обеспечение, которое использует формат pkcs12 для хранилища ключей или, по крайней мере, для импорта записи хранилища ключей, иногда (я бы сказал, что часто ) не использует тот же формат для своего хранилища доверенных сертификатов и, конечно же, не те же файлы. Тот факт, что он действительно отклонил использование клиентом того же сертификата, который у него уже есть, в качестве собственного вероятно означает, что он не обрабатывает pkcs12, который вы ему предоставили, как данные хранилища доверенных сертификатов, хотя в в принципе, ему может не нравиться что-то еще, например, отсутствие расширения ExtendedKeyUsage или недоступность данных отзыва / статуса.

Вы не идентифицируете и не описываете устройство, которое является вашим сервером, поэтому я могу только догадываться о множестве способов, которыми могут работать серверы SSL / TLS, особенно встроенные. Но где-то на вашем устройстве есть вероятно способ добавить сертификаты в его хранилище доверенных сертификатов. Также у него должен быть какой-то журнал ошибок, который может содержать дополнительную информацию о том, нужен ли ему якорь (здесь самоподписанный сертификат) в хранилище доверенных сертификатов или что-то еще - если вы видите этот журнал без аутентификации SSL / TLS!

Если вы можете предоставить нам (ссылку на) документ на вашем сервере / устройстве или достаточно подробно рассказать нам, что он показывает, предлагает и / или принимает, я, вероятно, могу быть более конкретным.

person dave_thompson_085    schedule 19.06.2015
comment
Ваш ответ очень подробный и информативный. Учитывая, что я установил одно и то же хранилище ключей на клиенте (формат JKS) и на сервере (устройство XML с форматом PKCS # 12 - поскольку оно не поддерживает JKS), логически сервер должен был видеть сертификат клиента как заслуживающий доверия и пройти его аутентификацию. Проблема возникла из-за того, что конфигурация устройства не обновлялась быстро, так сказать. Попытавшись установить соединение через несколько часов, я смог увидеть успешное рукопожатие SSL в клиентском инструменте (извините, что я не могу раскрыть идентификацию ни того, ни другого). - person Ulvon; 20.06.2015
comment
@Ulvon Логическая установка собственного сертификата и ключа с помощью PKCS # 12 не требует доверия к одному и тому же сертификату, когда он используется кем-то другим; Я мог бы показать вам программы, где этого не происходит. Очевидно, что конкретное устройство, которое вы используете, работает (после задержки); так что тебе повезло. - person dave_thompson_085; 21.06.2015
comment
@ dave-thompson-085 Я не понимаю вашего первого утверждения. Вы говорите, что сервер, установивший хранилище ключей PKCS # 12 для этого сертификата, будет аутентифицировать другого клиента, даже если он поставляется с другим сертификатом? - person Ulvon; 21.06.2015