Создание SSL-соединения в Java - PullRequest
1 голос
/ 22 июня 2011

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

Сейчас я пытаюсьнаписать Java-сервер, который будет получать данные от SSLServerSocket, а сейчас просто распечатать его.В конечном итоге я хотел бы получить эти данные с Android, но сейчас он выдает SSLException, прежде чем он даже начинает прослушивать данные.

код:

System.setProperty("javax.net.ssl.keyStore","C:\\ProgramFiles\\jre6\\bin\\server.jks");
System.setProperty("javax.net.ssl.keyStorePassword","password");
SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
ServerSocket ss = factory.createServerSocket(6543);
Socket s = ss.accept();

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

Я создал сертификат в соответствии с руководством для openssl в Ubuntu, передал его и создал хранилище ключей, используя:

keytool -import -file "C:\Documents and Settings\matt\Desktop\server.crt" -keystore server.jks

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

РЕДАКТИРОВАТЬ:

учебник, которому я следовал, находится здесь: http://www.akadia.com/services/ssh_test_certificate.html

Еще раз спасибо!

РЕДАКТИРОВАТЬ:

Исключение составляетбросить это:

javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled

Я пытался Google исключение, и почти все это было учебное пособие, описывающее, как создать хранилище ключей (которое у меня сложилось впечатление, что у меня уже есть).Я буду продолжать просеивать эти результаты поиска.

Спасибо!

1 Ответ

3 голосов
/ 22 июня 2011

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

keytool -import -file "server.crt" -keystore server.jks

Вам нужно иметь закрытый ключ + сертификат.

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

Если сертификат, который вы создали с помощью OpenSSL, является самоподписанным (или из мини-центра сертификации для вашего собственного использования, например, с CA.pl), то, вероятно, не стоит делать преобразование. Вы также можете создать самозаверяющий сертификат непосредственно с keytool. См. «Генерация пары ключей» в официальной документации keytool:

keytool -genkeypair -dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US"
     -alias business -keypass kpi135 -keystore /working/mykeystore
     -storepass ab987c -validity 180

Убедитесь, что вы используете cn=your.fqdn.host.name (или cn=localhost, если это только для локальных тестов). (Я думаю, что keytool, предоставляемый с Java 7, также поддерживает альтернативные имена субъектов, что было бы лучше.)

Если у вас уже есть закрытый ключ + сертификат, который вы хотите повторно использовать в формате PKCS # 12 (обычно .p12 файл), вы можете импортировать его, используя метод, описанный в этом вопросе .

Если то, что вы создали с помощью OpenSSL, имеет формат PEM, может быть проще связать их в файл PKCS # 12 с OpenSSL, а затем импортировать их, как описано выше. Это можно сделать с помощью:

openssl pkcs12 -export -in cert.pem -inkey key.pem -out creds.p12
...