javax.net.ssl.SSLHandshakeException 通过 Cajo over SSL 连接时出现问题

Posted

技术标签:

【中文标题】javax.net.ssl.SSLHandshakeException 通过 Cajo over SSL 连接时出现问题【英文标题】:javax.net.ssl.SSLHandshakeException when connecting via Cajo over SSL issue 【发布时间】:2014-06-02 06:05:48 【问题描述】:

我正在开发一个 Cajo 实现,需要让它在 SSL 上运行。无论出于何种原因,都会引发 javax.net.ssl.SSLHandshakeException。谁能提供一些关于如何让 Cajo 通过 SSL 工作的帮助?我正在使用 Cajo v1.175。

我确信这是一个简单修复的简单问题,但在 RMI 方面我是个菜鸟......

完整代码、证书和错误消息位于http://www.mikebryant.com/misc/cajo/cajossl.zip

非常感谢任何帮助!

根据要求,这里是一些代码示例和错误消息...... 我从http://www.cs.columbia.edu/~akonstan/rmi-ssl/得到的服务器套接字代码

Server.java

private static int port = 61354;

@SuppressWarnings("javadoc")
public static void main(String args[]) throws Exception 
    String ip = InetAddress.getLocalHost().getHostAddress();
    Remote.config(ip, Constants.PORT, null, 0);

    java.rmi.server.RMISocketFactory.setSocketFactory(new cajotest.rmi.SecureRMISocketFactory());
    Cajo cajo = new Cajo();
    cajo.export(new ServiceImpl());

    System.out.println("Server running on " + InetAddress.getLocalHost() + ":" + Constants.PORT);

Client.java

private static String host = "192.168.56.1";


public static void main(String args[]) throws Exception 
    System.out.println("Client using " + host + ":" + Constants.PORT);

    java.rmi.server.RMISocketFactory.setSocketFactory(new cajotest.rmi.SecureRMISocketFactory());

    Cajo cajo = new Cajo();
    cajo.register(host, Constants.PORT);

    Object refs[] = cajo.lookup(Service.class);
    if (refs.length > 0) 
        Service svc = (Service) cajo.proxy(refs[0], Service.class);
        String helloResponse = svc.sayHello("Mike");
        System.out.println(helloResponse);
     else 
        System.out.println("No server objects found");
    

    System.exit(0);

服务器输出

keyStore 是:E:/tmp/keys/server.keystore keyStore 类型为:jks keyStore 提供者是: 初始化密钥库 SunX509 类型的 init 密钥管理器


找到密钥:mykey 链 [0] = [ [ 版本:V3 主题:CN=Server,OU=Bar,O=Foo,L=Some,ST=Where,C=UN 签名算法:SHA256withRSA,OID = 1.2.840.113549.1.1.11

密钥:Sun RSA 公钥,2048 位 模量:31434775225176154525188450095928359730439773654569875739006529498753775941836879335170711581345181627002505013136641662171665561909368111128992563200107296330496960757120954961536110026266883151124825419006377272595234135200675051213302816914418337984097764612958767550798419182794412912305446103091606209963556959114853256386233481900800240210577795238128981652820232312019642106408583884850663783871435028385309369039684834482184818872915700300803897953631336567205645337828655696590723579859939321644377438059078563879623268616615009655624038507147063801873971704632278047739002847454047756775144357906262202283709 公共指数:65537 有效期:[来自:2014 年 4 月 16 日星期三 08:53:44 EDT, 至:2014 年 7 月 15 日星期二 08:53:44 EDT] 发行者:CN=Server, OU=Bar, O=Foo, L=Some, ST=Where, C=UN 序列号:[4f991afd]

证书扩展:1 [1]:对象 ID:2.5.29.14 关键性 = 假 主题密钥标识符 [ 密钥标识符 [ 0000:FA 7D 37 D8 66 14 CC 5B A6 BF EA 53 74 63 91 8F ..7.f..[...Stc.. 0010: EA 55 82 8F .U.. ] ]

] 算法:[SHA256withRSA] 签名: 0000: 54 67 10 1F 22 79 9F C1 39 02 B3 99 31 4E 4F B7 Tg.."y..9...1NO. 0010: 86 5B 6C B6 35 95 97 77 A0 49 80 EC 53 A4 7E C1 .[l.5..w.I..S... 0020: 3F B0 0F 20 7B 80 D3 6B 32 C2 4B E4 E2 53 C0 59 ?.. ...k2.K..S.Y 0030: 53 98 C3 4D 93 5E F7 10 E5 51 19 DF A5 B8 27 90 S..M.^...Q....'。 0040: 58 AC 91 FA 5A 9A A0 73 CA C1 A0 08 A2 96 8E E2 X...Z..s........ 0050: DE C6 0D 63 9A 66 52 BD F4 22 3C 29 21 15 36 6F ...c.fR.."O..r 0080: 0E 3C 29 7D C2 18 4E DB D5 F7 C3 A0 32 D9 E9 07 .

]


trustStore 是:E:\tmp\keys\server.keystore trustStore 类型是:jks trustStore 提供者是: 初始化信任库 添加为受信任的证书: 主题:CN=Server,OU=Bar,O=Foo,L=Some,ST=Where,C=UN 发行者:CN=Server, OU=Bar, O=Foo, L=Some, ST=Where, C=UN 算法:RSA;序列号:0x4f991afd 有效期从 2014 年 4 月 16 日星期三 08:53:44 EDT 到 2014 年 7 月 15 日星期二 08:53:44 EDT

添加为受信任的证书: 主题:CN=Client、OU=Bar、O=Foo、L=Some、ST=Where、C=UN 发行人:CN=Client, OU=Bar, O=Foo, L=Some, ST=Where, C=UN 算法:RSA;序列号:0x34f4b1a1 有效期为 2014 年 4 月 16 日星期三 08:54:40 EDT 至 2014 年 7 月 15 日星期二 08:54:40 EDT

触发 SecureRandom 播种 完成播种 SecureRandom 在 Coruscant/192.168.56.1:61354 上运行的服务器

客户端输出

客户端使用 192.168.56.1:61354 keyStore 是:E:/tmp/keys/client.keystore keyStore 类型为:jks keyStore 提供者是: 初始化密钥库 SunX509 类型的 init 密钥管理器


找到密钥:mykey 链 [0] = [ [ 版本:V3 主题:CN=Client、OU=Bar、O=Foo、L=Some、ST=Where、C=UN 签名算法:SHA256withRSA,OID = 1.2.840.113549.1.1.11

密钥:Sun RSA 公钥,2048 位 模量:17138097295393612277035352117769395039898411523084254468636172064694291643785627714254568170929877396708304047390061148924969763142078656182412595021000020409534532998798795520686728121819932399147428088113942915656945012724682101815391741129215424540207649843144893952660981710728604065430397993949203653373697078227603166902329372420465918295279504255056173129004094269357111536832825597754454857829397305965490792521265512567191812885625114031306416897590287126686684695535655220394890619907763314629130717883370421294661388162541292858875691164575058279131977342304495210869976587846586803189943875996789637083793 公共指数:65537 有效期:[来自:2014 年 4 月 16 日星期三 08:54:40 EDT, 至:2014 年 7 月 15 日星期二 08:54:40 EDT] 发行人:CN=Client, OU=Bar, O=Foo, L=Some, ST=Where, C=UN 序列号:[34f4b1a1]

证书扩展:1 [1]:对象 ID:2.5.29.14 关键性 = 假 主题密钥标识符 [ 密钥标识符 [ 0000: 76 5E 19 97 98 E4 33 E9 9B B9 31 E9 B6 D0 F0 F2 v^....3...1..... 0010: 56 37 CE 18 V7.. ] ]

] 算法:[SHA256withRSA] 签名: 0000: 7D 63 DA B3 ED 5A 32 DB 48 66 80 89 5B 05 1C 36 .c...Z2.Hf..[..6 0010: 93 7D 47 75 D6 F1 74 82 7F 12 04 8C CB 20 AB E5 ..Gu..t....... 0020: 90 4A 5D B7 90 1E 98 5D CF 7E 86 EA DC 3B 64 4A .J]....]....;dJ 0030: 5D B3 DB 76 DE C0 65 1F AB 07 22 08 D9 F3 F1 CF ]..v..e..."..... 0040: 4D 73 A8 E6 BC 94 44 02 39 0D 32 84 78 1E 32 DD 女士....D.9.2.x.2。 0050: 42 4D 6C 53 B7 00 EE 3C CE 3C 68 DA FA AA 28 A0 BMS...<.>

]


trustStore 是:E:\tmp\keys\client.keystore trustStore 类型是:jks trustStore 提供者是: 初始化信任库 添加为受信任的证书: 主题:CN=Server,OU=Bar,O=Foo,L=Some,ST=Where,C=UN 发行者:CN=Server, OU=Bar, O=Foo, L=Some, ST=Where, C=UN 算法:RSA;序列号:0x4f991afd 有效期从 2014 年 4 月 16 日星期三 08:53:44 EDT 到 2014 年 7 月 15 日星期二 08:53:44 EDT

添加为受信任的证书: 主题:CN=Client、OU=Bar、O=Foo、L=Some、ST=Where、C=UN 发行人:CN=Client, OU=Bar, O=Foo, L=Some, ST=Where, C=UN 算法:RSA;序列号:0x34f4b1a1 有效期为 2014 年 4 月 16 日星期三 08:54:40 EDT 至 2014 年 7 月 15 日星期二 08:54:40 EDT

触发 SecureRandom 播种 完成播种 SecureRandom 忽略不可用的密码套件:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 忽略不可用的密码套件:TLS_DHE_RSA_WITH_AES_256_CBC_SHA 忽略不可用的密码套件:TLS_ECDH_RSA_WITH_AES_256_CBC_SHA 忽略不支持的密码套件:TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 忽略不支持的密码套件:TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 忽略不支持的密码套件:TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 忽略不支持的密码套件:TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 忽略不支持的密码套件:TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 忽略不支持的密码套件:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 忽略不支持的密码套件:TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 忽略不支持的密码套件:TLS_RSA_WITH_AES_256_CBC_SHA256 忽略不可用的密码套件:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 忽略不支持的密码套件:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 忽略不支持的密码套件:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 忽略不可用的密码套件:TLS_DHE_DSS_WITH_AES_256_CBC_SHA 忽略不支持的密码套件:TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 忽略不支持的密码套件:TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 忽略不支持的密码套件:TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 忽略不可用的密码套件:TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA 忽略不可用的密码套件:TLS_RSA_WITH_AES_256_CBC_SHA 忽略不支持的密码套件:TLS_RSA_WITH_AES_128_CBC_SHA256 允许不安全的重新协商:错误 允许遗留问候消息:true 是否是初始握手:true 是否安全重新协商:错误 %% 没有缓存的客户端会话 * 客户端你好,TLSv1 RandomCookie: GMT: 1397762666 字节 = 92, 155, 95, 199, 227, 200, 183, 73, 110, 151, 210, 240, 190, 70, 181, 238, 2, 129, 136, 117, 166, 211、25、2、235、239、76、228 会话 ID: 密码套件:[TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,SSL_RSA_WITH_RC4_128_SHA,TLS_ECDH_ECDSA_WITH_RC4_128_SHA,TLS_ECDH_RSA_WITH_RC4_128_SHA,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_RC4_128_MD5,TLS_EMPTY_RENEGOTIATION_INFO_SCSV] 压缩方法:0 扩展elliptic_curves,曲线名称:secp256r1,sect163k1,sect163r2,secp192r1,secp224r1,sect233k1,sect233r1,sect283k1,sect283r1,secp384r1,sect409k1,sect409r1,secp521r1,sect571k1,sect571r1,secp160k1,secp160r1,secp160r2,sect163r1,secp192k1,sect193r1,sect193r2 , secp224k1, sect239k1, secp256k1 扩展 ec_point_formats,格式:[未压缩]


主要,写入:TLSv1 握手,长度 = 149 主要,收到EOFException:错误 主要,处理异常:javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接 主要,发送 TLSv1 警报:致命,描述 = handshake_failure 主要,写入:TLSv1 警报,长度 = 2 主要的,称为 closeSocket() 线程“主”java.rmi.ConnectIOException 中的异常:JRMP 连接建立期间出错;嵌套异常是: javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接 在 sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:304) 在 sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 在 sun.rmi.server.UnicastRef.newCall(UnicastRef.java:341) 在 sun.rmi.registry.RegistryImpl_Stub.lookup(未知来源) 在 java.rmi.Naming.lookup(Naming.java:101) 在 gnu.cajo.invoke.Remote.getItem(未知来源) 在 gnu.cajo.Cajo.register(未知来源) 在 cajotest.client.Client.main(Client.java:22) 引起:javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946) 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) 在 sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:702) 在 sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122) 在 java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) 在 java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) 在 java.io.DataOutputStream.flush(DataOutputStream.java:123) 在 sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:229) ... 7 更多 原因:java.io.EOFException:SSL 对等体错误关闭 在 sun.security.ssl.InputRecord.read(InputRecord.java:482) 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927) ... 14 更多

【问题讨论】:

请在您的帖子中包含相关代码和错误。 添加了代码和错误消息。谢谢。 您应该将客户端的系统属性javax.net.debug设置为ssl,handshake,record并分析调试输出。 Marcel:以上消息来自 javax.net.debug.. 【参考方案1】:

在客户端中,在进行查找后设置全局套接字工厂。否则它也适用于此,并且要求注册表使用 SSL,这显然不是。

您不应该使用 RMISocketFactory。它在 1998 年被弃用,或者至少被 RMIServerSocketFactory 和 RMIClientSocketFactory 淘汰。

【讨论】:

以上是关于javax.net.ssl.SSLHandshakeException 通过 Cajo over SSL 连接时出现问题的主要内容,如果未能解决你的问题,请参考以下文章