是否可以在远程服务器实现中获取对连接的客户端的x509证书对象的引用?
重写的 RMISocketFactory:
RMISocketFactory.setSocketFactory(
new java.rmi.server.RMISocketFactory() {
...
@Override
public ServerSocket createServerSocket(int port)
throws IOException {
SSLServerSocket socket = ...
socket.setNeedClientAuth(true);
return socket;
}
});
远程对象:
public class RMIServer extends UnicastRemoteObject implements IRMIServer {
public RMIServer() throws RemoteException {
super(0);
}
@Override
public String foo() throws RemoteException {
System.out.println(getClientCertificate().getSubjectDN().getName()); // something like this?
}
}
你遇到了RMI的一个主要设计缺陷。RMI服务器几乎不可能获得客户端证书,反之亦然,因为实际上不可能知道当前调用正在使用哪个SSLSocket。他们应该提供一种附加类似 HandshakeCompletionListener 的方法。