Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将JRMP(RMI)与加密(ssl)和xinetd一起使用?_Java_Ssl_Rmi_Xinetd - Fatal编程技术网

Java 如何将JRMP(RMI)与加密(ssl)和xinetd一起使用?

Java 如何将JRMP(RMI)与加密(ssl)和xinetd一起使用?,java,ssl,rmi,xinetd,Java,Ssl,Rmi,Xinetd,因此,我正在推出自己的基于Java的应用服务器(因为Glassfish等人不支持非基于web的应用程序),当然,加密是绝对必须的。因此,我使用标准的SslRMIClientSocketFactory和SSLRMIServerSocketFactory编写了一个基本的ssl解决方案。到目前为止,一切顺利。不过,我还有一些其他问题,比如允许,但不需要使用客户端证书(就像当你进入系统时),但是我愿意考虑另一天的练习。 然而,一路上我注意到,自2005年左右“Java5.0”问世以来,我们显然在使用基于

因此,我正在推出自己的基于Java的应用服务器(因为Glassfish等人不支持非基于web的应用程序),当然,加密是绝对必须的。因此,我使用标准的
SslRMIClientSocketFactory
SSLRMIServerSocketFactory
编写了一个基本的ssl解决方案。到目前为止,一切顺利。不过,我还有一些其他问题,比如允许,但不需要使用客户端证书(就像当你进入系统时),但是我愿意考虑另一天的练习。

然而,一路上我注意到,自2005年左右“Java5.0”问世以来,我们显然在使用基于nix的解决方案方面得到了一些帮助。在我看来,实现这一点的“新”帮助是能够从较低级别“继承”套接字信息,如xinetd-通过
系统.inheritedChannel

我想我需要一个在RMI解决方案中同时使用加密和xinetd的示例,并在这里找到了一个很好的编写方法-或者,至少,如果不是那篇文章应该附带的示例代码丢失了,那就太好了。我猜是位腐烂。(有人有副本吗?!)文章中可见的示例太不完整,文本依赖于您拥有示例代码的事实。哦,好吧。简单地说,我不太明白-使用
System.inheritedChannel
显然不像将其插入现有的RMI注册表相关代码那么简单-您显然必须创建一个套接字工厂,或者可能我不明白-因此,寻找一个示例

所以我去打猎。我发现Apache的人也做了类似的事情,这里已经描述过了,但是,它使用的是我宁愿避免使用的技术——SpringBeans,如果你愿意的话。坦率地说,这是一个非常重要的例子,我对如何在工作中使用这种解决方案有点迷茫

我一直在寻找,发现了一个乍看起来很不错的解决方案,名为,但它根本没有任何SSL的参考,我一下子就迷路了。例如,它将自己描述为:

创建和导出注册表(使用继承的通道,如果有,如下所述),并将指定的名称绑定到该注册表中的指定代理

我这里的问题是语言。特别是,我没有使用代理,即使我使用了代理,我也不知道这有什么关系。我认为我将对象绑定到RMI注册表,而不仅仅是名称。也许如果有人能弄清楚他们在做什么,这就是一个很好的例子

最后,我在StackOverflow上偶然发现了一个很好的回复——这是有史以来最令人不快的回复之一——关于压缩的讨论并不符合我的需要,但这是一个很有启发性的讨论。不过,我不知道它如何帮助我理解如何将RMI与SSL和xinetd同时使用

多谢各位

更新:

为了回应EJP提出的答案(对此我表示感谢),我从上面引用的
InitializeRegistry.java
示例开始。我将accept()方法更新为:

      .
      .
      .
      /* Here we wrapper our socket with SSLSocketFactory.createSocket()

         Some open questions I have are whether the arguments to createSocket()
         are all _inbound_ in nature. Here's the basic call:

            SSLSocketFactory.createSocket(socket, host, port, auto-close);

         I PRESUME args are for the REMOTE host, not "us?"

            REMOTE: serverSocket.getInetAddress()
            LOCAL:  serverSocket.getLocalAddress()

            REMOTE: serverSocket.getPort()
            LOCAL:  serverSocket.getLocalPort()

         Who Knows about auto-close?! I'll try it and see if it works OK.
      */

      boolean autoClose = true;

      return (Socket)SSLSocketFactory.createSocket(serverSocket.accept(),
       serverSocket.getInetAddress().getHostAddress(),
       serverSocket.getLocalPort(),
       autoClose).accept();

      //return serverSocket.accept();
   }
但是,此代码未能编译,并抱怨:

  • 无法从静态上下文调用
    createSocket()
    ——我找不到任何解决方案
  • 它找不到“symbol”“
    .accept()
    ”——这两个符号中的第二个
删除最后一个
.accept()
会将错误计数减少到无法从此代码的静态上下文中使用“非静态方法
createSocket()
”。但是当我尝试从类中删除“static”时,它到处都是,无法使用无处不在的“
这个
”引用。OTOH,我不知道如何使
SSLSocketFactory.createSocket()
static

…是否可以安全地假定用于访问传递的套接字(!!)的
accept()
已足够,并且不需要我尝试包含的后续套接字?嗯

我很乐意试一试,看看能不能把它造成这样

顺便说一句,我想我应该在以后的某个时候使用
setUseClientMode(false)
。。。是吗

进一步思考……

我意识到也许
初始化注册表.java
是一个糟糕的起点,于是回到“第一原则”,发现当它第一次使用
频道时,可能是误入歧途了,该频道是通过
系统提供的。inheritedChannel
并将其转换为
ServerSocket
,因此,重写
ServerSocketFactory
的想法是“大量工作”。我突然想到:

这里的要点是尝试并确保未经请求的连接请求到达正在侦听的目标。但除此之外,注册表中必须有一个对象才能使其有用,为此,还需要创建该对象的任何对象。因此,确保创建对象的代码作为系统服务运行,而不必担心作为网络服务来解决这个问题,这样做同样好,也更容易

因此,我在玩双桨。。。删除这个问题似乎很遗憾,因为这可能会为其他人提供指导——这是所有StackOverflow中唯一涉及这个主题的查询


再次感谢。

我看不出延迟AcceptServerSocketFactory
的意义,这只是有点过分,但基本技术如下所示:

  • 编写一个
    RMIServerSocketFactory
    ,该函数返回对
    ServerSocket
    的重写,其
    accept()
    方法被重写以委托给来自继承通道的
    ServerSocket

  • accept()
    方法返回之前,通过
    SSLSock>将接受的
    Socket
    封装在
    SSLSocket