【问题标题】:Java SSL handshake failure in Linux but not in OSX and WindowsLinux 中的 Java SSL 握手失败,但在 OSX 和 Windows 中没有
【发布时间】:2014-02-26 15:38:14
【问题描述】:

我正在尝试通过轴访问 Web 服务,但在我的生产服务器(运行 Oracle Java 1.7.0_51)中遇到了一个奇怪的错误。错误是javax.net.ssl.SSLException: Received close_notify during handshake。因此,我创建了一个简单的 java 应用程序来测试与我尝试访问的服务器的 SSL 连接:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.KeyStore;
import java.security.cert.Certificate;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLPeerUnverifiedException;

import org.jsslutils.sslcontext.X509SSLContextFactory;

public class SSLTest {
    public static void main(String args[]) throws Exception {
        KeyStore ks = KeyStore.getInstance("PKCS12");
        ks.load(new FileInputStream(System.getProperty("user.home")
                + "/store.p12"), "pwd".toCharArray());
        X509SSLContextFactory sslContextFactory = new X509SSLContextFactory(ks,
                "pwd", null);
        SSLContext sc = sslContextFactory.buildSSLContext("TLS");
        HttpsURLConnection con = (HttpsURLConnection) (new URL(
                "https://producao.ginfes.com.br/")).openConnection();
        con.setSSLSocketFactory(sc.getSocketFactory());
        print_https_cert(con);
    }

    private static void print_https_cert(HttpsURLConnection con) {

        if (con != null) {

            try {

                System.out.println("Response Code : " + con.getResponseCode());
                System.out.println("Cipher Suite : " + con.getCipherSuite());
                System.out.println("\n");

                Certificate[] certs = con.getServerCertificates();
                for (Certificate cert : certs) {
                    System.out.println("Cert Type : " + cert.getType());
                    System.out.println("Cert Hash Code : " + cert.hashCode());
                    System.out.println("Cert Public Key Algorithm : "
                            + cert.getPublicKey().getAlgorithm());
                    System.out.println("Cert Public Key Format : "
                            + cert.getPublicKey().getFormat());
                    System.out.println("\n");
                }

            } catch (SSLPeerUnverifiedException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

如果我在我的 OSX 开发盒(使用 Oracle Java 1.7.0_51)或我的 Windows 虚拟机(相同的 Java 版本)中运行这个程序,它会按预期通过 SSL 握手。但是,我尝试在 2 台不同的 Linux 机器(一台运行 Debian,一台运行 Ubuntu)上运行此代码,但出现 SSL 握手错误。我尝试将我的 cacerts 从 OSX 复制到 Linux,但结果是一样的。这是 SSL 调试日志的最后部分(在此之前发生的事情是非常标准的,似乎很好):

*** CertificateVerify
main, WRITE: TLSv1 Handshake, length = 262
main, WRITE: TLSv1 Change Cipher Spec, length = 1
*** Finished
verify_data:  { 101, 104, 63, 185, 83, 175, 198, 66, 90, 163, 8, 111 }
***
main, WRITE: TLSv1 Handshake, length = 48
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT:  warning, close_notify
%% Invalidated:  [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA]
main, SEND TLSv1 ALERT:  fatal, description = unexpected_message
main, WRITE: TLSv1 Alert, length = 32
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLException: Received close_notify during handshake

我还注意到,当错误发生时,程序需要更长的时间才能运行(大约 10 秒)。有什么想法吗?

更新:我尝试在 ubuntu 机器上的 OpenJDK 1.6.0_18 上运行上面的程序,结果是一样的。我还尝试在 Debian 虚拟机上运行相同的代码,并且成功了。

更新:我添加了调试级别,并比较了一台正常工作的机器和一台不正常工作的机器之间的日志。

工作机器:

Padded plaintext before ENCRYPTION:  len = 48
0000: 14 00 00 0C 5C A9 32 C7   47 B7 B1 83 96 47 D8 D1  ....\.2.G....G..
0010: 9B BD 15 31 51 2E 45 65   81 2B 1B 26 08 08 8D 1A  ...1Q.Ee.+.&....
0020: E2 85 A5 2A 0B 0B 0B 0B   0B 0B 0B 0B 0B 0B 0B 0B  ...*............
main, WRITE: TLSv1 Handshake, length = 48
[Raw write]: length = 53
0000: 16 03 01 00 30 DB 48 03   85 60 A8 B9 42 0F C6 40  ....0.H..`..B..@
0010: 91 F0 E5 50 1F 41 92 79   5F FE 31 B0 D5 BC D6 61  ...P.A.y_.1....a
0020: C0 50 D6 BB 3D 97 21 A6   ED 50 C1 96 0C 17 BE 41  .P..=.!..P.....A
0030: A8 13 C7 63 C3                                     ...c.
[Raw read]: length = 5
0000: 14 03 01 00 01                                     .....
[Raw read]: length = 1
0000: 01                                                 .
main, READ: TLSv1 Change Cipher Spec, length = 1
[Raw read]: length = 5
0000: 16 03 01 00 30                                     ....0
[Raw read]: length = 48

不工作的机器:

Padded plaintext before ENCRYPTION:  len = 48
0000: 14 00 00 0C C0 77 AD 05   06 CD 4B 55 19 25 22 1E  .....w....KU.%".
0010: 92 2E 87 6D CD 38 06 4E   D2 33 4D 27 4B 2A 05 2B  ...m.8.N.3M'K*.+
0020: DF C2 D1 47 0B 0B 0B 0B   0B 0B 0B 0B 0B 0B 0B 0B  ...G............
main, WRITE: TLSv1 Handshake, length = 48
[Raw write]: length = 53
0000: 16 03 01 00 30 31 5B 38   C5 0D 02 34 A4 8D BB 2D  ....01[8...4...-
0010: 2E A0 96 8E E0 D4 33 43   27 3F DE FB 2D 53 A4 83  ......3C'?..-S..
0020: 67 73 12 C5 A3 61 0C C1   EA C4 AF 0F 1B 44 5F 7B  gs...a.......D_.
0030: B2 21 4D 51 2D                                     .!MQ-

***** It stops here for about 10s *****

[Raw read]: length = 5
0000: 15 03 01 00 02                                     .....
[Raw read]: length = 2
0000: 01 00                                              ..
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT:  warning, close_notify
%% Invalidated:  [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA]
main, SEND TLSv1 ALERT:  fatal, description = unexpected_message

我想主要的区别是我在有问题的机器上得到15 03 01 00 02,而在工作机器上得到14 03 01 00 01

下面是问题机器上握手的更完整的调试日志:

*** CertificateRequest
Cert Types: RSA, DSS
Cert Authorities:
<CN=AC SINCOR RFB G2, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC CAIXA PF v1, OU=Caixa Economica Federal, O=ICP-Brasil, C=BR>
<CN=AC VALID RFB, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC Certisign G3, OU=Instituto Nacional de Tecnologia da Informacao - ITI, O=ICP-Brasil, C=BR>
<CN=AC SOLUTI, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=SERASA Certificadora Digital v1, O=ICP-Brasil, C=BR>
<CN=AC Certisign Multipla G5, OU=Certisign Certificadora Digital S.A., O=ICP-Brasil, C=BR>
<CN=AC Secretaria da Receita Federal do Brasil, O=ICP-Brasil, C=BR>
<CN=AC Instituto Fenacon RFB, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC BR RFB G2, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC CAIXA PJ-1 v1, OU=Caixa Economica Federal, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora da Presidencia da Republica v2, O=ICP-Brasil, C=BR>
<CN=AC SOLUTI Multipla, OU=AC SOLUTI, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=AC PRODEST RFB v2, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC Certisign-JUS G3, OU=Autoridade Certificadora da Justica - AC-JUS, O=ICP-Brasil, C=BR>
<CN=AC SINCOR RFB G4, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=SERASA Autoridade Certificadora Principal v2, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=AC OAB, OU=ORDEM DOS ADVOGADOS DO BRASIL CONSELHO FEDERAL, O=ICP-Brasil, C=BR>
<CN=AC Imprensa Oficial G3, OU=Imprensa Oficial do Estado S A IMESP, O=ICP-Brasil, C=BR>
<CN=SERASA Certificadora Digital v2, O=ICP-Brasil, C=BR>
<CN=AC PRODEMGE G2, OU=Companhia de Tecnologia da Informacao do Estado de MG - PRODEMGE, O=ICP-Brasil, C=BR>
<CN=AC PRODEMGE RFB G3, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC PRODEST RFB V1, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC Certisign Multipla G3, OU=Certisign Certificadora Digital S.A., O=ICP-Brasil, C=BR>
<CN=SERASA Autoridade Certificadora Principal v1, OU=Instituto Nacional de Tecnologia da Informacao - ITI, O=ICP-Brasil, C=BR>
<CN=AC Notarial RFB G3, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC SERASA RFB v1, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC Instituto Fenacon, OU=Certisign Certificadora Digital S.A., O=ICP-Brasil, C=BR>
<CN=AC VALID, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora do PRODERJ v2, OU=Servico Federal de Processamento de Dados - SERPRO, O=ICP-Brasil, C=BR>
<CN=AC CAIXA-JUS v1, OU=Autoridade Certificadora da Justica - AC-JUS, O=ICP-Brasil, C=BR>
<CN=AC CAIXA v1, OU=Autoridade Certificadora Raiz Brasileira v1, O=ICP-Brasil, C=BR>
<CN=AC SINCOR G3, OU=SINCOR-SP - Sindicato dos Corretores de Seguros no Estado de SP, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora da Casa da Moeda do Brasil, O=ICP-Brasil, C=BR>
<CN=AC Secretaria da Receita Federal do Brasil v3, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=AC Certisign SPB G5, OU=CSPB-2, OU=Certisign Certificadora Digital S.A., O=ICP-Brasil, C=BR>
<CN=AC Imprensa Oficial G2, OU=Imprensa Oficial do Estado S A IMESP, O=ICP-Brasil, C=BR>
<CN=AC PRODEMGE RFB G2, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC FENACON Certisign RFB G3, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC Notarial RFB G2, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC Certisign G5, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=AC OAB G2, OU=ORDEM DOS ADVOGADOS DO BRASIL CONSELHO FEDERAL, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora Raiz Brasileira v1, OU=Instituto Nacional de Tecnologia da Informacao - ITI, O=ICP-Brasil, C=BR>
<CN=AC BR RFB G3, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC FENACON Certisign RFB G2, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC SINCOR G2, OU=SINCOR-SP - Sindicato dos Corretores de Seguros no Estado de SP, O=ICP-Brasil, C=BR>
<CN=AC CAIXA PF v2, OU=Caixa Economica Federal, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora do SERPRO Final v2, OU=CSPB-1, OU=Servico Federal de Processamento de Dados - SERPRO, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora SERPRO v2, O=ICP-Brasil, C=BR>
<CN=AC SERASA-JUS v2, OU=Autoridade Certificadora da Justica - AC-JUS, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora da Casa da Moeda do Brasil v2, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=AC Certisign RFB G3, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora SERPRO v3, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora da Presidencia da Republica v3, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=AC Imprensa Oficial SP RFB G3, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC Imprensa Oficial SP RFB G2, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC SERPRO-JUS v4, OU=Autoridade Certificadora da Justica - AC-JUS, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora do SERPRORFB, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC PETROBRAS G3, OU=PETROLEO BRASILEIRO S A PETROBRAS, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora da Justica v3, OU=Instituto Nacional de Tecnologia da Informacao - ITI, O=ICP-Brasil, C=BR>
<CN=AC CAIXA PJ v2, OU=Caixa Economica Federal, O=ICP-Brasil, C=BR>
<CN=SERASA Autoridade Certificadora v2, OU=CSPB-4, O=ICP-Brasil, C=BR>
<CN=AC CAIXA PJ v1, OU=Caixa Economica Federal, O=ICP-Brasil, C=BR>
<CN=AC FENACOR v1, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora Raiz Brasileira v2, OU=Instituto Nacional de Tecnologia da Informacao - ITI, O=ICP-Brasil, C=BR>
<CN=AC VALID BRASIL, OU=Autoridade Certificadora VALID - AC VALID, O=ICP-Brasil, C=BR>
<CN=AC Instituto Fenacon G2, OU=Certisign Certificadora Digital S.A., O=ICP-Brasil, C=BR>
<CN=AC CAIXA-JUS v2, OU=Autoridade Certificadora da Justica - AC-JUS, O=ICP-Brasil, C=BR>
<CN=AC SERASA RFB v2, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC CAIXA v2, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=AC SINCOR RFB G3, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC Certisign G6, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=AC Certisign SPB G3, OU=CSPB-2, OU=Certisign Certificadora Digital S.A., O=ICP-Brasil, C=BR>
<CN=AC Instituto Fenacon RFB G2, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC PRODEMGE G3, OU=Companhia de Tecnologia da Informacao do Estado de MG - PRODEMGE, O=ICP-Brasil, C=BR>
<CN=AC Imprensa Oficial SP G3, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora SERPRORFB v3, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=AC CAIXA PF-1 v1, OU=Caixa Economica Federal, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora da Justica v4, OU=Autoridade Certificadora Raiz Brasileira v2, O=ICP-Brasil, C=BR>
<CN=AC Certisign RFB G4, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR>
<CN=Autoridade Certificadora do SERPRO Final v3, OU=CSPB-1, OU=Servico Federal de Processamento de Dados - SERPRO, O=ICP-Brasil, C=BR>
<CN=SERASA Autoridade Certificadora v1, OU=CSPB-4, O=ICP-Brasil, C=BR>
<CN=AC PETROBRAS G2, OU=PETROLEO BRASILEIRO S A PETROBRAS, O=ICP-Brasil, C=BR>
*** ServerHelloDone
matching alias: reck
*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: CN=RECK ADUANEIRA DA AMAZONIA LTDA EPP:04196535000130, OU=Autenticado por Certisign Certificadora Digital, OU=RFB e-CNPJ A1, OU=Secretaria da Receita Federal do Brasil - RFB, L=Manaus, ST=AM, O=ICP-Brasil, C=BR
  Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11

  Key:  Sun RSA public key, 2048 bits
  modulus: 24264184986868774817109830233364138275159044314776683839159346319997124349933949877714767467019900893922103704627632635801354814980174333627259816789227876034401362981372036626722143197822471256073667985551606390419290945624717517336706723117075591357700922888857619015416854504245521884304442214801958124913868169748389485419085887733283148575345306707962145302335042268398018623594061588310268698492035969886039355083147115598208957166248264558044010787457176664927563276373784025971208332280527156543734405427875599738053187830200999849548622241460736320436233846016936389807957942162381899068664985384000873470187
  public exponent: 65537
  Validity: [From: Mon Feb 24 20:00:00 AMT 2014,
               To: Tue Feb 24 19:59:59 AMT 2015]
  Issuer: CN=AC Certisign RFB G4, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR
  SerialNumber: [    7fba6035 25b2378c abca9da3 6e5a5932]

Certificate Extensions: 8
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
  [
   accessMethod: caIssuers
   accessLocation: URIName: http://icp-brasil.certisign.com.br/repositorio/certificados/AC_Certisign_RFB_G4.p7c
, 
   accessMethod: ocsp
   accessLocation: URIName: http://ocsp.certisign.com.br
]
]

[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 2E 91 EA D6 6D E5 B2 59   82 DC 38 85 29 76 34 16  ....m..Y..8.)v4.
0010: 56 3C D0 3E                                        V<.>
]
]

[3]: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:false
  PathLen: undefined
]

[4]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
  [DistributionPoint:
     [URIName: http://icp-brasil.certisign.com.br/repositorio/lcr/ACCertisignRFBG4/LatestCRL.crl]
, DistributionPoint:
     [URIName: http://icp-brasil.outralcr.com.br/repositorio/lcr/ACCertisignRFBG4/LatestCRL.crl]
, DistributionPoint:
     [URIName: http://repositorio.icpbrasil.gov.br/lcr/Certisign/ACCertisignRFBG4/LatestCRL.crl]
]]

[5]: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
  [CertificatePolicyId: [2.16.76.1.2.1.12]
[PolicyQualifierInfo: [
  qualifierID: 1.3.6.1.5.5.7.2.1
  qualifier: 0000: 16 5C 68 74 74 70 3A 2F   2F 69 63 70 2D 62 72 61  .\http://icp-bra
0010: 73 69 6C 2E 63 65 72 74   69 73 69 67 6E 2E 63 6F  sil.certisign.co
0020: 6D 2E 62 72 2F 72 65 70   6F 73 69 74 6F 72 69 6F  m.br/repositorio
0030: 2F 64 70 63 2F 41 43 5F   43 65 72 74 69 73 69 67  /dpc/AC_Certisig
0040: 6E 5F 52 46 42 2F 44 50   43 5F 41 43 5F 43 65 72  n_RFB/DPC_AC_Cer
0050: 74 69 73 69 67 6E 5F 52   46 42 2E 70 64 66        tisign_RFB.pdf

]]  ]
]

[6]: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
  clientAuth
  emailProtection
]

[7]: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  DigitalSignature
  Non_repudiation
  Key_Encipherment
]

[8]: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
  Other-Name: Unrecognized ObjectIdentifier: 2.16.76.1.3.4
  Other-Name: Unrecognized ObjectIdentifier: 2.16.76.1.3.2
  Other-Name: Unrecognized ObjectIdentifier: 2.16.76.1.3.3
  Other-Name: Unrecognized ObjectIdentifier: 2.16.76.1.3.7
  RFC822Name: raraujo@reckaduaneira.com.br
]

]
  Algorithm: [SHA256withRSA]
  Signature:
0000: 9E E2 B9 4D DC B5 86 67   36 2E 08 30 66 43 2A EB  ...M...g6..0fC*.
0010: C6 BA 45 5F BF 5D 9D 9E   B0 FD 20 50 75 12 C2 4E  ..E_.].... Pu..N
0020: D1 FC 46 2C 33 DB 04 31   B9 1C 6F C1 53 DE 58 F6  ..F,3..1..o.S.X.
0030: F7 BF A8 D8 E3 DD 88 05   4B 8B 7A 37 8F 92 C6 47  ........K.z7...G
0040: 40 AE 7F 95 32 FD 82 0C   4E 10 73 A2 21 D8 BF F0  @...2...N.s.!...
0050: 0A EC 1D 14 96 32 98 78   00 18 16 62 EA 3E 99 8F  .....2.x...b.>..
0060: 6F 55 71 63 A0 72 81 AE   EC F7 19 70 4B 36 4C B4  oUqc.r.....pK6L.
0070: 2B 76 7B 95 36 BA DA CA   38 B7 EE 8F F2 C8 76 AE  +v..6...8.....v.
0080: 47 F9 D0 C0 DB 2F 0A 21   F1 25 83 E8 E5 72 A9 7D  G..../.!.%...r..
0090: 4C C7 6A F8 7D D7 7D C8   D5 7F 67 E8 F8 A2 9D 75  L.j.......g....u
00A0: D0 69 8F 44 CF 04 DA 8D   77 A6 75 BD 7E 83 4C FB  .i.D....w.u...L.
00B0: E6 8C D9 79 12 3B A6 5E   A6 56 1F C8 E6 99 75 DE  ...y.;.^.V....u.
00C0: 93 3B 96 6C 87 A9 EF 99   8C D2 EA BD C5 24 28 86  .;.l.........$(.
00D0: 69 BD 4C 85 06 88 DE 78   06 C1 42 D0 07 1F F6 06  i.L....x..B.....
00E0: EF 32 17 49 22 B1 68 5C   80 CB 51 C4 1F F5 EB 1F  .2.I".h\..Q.....
00F0: A7 D6 A9 36 04 27 38 A4   08 97 78 80 2C 10 55 47  ...6.'8...x.,.UG
0100: C3 9B 1C 72 8F 73 56 85   30 29 82 99 E6 86 F3 09  ...r.sV.0)......
0110: 7F 3D 65 40 3F 8A BE E8   6F 12 AB FE 5C B6 9F 3F  .=e@?...o...\..?
0120: 37 7F B1 75 C0 3A 05 8D   5B 30 27 EA E7 A7 D2 4F  7..u.:..[0'....O
0130: 2D 57 1D E3 7B 8B 88 18   0A 53 26 8B AD D6 98 BB  -W.......S&.....
0140: 05 13 EE 29 0F BD 8D BC   C0 F9 40 26 28 23 D5 9F  ...)......@&(#..
0150: 1B 01 3A 8A 6E 6D 07 8A   73 78 75 84 10 30 C9 E9  ..:.nm..sxu..0..
0160: 87 DC 62 C8 43 60 95 ED   42 FB 72 3F E0 F1 0E 03  ..b.C`..B.r?....
0170: CE 61 69 EC 74 E2 9E E9   99 37 AA 60 29 E6 4B 7D  .ai.t....7.`).K.
0180: 68 54 8F 5F 62 33 81 98   24 FC FE 55 11 B8 D5 3F  hT._b3..$..U...?
0190: 4D DC E7 91 66 99 92 66   0E 5F D9 1A B1 79 29 8F  M...f..f._...y).
01A0: 2D 64 90 B6 65 27 B5 B7   50 90 7F 3D DD 9F 04 71  -d..e'..P..=...q
01B0: B2 62 6C 9D 1A 84 59 A3   C8 F2 E0 14 CC DB 7F 6E  .bl...Y........n
01C0: 1F CA 26 DE C6 79 DC B4   1C 11 98 27 93 02 BF 63  ..&..y.....'...c
01D0: 9F FD 64 DB D3 AB D3 71   30 44 C3 27 81 45 66 5E  ..d....q0D.'.Ef^
01E0: B1 E8 F1 31 86 57 8C 0F   56 0A F4 73 EC 92 86 6E  ...1.W..V..s...n
01F0: E8 D6 AD 7A F7 46 BF 19   57 E2 10 BB 8D 10 D9 CC  ...z.F..W.......

]
***
*** ClientKeyExchange, RSA PreMasterSecret, TLSv1
main, WRITE: TLSv1 Handshake, length = 2427
SESSION KEYGEN:
PreMaster Secret:
0000: 03 01 60 9E 6C E9 27 4A   72 09 D1 52 89 13 AE 49  ..`.l.'Jr..R...I
0010: 63 C2 E7 65 01 7E B5 D3   B3 3D 8E 26 A4 EC 4F 98  c..e.....=.&..O.
0020: DF C1 75 8B 05 87 4D 49   09 85 BD E1 11 9C 39 65  ..u...MI......9e
CONNECTION KEYGEN:
Client Nonce:
0000: 53 0F 26 B0 D4 96 D4 FF   C3 5A 90 A5 59 6D 62 92  S.&......Z..Ymb.
0010: C2 C0 6A 5B 53 8F 03 82   F6 DB DA 12 CF C4 92 74  ..j[S..........t
Server Nonce:
0000: 53 0F 26 AE 59 92 B6 3F   9B 5F 31 51 1C 6B C6 63  S.&.Y..?._1Q.k.c
0010: 4F 82 F3 6A 57 E3 76 8B   57 F4 1B 63 E3 FF DC F2  O..jW.v.W..c....
Master Secret:
0000: 73 EE 18 E9 0F 0A 05 B0   DC 88 93 B3 0D E0 C4 FE  s...............
0010: C1 D1 18 66 D7 32 7A E2   6A 7D 8B 26 77 42 10 16  ...f.2z.j..&wB..
0020: 26 94 04 B6 41 56 E0 14   DC 1C B1 99 3A 21 DB DC  &...AV......:!..
Client MAC write Secret:
0000: 18 9E 28 78 D6 7D 5C 41   7D CB C6 36 1B AC D7 43  ..(x..\A...6...C
0010: 66 4D 49 74                                        fMIt
Server MAC write Secret:
0000: 4F E9 4B FE 71 B0 03 7A   6E 27 34 4E 25 23 54 90  O.K.q..zn'4N%#T.
0010: 7A 09 D2 90                                        z...
Client write key:
0000: 36 68 CF 35 5D ED 5F 47   0B 3A 4A 7B 39 03 6C E4  6h.5]._G.:J.9.l.
Server write key:
0000: 8D 1C F6 9B A6 67 4A F6   9C 11 25 71 C1 CD D7 18  .....gJ...%q....
Client write IV:
0000: 39 D4 9B 42 92 E4 FD AA   10 82 3D 53 F1 55 14 DC  9..B......=S.U..
Server write IV:
0000: 59 75 C5 B2 AC F1 D6 BD   27 EF 95 2F B5 99 11 48  Yu......'../...H
*** CertificateVerify
main, WRITE: TLSv1 Handshake, length = 262
main, WRITE: TLSv1 Change Cipher Spec, length = 1
*** Finished
verify_data:  { 88, 21, 98, 75, 128, 1, 201, 112, 209, 181, 184, 61 }
***
main, WRITE: TLSv1 Handshake, length = 48
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT:  warning, close_notify
%% Invalidated:  [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA]
main, SEND TLSv1 ALERT:  fatal, description = unexpected_message
main, WRITE: TLSv1 Alert, length = 32
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLException: Received close_notify during handshake

更新:我之前提到过该程序在 Debian 虚拟机上运行。事实证明,这取决于。如果虚拟机的网络适配器设置为 NAT(通过我的 OSX 开发盒),它确实可以工作。但是,如果我将网络适配器设置为桥接并在我的网络中选择一个常规 IP,它就不起作用;它给了我与我的生产框相同的 close_notify 错误。

又一次更新:我登录了一台有问题的机器,并设置了一个反向 ssh 隧道到我的盒子,该隧道指向了有问题的地址。然后,我运行指向 localhost(而不是直接地址)的示例程序,以便将请求通过隧道传送到我的开发箱,后者将其传送到适当的服务器。你猜怎么着?有效。我的问题没有解决,因为这显然不是一个合适的解决方案。

【问题讨论】:

  • 15 03 01 00 02 01 00close_notify. 您需要发布更多 SSL 日志,比如从 CertificateRequest. 开始
  • @EJP 我刚刚按照您的要求使用更完整版本的握手日志更新了我的问题。感谢您的帮助
  • @EJP 另外,请参阅我的最新更新。这很奇怪。
  • 是的。我无法解释。您正在按要求发送证书,这是我最关心的问题。似乎服务器以某种方式有额外的挑剔。服务器是 Java 的吗?如果是这样,您可以在启用 SSL 日志记录的情况下运行它吗?并在这里发布相关信息?如果没有,您能否检查其日志中的 SSL 消息?
  • @EJP 我已经完全将 Java 与问题隔离开来。我现在正在用 wget 和 openssl 重现问题。另外,我无法控制服务器,但我认为它是 IIS。鉴于问题的性质,在 serverfault 上创建另一个问题更合适。如果那里得到回答,我也会在这里发布答案。

标签: java linux ssl


【解决方案1】:

看起来服务器不喜欢您发送的证书。您需要将 keystore 从工作平台复制到非工作平台。

我需要从CerticateRequest 消息开始查看更多 SSL 转储以进一步提供帮助。

【讨论】:

  • 我在两台机器上使用相同的密钥库。我实际上将密钥库文件从工作平台复制到了非工作平台。
  • 请注意,我说的是密钥库而不是信任库。
  • 我复制了密钥库,它只包含一个证书。
  • 好吧,如果没有更多 SSL 日志,我将无法提供更多帮助。
  • 它与 java 无关,与我的网络有关。请参阅下面的答案。
【解决方案2】:

事实证明,这个问题与 Java 无关,而与我的 ISP 提供给我的电缆调制解调器有关。我的网络设置如下:

  • TP-Link TL-ER5120 用作网关和防火墙(以及链路负载平衡器)
  • 两个 Internet 链接服务器由相同的 Thomson DWG874B 电缆调制解调器提供
  • 由连接到 3G USB 调制解调器的 TL-MR3020 提供的互联网链接

3G 调制解调器确实是一种故障转移措施。如果我通过 3G 调制解调器路由服务器流量,则 SSL 连接将起作用。所以问题出在电缆调制解调器或 ISP 本身。我在家里使用相同的 ISP(使用不同的电缆调制解调器)并且连接正常。所以我把它固定在电缆调制解调器上。

那个有线调制解调器实际上也是一个无线路由器(尽管无线被禁用)。调制解调器有一个 DCHP 服务器,它为我的防火墙分配一个本地 IP。所以我的实际本地网络类似于 192.168.0.x,在我的防火墙和电缆调制解调器之间还有另一个网络,比如说 192.168.1.x,并且电缆调制解调器有一个公共 IP 地址。我从来没有真正喜欢过这种设置,但它似乎没有造成任何伤害,所以我接受了它。

有线调制解调器有一个设置,使其表现为纯有线调制解调器,并为连接到它的任何设备分配来自 ISP 的公共 IP。该设置称为切换模式,如下图(之前的设置为 Legacy RG IPv4 Mode)。

我一使用它,我与该特定网站的 SSL 连接就开始从 Linux 重新开始工作。我不知道发生了什么,但我很高兴它已修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2018-03-31
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    相关资源
    最近更新 更多