如何在ehcache中配置RMI over SSL以进行复制

时间:2015-06-29 13:50:56

标签: ssl replication ehcache

我没有SSL支持,ehcache复制正常工作。 我希望通过SSL支持我的ehcache复制,即我希望通过SSL使用RMI

我该怎么做?

以下是我正在使用的示例手动对等发现。

<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,
rmiUrls=//10.100.10.12:40002/ssoSessionStore"/> 

我可以为RMI调用提供一些SSL支持吗?

由于

2 个答案:

答案 0 :(得分:2)

我不得不更改ehcache源代码并更改几个类来支持SSL。当ehcache通过rmi启动时,它会在rmiregistry上注册。我需要通过SSL上下文启动此注册

查看方法RMICacheManagerPeerListener.java的课程startRegistry() 这是RMI注册表启动的主要类。修改代码的人需要先了解ehcache rmi代码流。下面的代码是必须完成的内容并分别更改其他方法的片段。

final String SSL= System.getProperty("isSSL");
  protected void startRegistry() throws RemoteException {
        try {
            LOG.info("Trying to Get Exsisting Registry =========>> ");
            if (SSL != null && SSL.equals("ssl"))
                registry = LocateRegistry.getRegistry(hostName, port.intValue(),
                        new SslRMIClientSocketFactory());
            else
                registry = LocateRegistry.getRegistry(port.intValue());
            try {
                registry.list();
            } catch (RemoteException e) {
                // may not be created. Let's create it.
                if (SSL != null && SSL.equals("ssl")) {
                    LOG.info("Registry not found, Creating New SSL =========>> ");
                    registry = LocateRegistry.createRegistry(port.intValue(),
                            new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory(null, null, true));
                } else {
                    LOG.info("Registry not found, Creating New Naming registry =========>> ");
                    registry = LocateRegistry.createRegistry(port.intValue());
                }

                registryCreated = true;

            }
        } catch (ExportException exception) {
            LOG.error("Exception starting RMI registry. Error was " + exception.getMessage(), exception);
        }
    }

同样,我对方法

进行了更改
bind()
notifyCacheAdded()
unbind()
disposeRMICachePeer()
populateListOfRemoteCachePeers()
bind()
init() 

答案 1 :(得分:0)

要修补对使用自定义套接字工厂的支持,您应该删除全局默认值的使用。

上的静态方法调用
java.rmi.Naming

应替换为

的三参数版本返回的注册表
LocateRegistry.createRegistry

LocateRegistry.getRegistry

并在ConfigurableRMIClientSocketFactory.java中更改

getConfiguredRMISocketFactory

返回基于SSL的实现。

有关示例补丁,请参阅https://gist.github.com/okhobb/4a504e212aef86d4257c69de892e4d7d