Elettracompany.com

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Javax net ssl

Как решить javax.сеть.ssl.Ошибка SSLHandshakeException?

я подключился к VPN для настройки API инвентаризации, чтобы получить список продуктов, и он отлично работает. Как только я получаю результат от веб-сервиса, я привязываюсь к UI. А также я интегрировал PayPal с моим приложением для экспресс-проверки, когда я делаю вызов для оплаты, я сталкиваюсь с этой ошибкой. Я использую сервлет для внутреннего процесса. Может кто-нибудь сказать как исправить эту проблему?

6 ответов

сначала нужно получить сертификат от сервера, к которому вы пытаетесь подключиться. Это можно сделать различными способами, например, связаться с администратором сервера и попросить его,использование openssl для его загрузки, или, поскольку это, по-видимому, HTTP-сервер, подключение к нему с любым браузером, просмотр информации о безопасности страницы и сохранение копии сертификата. (Google должен быть в состоянии сказать вам точно, что делать для вашего конкретного браузера.)

теперь чтобы сертификат был сохранен в файле, его необходимо добавить в хранилище доверия JVM. At $JAVA_HOME/jre/lib/security/ для JREs или $JAVA_HOME/lib/security для JDKs есть файл с именем cacerts , который поставляется с Java и содержит публичные сертификаты известных сертификационных органов. Чтобы импортировать новый сертификат, запустите keytool как пользователь, имеющий разрешение на запись в cacerts:

он, скорее всего, попросит у вас пароль. Пароль по умолчанию, поставляемый с java, — changeit . Почти никто. изменить его. После выполнения этих относительно простых шагов вы будете общаться безопасно и с уверенностью, что вы разговариваете с правильным сервером и только с правильным сервером (если они не потеряют свой закрытый ключ).

сейчас я решил эту проблему таким образом,

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

всякий раз, когда мы пытаемся подключиться к URL-адресу,

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

1) попросите сертификат (загрузите сертификат), импортируйте этот сертификат в trustore. Использование Java trustore по умолчанию можно найти в Javajdk1.6.0_29jrelibsecuritycacerts, то при повторной попытке подключения к URL-соединению будет принято.

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

для точки № 2 мы должны выполнить следующие шаги:

1) напишите ниже метод, который устанавливает HostnameVerifier для HttpsURLConnection, который возвращает true для всех случаев означает, что мы доверяем trustStore.

2) Напишите ниже метод, который вызывает doTrustToCertificates перед попыткой подключения к URL

этот вызов вернет код ответа = 200 означает, что соединение успешно.

для получения более подробной информации и примера примера вы можете обратиться к URL-адресом.

Я считаю, что вы пытаетесь подключиться к чему-то с помощью SSL, но что-то предоставляет сертификат, который не проверяется корневыми центрами сертификации, такими как verisign.. По сути, по умолчанию безопасные соединения могут быть установлены только в том случае, если лицо, пытающееся подключиться, знает ключи контрагентов или какой-либо другой verndor, такой как verisign, может вмешаться и сказать, что предоставляемый открытый ключ действительно прав..

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

в любом случае, возвращаясь к делу.. У меня была аналогичная проблема при программировании Java-апплета и java-сервера ( надеюсь, когда-нибудь я напишу полный блог о том, как я получил всю безопасность для работы 🙂 )

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

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

Читать еще:  Java statement execute

P. S Я не могу получить исходный код до выходных, так как внешний SSH отключен в моем офисе : (

Javist

Свежие записи

Рубрика: javax.net.ssl

Безопасные коммуникации с JSSE

Java Secure Socket Extension (JSSE) библиотеки являются частью стандартной версии платформы J2SE 1.4. Предыдущие версии необходима установка расширением стандартной библиотеки, либо из эталонной реализации вс или с третьей стороной. Поддержка библиотеки предлагают для безопасной обработке HTTP просьб и ответов, также известного как HTTP или HTTPS над SSL. Более конкретно, JSSE библиотеки предоставляют функции, необходимые для аутентификации, шифрования и целостности. Эта поддержка гарантирует, что данные передаются по сети является частным и не передается в открытом виде (то есть, текст, который доступен для всеобщего просмотра и понятно).

Javax.net.ssl пакет содержит API для общения через Secure Sockets Layer (SSL) и Transport Layer Security (TLS) протоколы. SSL и TLS это две тесно связанные протоколов для обеспечения сетевого трафика. Аутентификация осуществляется через использование сертификатов X.509 — это аутентификация доступна как для клиента и сервера, а не только на сервере. Кроме того, предложение JSSE библиотек кодирования посредством секретного ключа и сертификата обмен открытыми ключами. Шифрование гарантирует целостность сообщения, предотвращение лицом в середине связи от перехвата сообщений, изменяя его, и передать его как если бы она не менялась.

Если вы не заинтересованы в прямом использовании сокетов и отправки HTTP самих команд, вы можете использовать HttpsURLConnection классов, которая была продемонстрирована на 10 февраля 2004 Технология Совет HttpURLConnection Использование веб-страниц. HttpsURLConnection класс включает в себя полную поддержку таких функций, как переадресация, подключение попыток, прокси переговоров, и (в J2SE V5) Cookies.

Если Вы заинтересованы в работе с сокетами напрямую, либо для HTTP / HTTPS сделок или для пользовательских приложений уровня использования, вы можете объединить javax.net.ssl пакет с заводов в javax.net. Это позволяет связываться через защищенное соединение HTTPS, над которым работает. Если вы знакомы с общения через соединение HTTP сокета, вы увидите, что работать с SSL-сокет основаны не на много отличается. Вы просто рассуждают над другой порт, 443 вместо 80, для нормального движения Сети.

Чтобы обеспечить защищенную связь, нужно сначала приобрести Socket завода. С завода, вы создаете сокет для конкретного хоста и порт. Вместо вызова конструктора сокета, вы спросите SocketFactory для сокета. SocketFactory вы используете версию по умолчанию SSL завода, javax.net.ssl.SSLSocketFactory:

SocketFactory factory = SSLSocketFactory.getDefault () ;

factory.createSocket ( hostname, HTTPS_PORT ) ;

После этого процесс по существу такой же, как использование HTTP основе сокета. Вы посылаете запрос на сервер, а также прослушивать для ответа:

PrintWriter out = new PrintWriter ( outputStream ) ;

out.print ( «GET / HTTP/1.0rnrn» ) ;

new InputStreamReader ( inputStream ) ;

new BufferedReader ( inputStreamReader ) ;

while (( line = in.readLine ()) != null ) <

Вот программа, SSLClient, что ставит все куски вместе:

Серверы SSL

Содержание

Введение

В «Технических Советах» «Засекреченная связь с помощью JSSE» вы научились пользоваться безопасными HTTP запросами и ответами (известными как HTTPS или HTTP через SSL) со стороны клиента. В этой статье вы узнаете о SSL соединение со стороны сервера.

Код для сервера

Как и в предыдущей статье, «Работа с Selectors», сервер здесь будет эхо-сервером, т.е. будет просто возвращать то, что отправил клиент.

Также как и в статье, где описывалась работа со стороны клиента, чтобы создать сервер, вы сначала должны получить фабрику сокетов. Для SSL серверов – фабрика класса SSLServerSocketFactory. SSLServerSocketFactory входит в пакет javax.net.ssl.

Затем вы получаете серверный сокет и ждете соединение с подтверждением:

Оставшийся код для сервера довольно простой. По аналогии со статьей «SelectorTest» вы просто читаете то, что прислал вам клиент, и отправляете обратно. Вот законченный код для сервера:

import javax.net.ssl.*;
import javax.net.*;
import java.io.*;
import java.net.*;

public class EchoServer <
private static final int PORT_NUM = 6789 ;

public static void main ( String args []) <
ServerSocketFactory serverSocketFactory = SSLServerSocketFactory
.getDefault () ;
ServerSocket serverSocket = null ;
try <
serverSocket = serverSocketFactory.createServerSocket ( PORT_NUM ) ;
> catch ( IOException ignored ) <
System.err.println ( «Unable to create server» ) ;
System.exit ( — 1 ) ;
>
while ( true ) <
Socket socket = null ;
try <
socket = serverSocket.accept () ;
InputStream is = socket.getInputStream () ;
BufferedReader br = new BufferedReader ( new InputStreamReader (
is, «US-ASCII» )) ;
OutputStream os = socket.getOutputStream () ;
Writer writer = new OutputStreamWriter ( os, «US-ASCII» ) ;
PrintWriter out = new PrintWriter ( writer, true ) ;
String line = null ;
while (( line = br.readLine ()) != null ) <
out.println ( line ) ;
>
> catch ( IOException exception ) <
exception.printStackTrace () ;
> finally <
if ( socket != null ) <
try <
socket.close () ;
> catch ( IOException ignored ) <
>
>
>
>
>
>

Читать еще:  Как узнать длину arraylist в java

Получение сертификата

Запуская эту программу, возникает небольшая проблема. У вас нет сертификата. Если вы запустите программу без подтверждения сертификата, вы получите SSLException:

Вы можете сгенерировать сертификат с помощью программы keytool, которая поставляется с SDK. Выберете в keytool опцию -genkey, чтобы создать keypair (пару ключей), затем опцию -keystore, чтобы определить место файла с ключом и опцию -keyalg, чтобы определить алгоритм шифрования:

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

Обычно в CN (имя и фамилия) пишут имя хоста сервера, хотя это и не обязательное требование. В этом примере это имя используется, потому что клиент имеет доступ к серверу по локальному хосту.

После запуска команды у вас появится новый файл с названием testStore в вашей рабочей директории. Теперь вы можете запустить сервер с помощью SSL. При запуске сервера, вы указываете хранилище ключа с помощью свойства javax.net.ssl.keyStore, а его пароль с помощью свойства javax.net.ssl.keyStorePassword.

Код для клиента

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

import javax.net.ssl.*;
import javax.net.*;
import java.io.*;
import java.net.*;

public class EchoClient <
private static int PORT_NUM = 6789 ;
private static String host = «localhost» ;

public static void main ( String args []) throws IOException <
SocketFactory socketFactory = SSLSocketFactory.getDefault () ;
Socket socket = socketFactory.createSocket ( host, PORT_NUM ) ;

BufferedReader br = new BufferedReader ( new InputStreamReader ( System.in,
«US-ASCII» )) ;
PrintWriter out = new PrintWriter ( new OutputStreamWriter ( socket
.getOutputStream () , «US-ASCII» ) , true ) ;

BufferedReader socketBr = new BufferedReader ( new InputStreamReader (
socket.getInputStream () , «US-ASCII» )) ;

String string = null ;
System.out.print ( «First line: » ) ;
while ( ! ( string = br.readLine ()) .equals ( «» )) <
out.println ( string ) ;
String line = socketBr.readLine () ;
System.out.println ( «Got Back: » + line ) ;
System.out.print ( «Next line: » ) ;
>
socket.close () ;
>
>

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

Когда вы запускаете клиента, вы представляете сертификат как доверительное хранилище (trust store), в отличие от хранилища ключа:

Теперь клиент будет общаться с вервером через SSL.

Express Notes by Sergey Vyatkin

Software development

Java based SSL connection to Tomcat with server and client certifications

Introduction
In this article, we explain how to make SSL (Secure Sockets Layer) connections from Java code to Tomcat using self-signed certificates on server and client sides. We will look at: key store SSL configurations, System.set properties, steps on how to get Tomcat to work on an SSL connection, server.xml settings, and the Handshake Protocol.

Key Store SSL configuration
SSL properties are set at the JVM level via system properties. You can either set them when you run the program (java -D….), or you can set them in code using System.setProperty. The specific keys/parameters you have to set are below:

javax.net.ssl.keyStore – Location of the Java keystore file containing an application process’s own certificate and private key.

javax.net.ssl.keyStorePassword – Password to access the private key from the keystore file specified by javax.net.ssl.keyStore. This password is used twice: to unlock the keystore file (store password) and to decrypt the private key stored in the keystore (key password).

javax.net.ssl.trustStore – Location of the Java keystore file containing the collection of CA certificates trusted by this application process (trust store).

If a trust store location is not specified using this property, the SunJSSE implementation searches for and uses a keystore file in the following locations (in order):

$JAVA_HOME/lib/security/jssecacerts
$JAVA_HOME/lib/security/cacerts

javax.net.ssl.trustStorePassword – Password to unlock the keystore file (store password) specified by javax.net.ssl.trustStore.

javax.net.ssl.trustStoreType – (Optional) For Java keystore file format, this property has the value jks (or JKS). You do not normally specify this property, because its default value is already jks. Use “PKCS12” for key store with extension “.p12”.

Читать еще:  Java sql sqlexception invalid column index

You options to point key stores:
Using System.setProperty in a Java program as follows:

Or use parameters settings when running the application:

Steps to get Tomcat works for SSL connection
1. Create tomcat self signed certificate
***Java, by default, verifies that the certificate CN (Common Name) is the same as the host name in the URL. If the CN in the certificate is not the same as the host name, your web service client fails. Please see examples for details.

2. Export server certificate to create client trust key store
3. Create client self-signed certificate
4. Export client certificate to create server trust key store

You can run bash file to do it:
$>bash generateClientServerSSCerts.sh localhost changeit

Example bash file below and link to file

Server.xml settings
When you run bash file you have server and client key stores and trust key stores after that you may start to test your SSL connection.

Before you start Tomcat, please make the following changes:
• Uncomment Tomcat @CATALINA_BASE/conf/server.xml settings for the SSL connection. Please see Tomcat 7 SSL configuration and Tomcat 7 HTTP Connector configuration for details.
server.xml

After that, you may run Tomcat and test your Java client connection using java test example.

Handshake Protocol message exchange from client to server
The Handshake certificate exchange works on a transport-layer before Java code starts working. Client initiates session to send request “ClientHello” to the server and receive response with “ServerHello” as we can see below on the picture

When server and client exchange certificates are located and the certificates are confirmed in their trust key stores, the handshake process is done. If you run your java test with System.property debug option

you can verify SSL message communications between client and server as show below in the log:

Javax net ssl

Сразу прошу прощения за корявость моих изьяснений — сфера для меня совсем новая.

Есть: веб-сервер работающий под Tomcat с SSL сертификатом (т.е. через браузер я, как пользователь, захожу через https).
Пользователь через «сайт» активирует некое java-приложение в новом окне эксплорера, в котором и работает некоторое время.

Дело в том, что это java-приложение не доверяет сертификату вышеупомянутого сервера, с помощью которого к нему обращаются, выдает такую ошибку:

цитата: Error message
930:Cannot connect to the Schedule Service. Please contact the system administrator

sun.security.validator.ValidatorException: No trusted certificate found
No trusted certificate found Подскажите, пожалуйста, как заставить JAVA доверять сертификату сервера?
В сети нашел много материала, но весь он для специалистов в JAVA — на уровне кода для компайлера и т.п.
Насколько я понял, суть такова, что надо залить этот сертификат в truststore JAVA. Но как это сделать?

К сообщению приложены файлы: 1.png, 493×170, 3Кb

Skip
Спасибо за ответ.

Keytool я уже более-менее освоил. Моя проблема в другом: как определить (изменить) на какой именно файл будет ориентироваться мое java-приложение? (Как указать на нужный файл truststore?)
Например, когда я настраивал Tomcat, то указывал в каком именно файле «keystore» он должен искать сертификат (грубо говоря, редактировал файл настроек server.xml).
Думаю, что-то аналогичное должно происходить и тут. Это приложение ведь где-то есть в физическом виде и где-то прописаны ключи/флаги с которыми оно запускается.

Вот тут (и не только тут), например, пишут такое: цитата (http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html): Now run your applications with the appropriate key stores. This example assumes the default X509KeyManager and X509TrustManager are used, thus we will select the keystores using the system properties described in Customization.
% java -Djavax.net.ssl.keyStore=keystore
-Djavax.net.ssl.keyStorePassword=password Server

% java -Djavax.net.ssl.trustStore=truststore
-Djavax.net.ssl.trustStorePassword=trustword Client Так вот, я, как полный профан в Java, элементарно не знаю где это писать и как определить имя моего Client (моего приложения).
PS: Я не писал это приложение, а использую уже готовое.

Значит вот как я решил данную проблему:

CA Chain Certificate (сертификат органа, который выдал/подписал сертификат для моего сервера) необходимо было импортировать в хранилище доверенных сертификатов Java — файл cacerts

Этого можно достичь такой командой

%JAVA_HOME%binkeytool -import -alias MY_ALIAS -keystore «%JAVA_HOME%jrelibsecuritycacerts» -keypass CACERTS_PASSWORD -trustcacerts -file CA_CHAIN_CERTIFICATE_FILE

Выделенное полужирным надо заменить на свои значения.

Skip
Спасибо за полезную ссылку.

Ссылка на основную публикацию
Adblock
detector