Java 8 Java客户端和Apple pay server之间的双向TLS(1.2)

Java 8 Java客户端和Apple pay server之间的双向TLS(1.2),java-8,tomcat7,tls1.2,applepay,applepayjs,Java 8,Tomcat7,Tls1.2,Applepay,Applepayjs,努力实现: 根据Apple Pay for Web的要求,需要2路TLS 1.2。在我的例子中,我试图用json负载(可以说是客户端)从java攻击apple pay服务器。 我的关注点: 1) 是否有任何命令列出所有受支持的密码套件?在Java1.8上运行 2) 将HttpsURLconnection.openconnection设置为TLS1.2时需要什么 3) 任何我可以实现这种连接的示例代码 4) 需要什么设置,如证书和私钥 任何帮助都是有用的。 我知道我问了一些非常直接的问题,但我会

努力实现: 根据Apple Pay for Web的要求,需要2路TLS 1.2。在我的例子中,我试图用json负载(可以说是客户端)从java攻击apple pay服务器。

我的关注点:

1) 是否有任何命令列出所有受支持的密码套件?在Java1.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

按照询问的顺序给出一般答案

  • 我发现列出所有密码非常有用:

  • 我使用了这个
    System.setProperty(“https.protocols”,“TLSv1.2”)
    将其设置为TLS 1.2

  • 我不能在这里发布我的整个项目它的代码太多了。。。这是一个基本的http请求,同时发送所有必需的字段
  • 首先在苹果的网站上创建一个“apple pay merchant id”证书,下载它,将证书和密钥提取到两个单独的文件中,并随请求一起发送(当然还有密码)

  • 按照问题的顺序给出一般答案

  • 我发现列出所有密码非常有用:

  • 我使用了这个
    System.setProperty(“https.protocols”,“TLSv1.2”)
    将其设置为TLS 1.2

  • 我不能在这里发布我的整个项目它的代码太多了。。。这是一个基本的http请求,同时发送所有必需的字段
  • 首先在苹果的网站上创建一个“apple pay merchant id”证书,下载它,将证书和密钥提取到两个单独的文件中,并随请求一起发送(当然还有密码)

  • 谢谢yyf。以上三点已经解决了。但是我严重地陷入了第四点。我通过添加密钥库来发送密钥和证书。但是在ServerHello之后,我得到了以下错误:WRITE:TLSv1.2握手,长度=64 main,处理异常:java.net.SocketException:Connection reset%%Invalidated:[Session-1,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA]main,发送TLSv1.2警报:致命,描述=意外消息main,WRITE:TLSv1.2警报,长度=48 main,异常发送警报:java.net.SocketException:Connection reset by peer:socket write error main,名为closeSocket(),在使其正常工作之前,我也做了很多努力。。。我从苹果下载了证书,并从中提取了一个cert
    openssl pkcs12-nockers-in-merchant_id.pem-inkey clientprivate.key-out cert.p12
    和一个key
    openssl pkcs12-nocerts-in-merchant_id.pem-inkey clientprivate.key-out key.p12
    ,然后将这两个都设置为请求的密钥库。我正在试图弄清楚找出有什么区别。那么,让我们假设您从苹果获得了merchant_id.cer。那么在此之前您必须已经创建了csr和私钥。然后从.cer文件转换为merchant_id.pem。然后,正如您所提到的,创建了证书和密钥。那么您是如何将这两者设置为密钥库的??你也可以分享一下这个步骤吗?如果你列出了你所遵循的步骤,那就太好了。我仍在努力让它发挥作用。谢谢yyf。在Apple开发者门户中上传CSR文件将生成一个证书文件(merchant_id.cer)供您下载。这将作为您的商户标识证书的公钥。私钥是您为生成该证书而提供的CSR。为了创建到Apple Pay merchant验证服务器的有效TLS连接,您需要使用CSR和CER文件创建一个公私密钥对,例如使用OpenSSL之类的工具来创建一个.p12文件。谢谢yyf。上述3点已经解决。但我严重陷入了第4点。我通过添加密钥库来发送密钥和证书。但是在ServerHello之后,我得到了以下错误:WRITE:TLSv1.2握手,长度=64 main,处理异常:java.net.SocketException:Connection reset%%Invalidated:[Session-1,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA]main,发送TLSv1.2警报:致命,描述=意外消息main,WRITE:TLSv1.2警报,长度=48 main,异常发送警报:java.net.SocketException:Connection reset by peer:socket write error main,名为closeSocket(),在使其正常工作之前,我也做了很多努力。。。我从苹果下载了证书,并从中提取了一个cert
    openssl pkcs12-nockers-in-merchant_id.pem-inkey clientprivate.key-out cert.p12
    和一个key
    openssl pkcs12-nocerts-in-merchant_id.pem-inkey clientprivate.key-out key.p12
    ,然后将这两个都设置为请求的密钥库。我正在试图弄清楚找出有什么区别。那么,让我们假设您从苹果获得了merchant_id.cer。那么在此之前您必须已经创建了csr和私钥。然后从.cer文件转换为merchant_id.pem。然后,正如您所提到的,创建了证书和密钥。那么您是如何将这两者设置为密钥库的??你也可以分享一下这个步骤吗?如果你列出了你所遵循的步骤,那就太好了。我仍在努力让它发挥作用。谢谢yyf。在Apple开发者门户中上传CSR文件将生成一个证书文件(merchant_id.cer)供您下载。这将作为您的商户标识证书的公钥。私钥是您为生成该证书而提供的CSR。为了创建到Apple Pay merchant验证服务器的有效TLS连接,您需要创建一个公私密钥