2016-09-17 98 views
1

試圖實現: 按照Apple Pay for Web的要求,需要2路TLS 1.2。在我的情況下,我試圖從我的java與json有效載荷(您可以說作爲客戶端)打蘋果支付服務器。 https://developer.apple.com/reference/applepayjs/applepaysession#2166532Java客戶端和Apple支付服務器之間的2路TLS(1.2)

我關注的點:

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" 

在Eclipse中VM參數是運行Java代碼後:

-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. 首先在蘋果網站上創建一個「apple pay merchant id」證書,下載它,從中提取證書和密鑰到兩個單獨的文件中,隨同您的請求一起發送(當然還有密碼)。
+0

謝謝yyf。上述3點已經解決了。但是我很困難地停留在第4點。我通過添加密鑰庫來發送密鑰和證書。但是在ServerHello之後,我得到了以下錯誤:WRITE:TLSv1.2 Handshake,長度= 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:通過peer重置連接:套接字寫入錯誤 main,調用closeSocket() – user2737800

+0

我也掙扎了很多,直到我得到它的工作......我從蘋果下載了證書並從中提取了** **證書'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。然後,您必須先創建csr和私鑰。之後從.cer文件轉換爲merchant_id.pem。接着你提到創建的證書和密鑰。那麼你如何將這兩者都設置爲密鑰庫?你也可以分享這一步嗎? – user2737800