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

时间:2014-04-17 19:45:43

标签: java ssl rmi cajo

我正在开发一个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提供者是: init密钥库 sunX509类型的init keymanager


找到了关键:mykey 链[0] = [ [   版本:V3   主题:CN =服务器,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,                致:Tue Jul 15 08:53:44 EDT 2014]   发行人:CN =服务器,OU = Bar,O = Foo,L = Some,ST = Where,C = UN   SerialNumber:[4f991afd]

证书扩展:1 [1]:ObjectId:2.5.29.14 Criticality = false SubjectKeyIdentifier [ KeyIdentifier [ 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 .."<)!。6o 0060:87 E5 EE 49 86 28 E4 67 30 11 BD CB B5 70 AD D0 ... I。(。g0 .... p .. 0070:22 AD 03 78 3D 9B 7D 65 DE 28 44 3E 4F BB 80 72" .. x = ... e。(D> O..r 0080:0E 3C 29 7D C2 18 4E DB D5 F7 C3 A0 32 D9 E9 07。<)... N ..... 2 ... 0090:7D 84 A6 23 38 8E 63 F6 F2 A1 9B 1E AC DF BD 1A ...#8.c ......... 00A0:9F 5A CA 9F 49 32 01 94 B3 F5 F6 64 6F 43 6D 35 .Z..I2 ..... doCm5 00B0:B5 71 E1 2E 6C FC C3 99 23 DE F9 EB A9 E8 FB 02 .q..l ......#....... 00C0:4F 7D 77 DE 9A F2 FF C2 2E F3 B3 A0 CF 5C 6F 23 O.w .......... \ o# 00D0:D1 B1 93 7B 55 BC C6 A6 2F 07 C2 0D E5 55 8D DD .... U ... / .... U .. 00E0:54 74 2C 85 12 6C E6 7A B0 63 6A 10 72 F9 39 38 Tt,.. l.z.cj.r.98 00F0:99 7C F4 C4 95 2E 79 48 C0 70 A9 B7 57 A9 55 46 ...... yH.p..W.UF


trustStore是:E:\ tmp \ keys \ server.keystore trustStore类型是:jks trustStore提供者是: init truststore 添加为可信证书:   主题:CN =服务器,OU = Bar,O = Foo,L = Some,ST = Where,C = UN   发行人:CN =服务器,OU = Bar,O = Foo,L = Some,ST = Where,C = UN   算法:RSA;序列号:0x4f991afd   有效期为2014年4月16日星期四08:53:44至2014年12月15日星期二08:53:44

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

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

客户端输出

客户端使用192.168.56.1:61354 keyStore是:E:/tmp/keys/client.keystore keyStore类型是:jks keyStore提供者是: init密钥库 sunX509类型的init keymanager


找到了关键: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,                致:Tue Jul 15 08:54:40 EDT 2014]   发行人:CN =客户,OU = Bar,O = Foo,L = Some,ST = Where,C = UN   SerialNumber:[34f4b1a1]

证书扩展:1 [1]:ObjectId:2.5.29.14 Criticality = false SubjectKeyIdentifier [ KeyIdentifier [ 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 Ms .... D.9.2.x.2。 0050:42 4D 6C 53 B7 00 EE 3C CE 3C 68 DA FA AA 28 A0 BMlS ...<。


trustStore是:E:\ tmp \ keys \ client.keystore trustStore类型是:jks trustStore提供者是: init truststore 添加为可信证书:   主题:CN =服务器,OU = Bar,O = Foo,L = Some,ST = Where,C = UN   发行人:CN =服务器,OU = Bar,O = Foo,L = Some,ST = Where,C = UN   算法:RSA;序列号:0x4f991afd   有效期为2014年4月16日星期四08:53:44至2014年12月15日星期二08:53:44

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

触发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 允许不安全的重新协商:false 允许遗留问候消息:true 初始握手:是的 安全的重新谈判:错误 %%没有缓存的客户端会话 * ClientHello,TLSv1 RandomCookie:GMT:1397762666 bytes = {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,格式:[未压缩]


main,WRITE:TLSv1握手,长度= 149 main,收到EOFException:错误 main,处理异常:javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接 main,SEND TLSv1 ALERT:致命,描述= handshake_failure main,WRITE:TLSv1警报,长度= 2 main,名为closeSocket() 线程" main"中的例外情况java.rmi.ConnectIOException:JRMP连接建立期间出错;嵌套异常是:     javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:304)     at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)     at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:341)     at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)     在java.rmi.Naming.lookup(Naming.java:101)     at gnu.cajo.invoke.Remote.getItem(Unknown Source)     在gnu.cajo.Cajo.register(未知来源)     在cajotest.client.Client.main(Client.java:22) 引起:javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946)     at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)     at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:702)     at 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)     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:229)     ......还有7个 引起:java.io.EOFException:SSL对等关闭不正确     at sun.security.ssl.InputRecord.read(InputRecord.java:482)     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)     ......还有14个

1 个答案:

答案 0 :(得分:0)

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

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