1

我正在研究 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/获得的服务器套接字代码

服务器.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);
}

客户端.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 provider 是:init keystore init keymanager of type SunX509


找到密钥: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 位模数:公共指数: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=联合国序列号:[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..wI.S... 0020: 3F B0 0F 20 7B 80 D3 6B 32 C2 4B E4 E2 53 C0 59 ?.. ...k2.K..SY 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 Ow.........\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,..lzcj。 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=Server,OU=Bar,O=Foo,L=Some,ST=Where , C=UN Issuer: 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=其中,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 provider 是:init keystore init keymanager of type SunX509


找到密钥: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 位模数:公共指数: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=联合国序列号:[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 添加为受信任的证书:Subject:CN=Server,OU=Bar,O=Foo,L=Some,ST=Where , C=UN Issuer: 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=其中,C=UN 算法:RSA;序列号:0x34f4b1a1 有效期从 2014 年 4 月 16 日星期三 08:54:40 EDT 到 2014 年 7 月 15 日星期二 08:54:40 EDT

trigger seeding of SecureRandom done seeding SecureRandom Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 Ignoring不支持的密码套件: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 Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA Ignoring不可用的密码套件:TLS_RSA_WITH_AES_256_CBC_SHA 忽略不支持的密码套件:TLS_RSA_WITH_AES_128_CBC_SHA256 允许不安全的重新协商:false 允许旧的 hello 消息:true 是初始握手:true 是否安全重新协商: false %% 没有缓存的客户端会话 *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 } Session ID: {} Cipher Suites: [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] Compression Methods: { 0 } Extension elliptic_curves, curve names: {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,格式:[未压缩]sect193r1, sect193r2, secp224k1, sect239k1, secp256k1} 扩展 ec_point_formats,格式:[未压缩]sect193r1, sect193r2, secp224k1, sect239k1, secp256k1} 扩展 ec_point_formats,格式:[未压缩]


主要,写入:TLSv1 握手,长度 = 149 主要,收到 EOFException:错误主要,处理异常:javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接主要,发送 TLSv1 警报:致命,描述 = 握手失败主要,写入: TLSv1 Alert,length = 2 main,调用 closeSocket() 线程“main”中的异常 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(Unknown Source) 在 java.rmi.Naming.lookup(Naming.java:

4

1 回答 1

0

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

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

于 2014-04-18T23:16:07.563 回答