У меня есть хранилище ключей Java, в котором установлено 2 цепочки сертификатов. CSR был сгенерирован и подписан центром сертификации, и оба сертификата с соответствующими центрами сертификации были установлены. Однако, когда я отправляю запрос приложению на порт, отображается только один сертификат, но я хочу, чтобы отображались оба сертификата в хранилище ключей, чтобы я мог выполнить аутентификацию по предпочтительному сертификату.
Мне нужна помощь по этому вопросу
решение1
Примечание: центр сертификации не подписывает CSR; он подписывает сертификат, которыйчастичноосновано на КСО, но частично и нет (и обе части важны).
Ты говоришь 'аCSR был сгенерирован». Если вы действительно создали один CSR (для одного ключа) и получили два сертификата (каждый потенциально с цепочкой) для этого CSR и установили обе цепочки сертификатов в одну запись закрытого ключа в вашем хранилище, то второй заменил первый, и в вашем хранилище остался только второй.
Я предполагаю, что вместо этого вы сгенерировали два закрытых ключа и два CSR (по одному для каждого ключа) и для каждого CSR получили цепочку сертификатов и установили ее в соответствующий закрытый ключ, так что у вас на самом деле есть два закрытых ключа с разными цепочками сертификатов и вы хотите увидеть оба. Если сомневаетесь, используйте keytool -list [-v]
для проверки.
Протокол SSL (теперь TLS) этого не делает.; сервер отправляет только один сертификат «сущности» (сервера) с его цепочкой сертификатов, если таковая имеется, и подтверждает соответствующий закрытый ключ в одном рукопожатии.
Тыможетиметь возможность сделать два запроса, каждый из которых получаетодиниз цепочек сертификатов, которые вы хотите:
Если сертификаты имеют разные имена Subject/SAN И ваш клиент использует расширение SNI, что делают последние браузеры, но другое программное обеспечение может или не может, сервер Java 8 предпочтет сертификат, соответствующий SNI. Большинство клиентов (но не OpenSSL!) всегда делают SNI таким же, как имя хоста, к которому подключено, поэтому вам может потребоваться (временно?) изменить разрешение имен, чтобы указать несколько имен хостов на один и тот же сервер, например, с помощью вашего
hosts
файла или unbound или подобного.Если сертификаты предназначены для разных типов ключей (RSA, DSA, EC), а клиент предлагает только наборы шифров, которые используют один тип ключа, сервер Java будет использовать сертификат для этого типа ключа. Некоторые клиенты позволяют вам легко контролировать предлагаемые наборы шифров, некоторые — нет.
Аналогично, если цепочки сертификатов используют разные (наборы) алгоритмов подписи, а клиент реализует TLS1.2 с расширением SignatureAlgorithms, то сервер Java 7+ предпочтет цепочку сертификатов, которая удовлетворяет SigAlgs. Но я не знаю ни одного клиента, который позволяет легко выбирать SigAlgs, и в любом случае центры сертификации предлагают небольшой выбор алгоритмов подписи, используемых в цепочках для выдаваемых ими сертификатов.