SSLHandshakeException: никаких общих наборов шифров - PullRequest
6 голосов
/ 03 марта 2012

Следовал инструкциям здесь и воссоздал сертификаты, которые я ранее неправильно создал. Что-то изменилось, поскольку теперь я вижу javax.net.ssl.SSLHandshakeException: no cipher suites in common на сервере и javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure на клиенте. Вместо ошибок этот вопрос

Сервер: ClassFileServer.java и соответствующий клиент SSLSocketClientWithClientAuth.java

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


Обновление:

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

На сервере (далее это руководство):

$ keytool -genkey -alias serverkey -keyalg RSA -keypass p@ssw0rd -storepass p@ssw0rd -keystore keystore.jks

$ keytool -export -alias serverkey -storepass p@ssw0rd -file server.cer -keystore keystore.jks

$ keytool -import -v -trustcacerts -alias clientkey -file ../client/client.cer -keystore cacerts.jks -keypass p@ssw0rd -storepass p@ssw0rd

На стороне клиента (по этому руководству):

$ keytool -genkey -alias clientkey -keyalg RSA -keypass changeit -storepass changeit -keystore keystore.jks

$ keytool -export -alias clientkey -storepass changeit -file client.cer -keystore keystore.jks

$ keytool -import -v -trustcacerts -alias serverkey -file ../server/server.cer -keystore cacerts.jks -keypass changeit -storepass changeit

Пришлось использовать другой носитель, так как отладка превысила ограничение тела этого сайта:

Ошибка отладки клиента: http://pastebin.com/mHCmEqAk

Ошибка отладки сервера: http://pastebin.com/YZbh7H8f

Ответы [ 3 ]

4 голосов
/ 04 марта 2012
javax.net.ssl.SSLHandshakeException: no cipher suites in common

Это имеет две причины:

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

  2. Чрезмерные ограничения на наборы шифров, наложенные клиентом или сервером или оба, так что не может быть никакого соглашения.

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

Сервер:

$ keytool -import -v -trustcacerts -alias clientkey -file ../client/client.cer -keystore cacerts.jks -keypass p@ssw0rd -storepass p@ssw0rd

Клиент:

$ keytool -import -v -trustcacerts -alias serverkey -file ../server/server.cer -keystore cacerts.jks -keypass changeit -storepass changeit

и вам это нужно только потому, что вы используете самозаверяющий сертификат. Простое решение: не надо. Используйте сертификат, подписанный ЦС, которому доверяет хранилище доверенных сертификатов по умолчанию, поставляемое с Java.

3 голосов
/ 17 июня 2014

Я получил эту ошибку при настройке SSL на кластере Cassandra.Проблема оказалась в документации версии 2.0 при описании генерации ключей:

keytool -genkey -alias -keystore .keystore

Опускается спецификация RSA в качестве алгоритма, должно быть ( см. Документацию v1.2 ):

keytool -genkey -alias -keyalg RSA -keystore .keystore

0 голосов
/ 28 июня 2019

В качестве альтернативы передаче trustStores в качестве аргумента JVM, -Djavax.net.ssl.trustStore=<cacerts_file.jks>, можно также добавить доверенные хранилища в SSLContext и затем создать SSLSocketFactory в качестве следующего фрагмента,

SSLContext ctx;
KeyManagerFactory kmf;
TrustManagerFactory tmf;
KeyStore ks;
TrustManager tm;

ctx = SSLContext.getInstance("TLS");

kmf = KeyManagerFactory.getInstance("SunX509");
ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(privateKey), passPhrase.toCharArray());
kmf.init(ks, passphrase);

KeyStore trustKeyStore = KeyStore.getInstance("JKS");
trustKeyStore.load(new FileInputStream(trustStore), trustPassPhrase.toCharArray());

TrustManagerFactory trustMgrFactory = TrustManagerFactory.getInstance("SUNX509");
trustMgrFactory.init(trustKeyStore);

ctx.init(kmf.getKeyManagers(), trustMgrFactory.getTrustManagers(), null);

SSLSocketFactory f = (SSLSocketFactory) ctx.getSocketFactory();

SSLSocket s = (SSLSocket) f.createSocket(serverIp, serverPort);

Примечание. Этот клиентский сокет выполняет как проверку подлинности клиента, так и сервера. Если вы хотите отключить аутентификацию клиента, передайте null в качестве первого аргумента при инициализации SSLContext ctx.

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