2016-09-17 6 views
1

Попытка достичь: Как требуется в Apple Pay for Web, требуется 2-way TLS 1.2. В моем случае я пытаюсь запустить сервер Apple paypal с моей java с полезной нагрузкой json (которую вы можете сказать как клиент). https://developer.apple.com/reference/applepayjs/applepaysession#21665322-way TLS (1.2) между Java-клиентом и платным сервером Apple

Мои объекты Концерна:

1) Любая команда, список всех поддерживаемых шифров? работает на java 1.8.

2) Что требуется при создании соединения HttpsURLconnection.openconnection как TLS1.2?

3) Любой пример кода, с помощью которого я могу достичь этого соединения.

4) Какие параметры необходимы, например, сертификат и закрытый ключ?

Любая помощь была бы полезна. Я знаю, что задал очень прямые вопросы, но буду продолжать добавлять в него более конкретные вопросы.

Обновление: первые 3 балла выполнены. Теперь только Что касается пункта 4: Я отправляю как ключ файлов, так и сертификат, конвертируя его в файл cert.p12 и сохраняя в качестве нового хранилища ключей.

openssl x509 -inform der -in merchant_id.cer -out merchant_id.pem 
openssl pkcs12 -nodes -export -in merchant_id.pem -inkey clientprivate.key -out cert.p12 -name "Certificate" 

После этого выполняется код Java с аргументами VM в затмении:

-Djavax.net.ssl.keyStoreType=pkcs12 -Djavax.net.ssl.keyStore=cert.p12 -Djavax.net.debug=ssl 

можно увидеть следующее сообщение об ошибке в консоли:

*ServerHelloDone 
Warning: no suitable certificate found - continuing without client authentication 
* Certificate chain 

** ECDHClientKeyExchange 
main, WRITE: TLSv1.2 Change Cipher Spec, length = 1 
*** Finished 
verify_data: 
* 
main, WRITE: TLSv1.2 Handshake, length = 64 
main, handling exception: java.net.SocketException: Connection reset 
%% Invalidated: [Session-1, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA] 
main, SEND TLSv1.2 ALERT: fatal, description = unexpected_message 
main, WRITE: TLSv1.2 Alert, length = 48 
main, Exception sending alert: java.net.SocketException: Connection reset by peer: socket write error 
main, called closeSocket() 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.security.ssl.InputRecord.readFully(Unknown Source) 
    at sun.security.ssl.InputRecord.read(Unknown Source) 
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at java.net.HttpURLConnection.getResponseCode(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source) 

Вот код Java:

HttpsURLConnection conn = (HttpsURLConnection)url.openConnection(); 
conn.setSSLSocketFactory(factory); 
conn.setDoOutput(true); 
conn.setDoInput(true); 
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
conn.setRequestProperty("Accept", "application/json"); 
conn.setRequestMethod("POST"); 
OutputStream os = conn.getOutputStream(); 
os.write(jsonInString.getBytes("UTF-8")); 

Ошибка

conn.getOutputStream(); 

Использование Java 1,8

ответ

0

Общие ответы в порядке попросили ..

  1. Я нашел, что это очень полезно, чтобы перечислить все шифры: https://confluence.atlassian.com/stashkb/list-ciphers-used-by-jvm-679609085.html

  2. Я использовал этот System.setProperty("https.protocols", "TLSv1.2"); для установите его в TLS 1.2.

  3. Я не могу опубликовать весь проект здесь, его слишком много кода ... Это базовый HTTP-запрос со всеми обязательными полями, отправленными вместе.
  4. Сначала создайте на веб-сайте яблока сертификат «яблочный платный идентификатор», загрузите его, извлеките из него сертификат и ключ из него в два отдельных файла, отправьте их вместе с запросом (с паролем, конечно).
+0

Спасибо yyf.Эти 3 точки решены. Но я сильно застрял в пункте 4. Я отправляю оба ключа и сертификат, добавляя в хранилище ключей. Но после ServerHello я получил следующую ошибку: WRITE: TLSv1.2 Рукопожатие, длина = 64 main, обработка исключение: java.net.SocketException: сброс соединения %% аннулированными: [Сессия-1, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA] главное, SEND TLSv1.2 ALERT: фатальную, описание = unexpected_message главное, WRITE: TLSv1.2 оповещения, длина = 48 главное, исключение отправки предупреждений: java.net.SocketException: Сброс соединения с помощью одноранговой: ошибка записи сокета main, называется closeSocket() – user2737800

+0

Я также много боролся, пока не получил его на работу ... Я загрузил сертификат из яблока и извлек ** из него ** cert 'openssl pkcs12 -nodes --nokeys -in merchant_id.pem -inkey clientprivate.key -out cert.p12' и ключ' openssl pkcs12 -nodes --nocerts -in merchant_id.pem -inkey clientprivate.key -out key .p12', а затем установите как хранилище ключей для запроса. – yyf

+0

Я пытаюсь выяснить, в чем разница. Итак, скажем, вы получаете merchant_id.cer из apple. Тогда вы должны были создать csr и закрытый ключ до этого. После этого из файла .cer вы также конвертировали в файл merchant_id.pem. После этого, как вы упомянули, создан сертификат и ключ. Тогда как вы установили оба как хранилище? Можете ли вы поделиться этим шагом. – user2737800