2014-03-24 139 views
2

我正在编写一个服务器 - 客户端应用程序,通过互联网进行通信,我有几个关于安全性的问题和疑虑。我已经做了一些研究,发现一些有用的帖子,但我想了解更多信息。我读了一些相关的问题是:编写安全的RMI服务器 - 客户端应用程序

Secure authentication of client over RMI

java rmi authentication & security. exportObject makes it public?

Is communication in java rmi secure?

我有3个部分来考虑:

  1. 信息在客户端和服务器之间交换。
  2. 客户端的身份验证。
  3. 利用正在运行的RMI服务器(黑客等)。

我所知道的:

  1. 基于SSL的RMI。使用SSL套接字而不是默认套接字将加密在客户端和服务器之间传递的所有信息。这包括对象交换和方法调用。
  2. 在建立RMI连接之前使用SSL上的用户名/密码组合进行身份验证。根据我的理解,应该有一种在RMI连接内进行身份验证的方法,但它被拒绝了。
  3. 不太确定这里可以做什么或需要做什么。我知道你不能只编写你自己的客户端,并要求连接到服务器,因为你需要一个ObjectID和远程接口。但是,是否无法反编译您所需的类\接口,因为它们是以RMI方式发送的?我也在研究中看到了这个Youtube视频[http://www.youtube.com/watch?v=otjllNaBxiw],它让我担心它的容易程度,尽管我不知道服务器是否安装不正确。

总而言之,我还需要在RMI上通过互联网考虑其他安全问题吗?我是否缺少我需要看的解决方案?我已经知道错了吗?

+0

您可以使用应用程序服务器和应用程序客户端吗?它们之间的连接使用RMI-IIOP,您可以利用服务器安全性。在服务器上,您可以访问EJB以进行数据访问。 – onesixtyfourth

+0

@onesixtyfourth阅读[文档](http://docs.oracle.com/javase/7/docs/technotes/guides/rmi-iiop/rmiiiopUsing.html)在我看来,RMI-IIOP只需要部分的整体应用程序不是用Java写的,事实并非如此。无论如何,这将如何解决担忧? – user1803551

回答

3

客户端和服务器之间交换的信息。

RMI over SSL。

客户端的身份验证。

客户端的身份验证由SSL完成。你的意思是授权,这是'相对'容易。定义你自己的RMIServerSocketFactory,它返回一个ServerSocket覆盖,它的implAccept()方法将套接字包装在一个SSLSocket中,添加一个握手监听器并将needClientAuth设置为true(并且clientMode为false)。然后,您的握手监听器应该从SSLSession中获取并检查客户端证书,以查看其身份验证的身份是否经过授权,如果未经授权,则只需关闭套接字即可。

授权服务器,在客户端,另一方面是复杂的巴洛克式。您真的需要Jini的JERI API才能正确执行。

利用正在运行的RMI服务器(黑客攻击等)。

我不会说这是不可能的,但它是非常困难的,并且有几条强大的防线。你需要ObjectID,它是随机的,并且可以安全地随机生成,并且你需要这些类。在RMI中不会发送类和接口,除非您特别启用它,并且它们是通过可以任意强保护的辅助信道发送的,例如使用双向认证的HTTPS。所以你不能得到这些。然后你需要获得授权,这基本上需要妥协服务器。如果可能的话,什么都可以。

相关问题