如果您想为 RMI 使用自定义套接字(例如使用 SSL),在UnicastRemoteObject.exportObject(4)中,您需要指定客户端套接字工厂和服务器套接字工厂。但是对象的导出是在服务器端完成的。为什么需要客户端套接字工厂?
除非......它被序列化并被想要获得与该对象的连接的客户端使用?我发现这不太可能(尽管这可能是答案);(SSL) 对我来说,套接字工厂听起来不像是可序列化对象的经典示例,密钥库是本地的,诸如此类。
如果您想为 RMI 使用自定义套接字(例如使用 SSL),在UnicastRemoteObject.exportObject(4)中,您需要指定客户端套接字工厂和服务器套接字工厂。但是对象的导出是在服务器端完成的。为什么需要客户端套接字工厂?
除非......它被序列化并被想要获得与该对象的连接的客户端使用?我发现这不太可能(尽管这可能是答案);(SSL) 对我来说,套接字工厂听起来不像是可序列化对象的经典示例,密钥库是本地的,诸如此类。
是的,就像您在问题中已经说过的那样:
RMIClientSocketFactory 必须是可序列化的,并且在与exportObject
UnicastRemoteObject 的构造函数一起使用时将被序列化到客户端另一端。
这意味着它不能包含对不可序列化对象的(非瞬态)引用,只包含动态创建套接字的必要信息。
(我最近发布了一个 RMISocketFactory 示例,我需要注意可序列化。)
编辑(在 EJP 发表评论后):
当然,这只适用于完全需要使用客户端套接字工厂的情况。在许多情况下,您可以简单地使用其他exportObject
方法(或其他构造函数),然后在服务器端使用默认服务器套接字工厂,在客户端使用默认客户端套接字工厂,而无需序列化任何内容。
是的,没有必要将服务器的信任存储序列化给客户端——如果客户端必须信任注册表或其他要接受证书的远程对象,我们就有了中间人攻击的要点。因此SslRMIClientSocketFactory虽然是可序列化的,但不会序列化服务器的 SSL 上下文,而只是使用客户端 VM 的 SSL 设置。
在 UnicastRemoteObject.exportObject(...) 中,您需要指定客户端套接字工厂和服务器套接字工厂(当然,如果您完全使用自定义套接字)。
仅当您使用 exportObject() 的重载时,即使这样您也可以提供空值。还有另一个重载,您只需指定端口号。
这是为什么?
它不是。
对象的导出是在服务器端完成的。
正确的。
为什么需要客户端套接字工厂?
它不是。