Двухсторонний TLS (1.2) между клиентом Java и платным сервером Apple

Попытка достичь: как требуется в Apple Pay for Web, требуется двухсторонний TLS 1.2. В моем случае я пытаюсь поразить сервер оплаты Apple с моего Java с помощью JSON (который вы можете сказать как клиент). https://developer.apple.com/reference/applepayjs/applepaysession

Мои вопросы о концерне:

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 в Eclipse:

-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

1 ответ

Общие ответы в порядке, задаваемом..

  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. Сначала создайте сертификат Apple Pay Merchant ID на веб-сайте Apple, загрузите его, извлеките сертификат и ключ из него в 2 отдельных файла, отправьте оба вместе с вашим запросом (с паролем, конечно).
Другие вопросы по тегам