1. IceSSL简介
Ice版本:Ice-3.1.1
操作系统:Windows XP SP2
JDK版本:JDK 1.6
安全性对于许多分布式应用程序来说是一个重要的考虑因素,无论是在企业内部网还是在不可信的网络,如Internet。保护敏感的信息,确保其完整性,并验证通信双方的身份的能力,这些能力对于开发安全的应用程序来说是必不可少的。考虑到这些目标,Ice提供了这些功能的IceSSL插件,IceSSL插件使用SSL协议。
2. 配置IceSSL
将IceSSL合并到你的应用程序中,需要安装IceSSL插件,根据你的安全需求进行配置,并创建SSL端点。
安装IceSSL插件通过在配置文件中添加Ice.Plugin属性,不需要修改应用程序源代码。
2.1. C++应用程序
C++ IceSSL插件的可执行代码驻留在Unix的共享库上和Windows上的一个动态链接库(DLL)中。如下所示属性Ice.Plugin:
Ice.Plugin.IceSSL=IceSSL:createIceSSL
该属性值IceSSL:createIceSSL允许Unix和Windows的Ice运行时寻找到IceSSL库(在Unix 和Windows上),并且初始化插件。该库必须出现在共享库路径(大多数Unix 平台的LD_LIBRARY_PATH,在Windows平台上的path环境变量)指定的目录中。
2.2. Java应用程序
Ice.Plugin属性配置如下:
Ice.Plugin.IceSSL=IceSSL.PluginFactory
IceSSL.PluginFactory 是一个class类名,允许ice运行时初始化IceSSL插件,这些类包含在Ice.jar 包中。
2.3. 创建SSL端点
安装了IceSSL 插件之后,就可以在端点中使用一种新协议ssl了。例如,下面的端点列表创建了一个TCP 端点、一个SSL 端点,以及一个UDP 端点:
MyAdapter.Endpoints=tcp -p 8000:ssl -p 8001:udp -p 8000
如这个例子所演示的,UDP端点可以使用和TCP或SSL端点相同的端口号,因为UDP是一种不同的协议,有自己的端口集。但TCP端点和SSL端点不能使用同一个端口号,因为SSL 在本质上是位于TCP 之上的一个层面。在串化代理中使用SSL 同样直截了当:
MyProxy=MyObject:tcp -p 8000:ssl -p 8001:udp -p 8000
2.4. 安全考虑事项
像上面的例子那样,对象适配器的端点使用多种协议,对安全有一些明显的影响。如果意图是用SSL来保护会话通信,或者是限制对服务器的访问,那么应该只定义SSL端点。
但在有些情况下,使用不安全的端点协议也有好处。下图阐释了一种环境,在防火墙以内可以使用TCP,但外部客户必须使用SSL。
图中的防火墙被配置成阻塞外部对TCP端口8000的访问,并把与端口8001 的连接转到服务器的机器。
在防火墙以内使用TCP的一个原因是,它比SSL效率更高,使用时所需的管理工作更少。当然,这里的例子假定内部客户是可信的,在许多环境中事情未必如此。
2.5. 配置IceSSL
配置环境
IceGrid节点 |
IP地址 |
注册器(registry) |
192.168.1.10 |
节点1(Node1) |
192.168.1.20 |
节点2(Node2) |
192.168.1.30 |
客户端(client) |
192.168.1.40 |
注册器配置:
- # IceSSL properties
- Ice.Plugin.IceSSL=IceSSL:createIceSSL
- IceSSL.DefaultDir=C:\IceGrid
- IceSSL.CertFile=registry_cert.pem
- IceSSL.KeyFile=registry_key.pem
- IceSSL.CertAuthFile=ca_cert.pem
- IceSSL.Password=123456
- # Registry properties
- IceGrid.Registry.Client.Endpoints=ssl -p 4065:tcp -p 4066
- IceGrid.Registry.Server.Endpoints=ssl
- IceGrid.Registry.Internal.Endpoints=ssl
- IceGrid.Registry.AdminPermissionsVerifier=IceGrid/NullPermissionsVerifier
- IceGrid.Registry.PermissionsVerifier=IceGrid/NullPermissionsVerifier
- IceGrid.Registry.Data=C:\IceGrid\registry
- IceGrid.Registry.Admin.Endpoints=default
- #Log properties
- IceGrid.Registry.Trace.Adapter=1
- IceGrid.Registry.Trace.Node=2
启动注册器我们使用的是icegridregistry.exe可执行程序,所以配置IceSSL插件使用C++配置IceSSL:createIceSSL。IceSSL.Password属性配置了明文密码,这不是一个安全的做法。更好的设置密码的方式,参考官方文档。
配置说明:
属性 |
说明 |
Ice.Plugin.IceSSL |
开启IceSSL插件服务的主类 |
IceSSL.DefaultDir |
数字证书存放的目录 |
IceSSL.CertFile |
注册器的数字证书文件,pem格式 |
IceSSL.KeyFile |
注册器的数字证书对应的私钥文件,pem格式 |
IceSSL.CertAuthFile |
给注册器的数字证书签名的根证书,pem格式 |
IceSSL.Password |
读取私钥时使用的密码 |
其他的属性不属于IceSSL插件特有的配置,在此不再次说明。
IceGrid.Registry.Client.Endpoints属性提供了两种协议,添加了ssl协议,保留了tcp协议,保留的tcp协议提供给客户端连接注册器使用,客户端连接注册器只是为了获取一个可用的代理,不需要使用加密通信,这样也可以降低对性能的影响。
管理客户端配置:
- Ice.Plugin.IceSSL=IceSSL:createIceSSL
- IceSSL.DefaultDir=C:\IceGrid
- IceSSL.CertFile=admin_cert.pem