问题标签 [cajo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1896 浏览

java - 使用 RMI 编写安全的 Java 代码

这似乎是一个非常广泛的问题,但任何帮助表示赞赏。

我有一个用 java 编写的客户端/服务器解决方案,它使用 Cajo 项目(使用 RMI)。考虑到将在服务器和客户端之间传输的敏感数据,我只想尝试使我的解决方案尽可能安全。

到目前为止,我的想法是让我的所有类都“最终”,并为服务器中的所有类抛出“不可序列化”异常(RMI 注册表中绑定的对象以及实际需要的任何对象除外)当然要转移)。

谁能想到其他的想法?

我知道有人可能会编写恶意客户端——这并不难,因为您可以使用反射找出远程对象的 API。但是,我能做些什么来保护他们不应该访问的服务器中的恶意客户端访问类/对象吗?

非常感谢

更新: 感谢大家提供的有用提示,很抱歉花了这么长时间才回复您。我目前的思路是建立一个安全的系统:

  • 在客户端和服务器之间使用 OpenVPN。这意味着您需要访问物理客户端才能获得访问权限。(注意由于下面的2点,VPN实际上会在服务器和办公室局域网之间。我觉得这样已经足够安全了)
  • 使用用户名和密码(可能使用 JBOSS)在服务器和客户端之间进行身份验证。这意味着要在服务器上完成任何事情,攻击者都需要用户名和密码。
  • 为所有对象抛出一个“不可序列化”异常,除了那些实际上应该通过网络发送的对象。这会阻止敏感对象通过网络发送。

这听起来公平吗?如果我遗漏任何东西,请纠正我。

进一步更新:似乎我试图阻止的事情似乎有些混乱。我试图阻止的是有人“入侵”服务器。因此,例如,基本上是利用服务器转储/删除其整个数据库。

谢谢

0 投票
2 回答
237 浏览

java - 防止 RMI 服务器代码修改

我正在编写一个使用 Java RMI(通过 Cajo 项目)的客户端-服务器解决方案。

我想让服务器尽可能安全。我知道通过使用 Java 反射,恶意客户端将能够查看任何给定对象内的所有方法名称和字段名称,这些对象要么绑定在 RMI 记录中,要么从服务器“代理”(在 Cajo 中,代理项是实际驻留在服务器上但客户端可以引用它的对象)。但是,恶意客户端是否能够查看任何程序逻辑,或修改服务器上的任何代码?或者查看字段的实际内容呢?

请假设不允许对服务器进行物理访问,并且对服务器的唯一网络访问是通过 Cajo TCP 端口 (1198)。

谢谢

0 投票
11 回答
15921 浏览

java - 本地 JVM 之间的通信

我的问题:我可以/应该采取什么方法在本地运行的两个或多个 JVM 实例之间进行通信?

问题的一些描述:
我正在为一个项目开发一个系统,该项目需要单独的 JVM 实例来完全隔离某些任务。

在它运行时,“父”JVM 将创建它期望执行的“子”JVM,然后将结果返回给它(以相对简单的 POJO 类的格式,或者可能是结构化的 XML 数据)。这些结果不应该使用 SysErr/SysOut/SysIn 管道传输,因为子进程可能已经使用这些作为其运行的一部分。

如果子 JVM 在一定时间内没有响应结果,则父 JVM 应该能够向子 JVM 发出信号以停止处理或终止子进程。否则,子 JVM 应该在完成其任务结束时正常退出。

迄今为止的研究:
我知道有许多技术可能有用,例如...

  • 使用 Java 的 RMI 库
  • 使用套接字传输对象
  • 使用分发库,例如 Cajo、Hessian

...但我很想听听其他人在追求这些选择之一或任何其他选择之前可能会考虑什么方法。

感谢您对此提供任何帮助或建议!

编辑:
要传输的数据量 -相对较小,主要是少数 POJO,其中包含表示子执行结果的字符串。如果任何解决方案在大量信息上效率低下,这不太可能是我的系统中的问题。转移的金额应该是相当静态的,因此不必可扩展的。

传输延迟——在这种情况下不是一个关键问题,尽管如果需要对结果进行任何“轮询”,这应该能够相当频繁地进行,而不会产生大量开销,因此我可以在以后在此之上维护一个响应式 GUI(例如进度条)

0 投票
2 回答
118 浏览

java - 如何管理远程java程序?

我想构建一个 GUI 来管理远程执行的 java 程序(查看执行任务的状态、加载/启动/停止任务),但没有什么复杂的。

到目前为止,我最好的想法是使用CAJO

还有另一种可能更好的方法吗?

Java 程序是标准的 Java SE 可执行文件。它不是网络应用程序的一部分。

0 投票
1 回答
4279 浏览

java - 如何通过 SSH 隧道传输所有 RMI 流量

我正在通过 SSH 隧道传输 cajo rmi 流量。

为此,我有一个运行 SSH 守护程序(apache Mina)的服务器和一个运行 SSH 客户端(Trilead SSH)的客户端。

可以建立这些机器之间的 shh 连接,并且通过应用本地和远程端口转发,我可以隧道 rmi 流量,但这仅适用于出站(到服务器)方向。

设置:

活动 SSH 连接(端口 22)
客户端:将本地端口 4000 转发到远程主机端口 1198(此流量实际上通过隧道) 服务器:将服务器端口 4000 转发到客户端端口 1198(这部分隧道未被使用焦糖)

服务器使用以下方法导出对象:

客户端使用以下方法进行对象查找:

在客户端使用 trilead ssh 库调用端口转发:

使用 WireShark 分析两台机器之间的 ip 流量时,我看到查找正在通过隧道重定向,但响应不是。响应通常发送到客户端的 1198 端口。

如何强制服务器将远程调用的响应发送到本地端口,以便通过隧道返回客户端?

更新:这里的问题是 RMI 对象的端口与注册表端口不同,因此也需要转发。

简而言之,客户端 10.0.0.1 查找 //10.0.0.1:4000 并转发到服务器上的 RMI 端口(通过隧道)。随后服务器响应 10.0.0.1:1198 ,我希望服务器将其流量发送到其本地端口 4000,以便使用隧道。

我试图摆弄 cajo Remote.config(ServerAddress, ServerPort, ClientAddress, ClientPort) 设置,但是当我将此方法的 clientaddress 设置为 10.0.0.1 或 127.0.0.1 时,我无法得到回复,我根本看不到任何响应流量...

0 投票
1 回答
1143 浏览

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

我正在研究 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

客户端.java

服务器输出

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: