java - 通过SSL通过Cajo连接时出现javax.net.ssl.SSLHandshakeException

标签 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);
}


客户端程序

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 =服务器,OU =酒吧,O = Foo,L =某些,ST =此处,C = UN
  签名算法:SHA256withRSA,OID = 1.2.840.113549.1.1.11

密钥:Sun RSA公钥,2048位
  模量:31434775225176154525188450095928359730439773654569875739006529498753775941836879335170711581345181627002505013136641662171665561909368111128992563200107296330496960757120954961536110026266883151124825419006377272595234135200675051213302816914418337984097764612958767550798419182794412912305446103091606209963556959114853256386233481900800240210577795238128981652820232312019642106408583884850663783871435028385309369039684834482184818872915700300803897953631336567205645337828655696590723579859939321644377438059078563879623268616615009655624038507147063801873971704632278047739002847454047756775144357906262202283709
  公开指数:65537
  有效性:[发件人:美国东部时间2014年4月16日08:53:44,
               至:2014年7月15日星期二08:53:44]
  发行者:CN =服务器,OU = Bar,O = Foo,L = Some,ST = Where,C = UN
  序列号:[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提供程序是:
初始化信任库
添加为可信证书:
  主题:CN =服务器,OU =酒吧,O = Foo,L =某些,ST =此处,C = UN
  发行者:CN =服务器,OU = Bar,O = Foo,L = Some,ST = Where,C = UN
  算法:RSA;序列号:0x4f991afd
  从2014年4月16日星期三美国东部时间起至2014年7月15日星期二08:53:44美国东部时间有效

添加为可信证书:
  主旨:CN =客户,OU =酒吧,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年美国东部时间星期二7月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提供程序是:
初始化密钥库
SunX509类型的init密钥管理器



找到了关键:mykey
链[0] = [
[
  版本:V3
  主旨:CN =客户,OU =酒吧,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,
               至:2014年7月15日星期二08:54:40]
  发行者:CN =客户,OU = Bar,O = Foo,L = Some,ST = Where,C = UN
  序列号:[34f4b1a1]

证书扩展:1
[1]:ObjectId:2.5.29.14 Criticality = false
SubjectKeyIdentifier [
关键字标识符[
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提供程序是:
初始化信任库
添加为可信证书:
  主题:CN =服务器,OU =酒吧,O = Foo,L =某些,ST =此处,C = UN
  发行者:CN =服务器,OU = Bar,O = Foo,L = Some,ST = Where,C = UN
  算法:RSA;序列号:0x4f991afd
  有效期从美国东部时间2014年4月16日星期三08:53:44至2014年美国东部时间星期二7月15日08:53:44

添加为可信证书:
  主旨:CN =客户,OU =酒吧,O = Foo,L = Some,ST = Where,C = UN
  发行者:CN =客户,OU = Bar,O = Foo,L = Some,ST = Where,C = UN
  算法:RSA;序列号:0x34f4b1a1
  从2014年4月16日星期三美国东部时间起至2014年7月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
初始握手是否正确
是安全的重新协商:false
%%没有缓存的客户端会话
* ClientHello,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:握手期间远程主机关闭连接
main,SEND TLSv1 ALERT:致命,描述= 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个

最佳答案

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

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

关于java - 通过SSL通过Cajo连接时出现javax.net.ssl.SSLHandshakeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23142106/

相关文章:

c# - SSL 网络服务 : Could not create SSL/TLS secure channel

.htaccess - Http 到 Https 但不是整个站点

java - RMI - 引用并使用远程对象作为 HashMap 中的 "key"

java - RMI 内存不足异常

java - 如何使用 AbstractProcessor 访问另一个注解中的注解 - 而不是反射

java - 在 Java 中从 Map 内的 Set 访问对象

java - 从另一个类调用 JFrame 的方法

java - Ehcache 2 maven 依赖

macos - 为什么即使我将自定义 URL 重定向到 127.0.0.1,我仍然看到正在使用本地主机证书?

java - 如何使用 Java RMI 从 Windows 服务控制桌面窗口?