当前位置: 首页 > 知识库问答 >
问题:

通过java okhttp客户端通过HTTPS/SSL进行连接时出现问题

冯霖
2023-03-14

使用java-version:1.8.0_171,我试图连接到API网关,但使用java8却得到一个SSL handshake_failure。已经运行的命令:

keytool -import -alias yan3 -file NBCO_YM_Root.cer -keystore /usr/jdk/jre/lib/security/cacerts  
OkHttpClient client=new OkHttpClient.Builder()
                    .connectTimeout(90,TimeUnit.SECONDS)
                    .readTimeout(90,TimeUnit.SECONDS)
                    .writeTimeout(90,TimeUnit.SECONDS)
                    .build();
            log.info("SupportedCipherSuites is {} and DefaultCipherSuites is {}",
                    client.sslSocketFactory().getSupportedCipherSuites(),
                    client.sslSocketFactory().getDefaultCipherSuites()
            );

            RequestBody requestBody=new RequestBody() {
                @Override
                public MediaType contentType() {
                    return MediaType.parse(contentType);
                }

                @Override
                public void writeTo(BufferedSink sink) throws IOException {
                    sink.writeString(data,Charset.forName("utf-8"));
                }
            };
            Request request=new Request.Builder()
                    .url(url)
                    .post(requestBody).build();
            Response okResponse=client.newCall(request).execute();
            response=okResponse.body().string();
            return response;

启用-djavax.net.debug=all时,我得到了以下信息:

*** ServerHelloDone
[read] MD5 and SHA1 hashes:  len = 4
0000: 0E 00 00 00                                        ....
Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
<Empty>
***
*** ECDHClientKeyExchange
ECDH Public value:  { 4, 102, 174, 65, 31, 164, 120, 177, 145, 20, 194, 229, 169, 146, 135, 72, 51, 133, 74, 46, 248, 110, 104, 154, 217, 12, 21, 84, 186, 80, 122, 237, 224, 3, 46, 164, 118, 211, 60, 131, 74, 182, 7, 186, 14, 42, 161, 155, 115, 99, 130, 76, 45, 122, 220, 150, 246, 56, 145, 226, 217, 216, 75, 124, 120 }
[write] MD5 and SHA1 hashes:  len = 77
0000: 0B 00 00 03 00 00 00 10   00 00 42 41 04 66 AE 41  ..........BA.f.A
0010: 1F A4 78 B1 91 14 C2 E5   A9 92 87 48 33 85 4A 2E  ..x........H3.J.
0020: F8 6E 68 9A D9 0C 15 54   BA 50 7A ED E0 03 2E A4  .nh....T.Pz.....
0030: 76 D3 3C 83 4A B6 07 BA   0E 2A A1 9B 73 63 82 4C  v.<.J....*..sc.L
0040: 2D 7A DC 96 F6 38 91 E2   D9 D8 4B 7C 78           -z...8....K.x
main, WRITE: TLSv1.2 Handshake, length = 77
[Raw write]: length = 82
0000: 16 03 03 00 4D 0B 00 00   03 00 00 00 10 00 00 42  ....M..........B
0010: 41 04 66 AE 41 1F A4 78   B1 91 14 C2 E5 A9 92 87  A.f.A..x........
0020: 48 33 85 4A 2E F8 6E 68   9A D9 0C 15 54 BA 50 7A  H3.J..nh....T.Pz
0030: ED E0 03 2E A4 76 D3 3C   83 4A B6 07 BA 0E 2A A1  .....v.<.J....*.
0040: 9B 73 63 82 4C 2D 7A DC   96 F6 38 91 E2 D9 D8 4B  .sc.L-z...8....K
0050: 7C 78                                              .x
SESSION KEYGEN:
PreMaster Secret:
0000: E7 91 B7 33 39 96 BC A7   64 CA 57 72 F0 F3 3D 55  ...39...d.Wr..=U
0010: 8D 92 46 09 14 EC FE 03   4C D4 5D 78 13 D9 71 F8  ..F.....L.]x..q.
CONNECTION KEYGEN:
Client Nonce:
0000: 5C 24 3A 99 79 97 E9 41   09 92 A2 B7 28 BC CF 49  \$:.y..A....(..I
0010: 51 DE 24 08 91 A0 AE 81   85 1C FC 1C 50 6E A6 D9  Q.$.........Pn..
Server Nonce:
0000: D2 E0 11 21 B8 1A 1A 53   9F 29 F3 FE 5F CD D4 9C  ...!...S.).._...
0010: 2D 81 F7 A7 99 9A BB E4   CA B4 21 1A F8 F1 26 66  -.........!...&f
Master Secret:
0000: 25 58 06 E2 09 FA BD 3F   5B 95 A0 DA 71 43 E2 37  %X.....?[...qC.7
0010: C5 49 02 7B 8D 34 08 72   61 5B 09 21 D2 65 56 88  .I...4.ra[.!.eV.
0020: A1 CD 53 AB 70 E0 FA 04   CD 9C A3 97 75 BC 77 92  ..S.p.......u.w.
... no MAC keys used for this cipher
Client write key:
0000: 04 D4 E6 FB DF F9 B5 E3   FC CA AD 34 7E 2D EB D0  ...........4.-..
Server write key:
0000: 92 8C CB AA EA 53 9D 5C   D7 30 E4 C5 EC 04 0A C5  .....S.\.0......
Client write IV:
0000: ED BC 50 EC                                        ..P.
Server write IV:
0000: 95 3C 80 3C                                        .<.<
main, WRITE: TLSv1.2 Change Cipher Spec, length = 1
[Raw write]: length = 6
0000: 14 03 03 00 01 01                                  ......
*** Finished
verify_data:  { 28, 130, 230, 116, 237, 69, 86, 36, 23, 9, 45, 129 }
***
[write] MD5 and SHA1 hashes:  len = 16
0000: 14 00 00 0C 1C 82 E6 74   ED 45 56 24 17 09 2D 81  .......t.EV$..-.
Padded plaintext before ENCRYPTION:  len = 16
0000: 14 00 00 0C 1C 82 E6 74   ED 45 56 24 17 09 2D 81  .......t.EV$..-.
main, WRITE: TLSv1.2 Handshake, length = 40
[Raw write]: length = 45
0000: 16 03 03 00 28 00 00 00   00 00 00 00 00 01 41 1B  ....(.........A.
0010: 44 6C C3 A5 E1 A8 62 11   C6 85 9F 91 BA 8E 96 1D  Dl....b.........
0020: D9 30 07 0D 3B 3E B7 C2   84 5B AD E2 A5           .0..;>...[...
[Raw read]: length = 5
0000: 15 03 03 00 02                                     .....
[Raw read]: length = 2
0000: 02 28                                              .(
main, READ: TLSv1.2 Alert, length = 2
main, RECV TLSv1.2 ALERT:  fatal, handshake_failure
%% Invalidated:  [Session-1, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
main, called close()
main, called closeInternal(true)

更新

*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Supported Signature Algorithms: SHA512withRSA, Unknown (hash:0x6, signature:0x2), SHA512withECDSA, SHA384withRSA, Unknown (hash:0x5, signature:0x2), SHA384withECDSA, SHA256withRSA, SHA256withDSA, SHA256withECDSA, SHA224withRSA, SHA224withDSA, SHA224withECDSA, SHA1withRSA, SHA1withDSA, SHA1withECDSA
Cert Authorities:
<CN=Yandex Money Root CA, O=PS Yandex.Money, C=RU>
<CN=Yandex Money Issuing CA, O=PS Yandex.Money, C=RU>
<CN=NBCO YM Root, O=Yandex.Money, L=Moscow, C=RU>
<CN=GlobalSign Root CA, OU=Root CA, O=GlobalSign nv-sa, C=BE>
<CN=GlobalSign Domain Validation CA - SHA256 - G2, O=GlobalSign nv-sa, C=BE>
<CN=thawte DV SSL CA - G2, OU=Domain Validated SSL, O="thawte, Inc.", C=US>
<CN=thawte Primary Root CA, OU="(c) 2006 thawte, Inc. - For authorized use only", OU=Certification Services Division, O="thawte, Inc.", C=US>
<CN=NBCO YM Int, DC=yamoney, DC=ru>

共有1个答案

邢弘业
2023-03-14

从调试输出可以看出,服务器成功地从客户端提供的密码中选择了一个密码,并且客户端似乎接受了服务器的证书。还可以看到,握手失败是因为服务器发送了TLS警报。这表明问题是由服务器不喜欢的东西引起的,而不是由客户端不喜欢的东西引起的。

还可以看到(从更新的输出)服务器请求一个客户端证书(CertificateRequest)。但所提供的信息中没有任何内容表明您在密钥存储中有客户端证书-您只显示您导入了一个新的根CA。由于服务器的反应(向客户端发送致命警报)正是当客户端不提供客户端证书(尽管服务器想要一个证书)时所期望的,所以丢失的客户端证书很可能是您的问题的原因。

 类似资料:
  • 问题内容: 我正在尝试建立与trackobot.com的连接以接收一些JSON数据。服务器仅允许通过HTTPS / SSL进行连接。这是代码: openSteam抛出javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure 我通读了与类似问题有关的几篇文章,但没有任何建议可以帮助您。适当的证书在我的信任库中。例如,当我尝试连接到goo

  • 问题内容: 我正在使用Java 6,并尝试使用客户端证书针对远程服务器创建一个。 服务器正在使用自签名的根证书,并且要求提供受密码保护的客户端证书。我已将服务器根证书和客户端证书添加到在中找到的默认Java密钥库中。密钥库文件的名称似乎表明不应将客户端证书放入其中? 无论如何,将根证书添加到此存储解决了臭名昭著的问题 但是,我现在停留在如何使用客户端证书上。我尝试了两种方法,但都无济于事。 首先,

  • 我有一个这样描述的任务: 实现调用按钮: 当点击通话图标时,first Twilio会拨打电话号码#1(管理员) 这时我想出了如何通过浏览器拨打电话号码(比如管理员可以在浏览器中拨打提供商的电话)。 但是我找不到任何信息,如何通过Twilio相应地连接人们的任务。有什么方法可以实现这个解决方案吗?

  • 我正在尝试使用Vertx Webclient连接到AWS API网关: 并且总是收到相同的错误响应,即我们计算的请求签名与您提供的签名不匹配。检查您的AWS秘密访问密钥和签名方法。 但是如果我使用javax.ws.rs.client.WebTarget, 我能够得到适当的回应。 知道Vertx web客户端的不同之处吗?

  • 我正在尝试连接到Amazon上的EC2实例。连接错误时-权限被拒绝(公钥)。安装cmhod 400 mypem.pem文件没有帮助。连接日志: openssh_6.2p2,OSSLShim 0.9.8r 2011年12月8日debug1:读取配置数据/etc/ssh_config debug1:/etc/ssh_config行20:应用*debug1:连接到54.214.31.168[54.214