IceSSL插件配置.doc_第1页
IceSSL插件配置.doc_第2页
IceSSL插件配置.doc_第3页
IceSSL插件配置.doc_第4页
IceSSL插件配置.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1. IceSSL简介Ice版本:Ice-3.1.1操作系统:Windows XP SP2JDK版本: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 80002.4. 安全考虑事项 像上面的例子那样,对象适配器的端点使用多种协议,对安全有一些明显的影响。如果意图是用SSL来保护会话通信,或者是限制对服务器的访问,那么应该只定义SSL端点。但在有些情况下,使用不安全的端点协议也有好处。下图阐释了一种环境,在防火墙以内可以使用TCP,但外部客户必须使用SSL。 图中的防火墙被配置成阻塞外部对TCP端口8000的访问,并把与端口8001 的连接转到服务器的机器。 在防火墙以内使用TCP的一个原因是,它比SSL效率更高,使用时所需的管理工作更少。当然,这里的例子假定内部客户是可信的,在许多环境中事情未必如此。2.5. 配置IceSSL 配置环境IceGrid节点IP地址注册器(registry)0节点1(Node1)0节点2(Node2)0客户端(client)0 注册器配置:# IceSSL propertiesIce.Plugin.IceSSL=IceSSL:createIceSSLIceSSL.DefaultDir=C:IceGridIceSSL.CertFile=registry_cert.pemIceSSL.KeyFile=registry_key.pemIceSSL.CertAuthFile=ca_cert.pemIceSSL.Password=123456# Registry propertiesIceGrid.Registry.Client.Endpoints=ssl -p 4065:tcp -p 4066IceGrid.Registry.Server.Endpoints=sslIceGrid.Registry.Internal.Endpoints=sslIceGrid.Registry.AdminPermissionsVerifier=IceGrid/NullPermissionsVerifierIceGrid.Registry.PermissionsVerifier=IceGrid/NullPermissionsVerifierIceGrid.Registry.Data=C:IceGridregistryIceGrid.Registry.Admin.Endpoints=default#Log propertiesIceGrid.Registry.Trace.Adapter=1IceGrid.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:createIceSSLIceSSL.DefaultDir=C:IceGridIceSSL.CertFile=admin_cert.pemIceSSL.KeyFile=admin_key.pemIceSSL.CertAuthFile=ca_cert.pemIceSSL.Password=123456Ice.Default.Locator=IceGrid/Locator:ssl -h 0 -p 4065管理客户端发布我们的应用程序,启动管理客户端我们使用的是icegridadmin.exe可执行程序,所以配置IceSSL插件使用C+配置IceSSL:createIceSSL。 部署文件:-jarC:PrinterApp.jar 和普通的发布文件相比,只需要将适配器adapter 的端点修改为ssl即可。 节点1配置:Ice.Plugin.IceSSL=IceSSL:createIceSSLIceSSL.DefaultDir=C:IceGridIceSSL.CertFile=node_cert.pemIceSSL.KeyFile=node_key.pemIceSSL.CertAuthFile=ca_cert.pemIceSSL.Password=123456# Node propertiesIceGrid.Node.Endpoints=sslIceGrid.Node.Name=Node1IceGrid.Node.Data=C:IceGridnodeIce.Default.Locator=IceGrid/Locator:ssl -h 0 -p 4065#log propertiesIceGrid.Node.Trace.Activator=3IceGrid.Node.Trace.Adapter=3IceGrid.Node.Trace.Server=3启动节点1我们使用的是icegridnode.exe可执行程序,所以配置IceSSL插件使用C+配置IceSSL:createIceSSL。节点2使用相同的配置。 java应用服务程序:Ice.Plugin.IceSSL=IceSSL.PluginFactoryIceSSL.DefaultDir=C:IceGridIceSSL.Keystore=cert.jksIceSSL.Truststore=ca.jksIceSSL.Password=123456IceSSL.Alias=printservercertIce.ThreadPerConnection=1#IceSSL.Ciphers=NONE (RSA.*AES) !(EXPORT)#Log IceSSL.Trace.Security=3Ice.Trace.Protocol=1Ice.Trace.Network=3应用服务是我们自己使用java开发的服务器程序,使用该配置文件初始化通信器Ice.Communicator,java开发的应用和C+开发的应用程序使用IceSSl插件,在配置上有一些区别,插件类为IceSSL.PluginFactory,此类在Ice.jar包中,IceSSL使用Java的原始格式存储密钥和证书:密钥库(keystore)。密钥库作为一个文件包含密钥对及相关证书,通常使用keytool工具管理密钥库文件。 密码被分配到每个keystore中的密钥对,以及密钥库本身,即程序在读取密钥库和密钥库中的密钥等信息时,都需要提供密码,该密码由IceSSL.Password提供。IceSSL要求密钥库中的密钥存取必须要使用密码,但密钥库的密码是可选的。如果一个密钥库的密码是指定的,是只用于验证密钥库的完整性。IceSSL要求密钥库中所有的密钥对使用相同的密码。 配置说明:属性说明Ice.Plugin.IceSSL开启IceSSL插件服务的主类IceSSL.DefaultDi密钥库文件存放的目录IceSSL.Keystore服务器密钥库,存放根证书签发的服务器证书IceSSL.Truststore受信任的根证书存放在此密钥库中IceSSL.Password读取密钥时使用的密码IceSSL.Alias如果服务器密钥库中有多个证书条目,此属性指定服务器使用哪个证书与客户端建立安全通信。Ice.ThreadPerConnection如果属性值被设置为大于零,Ice运行时对于每一个连接都会创建一个线程。 服务器示例代码:public class Server extends Ice.Application public int run(String args) /创建名为SimplePrinterAdapter的适配器, Ice.ObjectAdapter adapter = communicator().createObjectAdapter(PrinterAdapter); /实例化一个PrinterI对象,为Printer接口创建一个服务对象 Ice.Object object = new PrinterI(); /将服务单元增加到适配器中,并给服务对象指定名称为SimplePrinter,该名称用于唯一确定一个服务单元 adapter.add(object, Ice.Util.stringToIdentity(SimplePrinter); /激活适配器,这样做的好处是可以等到所有资源就位后再触发 adapter.activate(); /让服务在退出之前,一直持续对请求的监听 communicator().waitForShutdown();return 0;public static void main(String args) Server app = new Server();System.out.println(服务器已经启动!); String conf = “c:f”System.exit(app.main(Server, args,conf ); 服务器使用java语言实现了一个简单的打印功能,将客户端发送到服务器端的信息打印到终端。服务端在调用app.main(Server, args,conf )的时候,会使用conf 变量指定的配置文件初始化通信器,同时会开启IceSSL插件。 客户端配置:Ice.Plugin.IceSSL=IceSSL.PluginFactoryIceSSL.DefaultDir=C:IceGridIceSSL.Keystore=cert.jksIceSSL.Truststore=ca.jksIceSSL.Password=123456IceSSL.Alias=usercertIce.ThreadPerConnection=1Ice.Default.Locator=IceGrid/Locator:tcp -h 0 -p 4066#Ice.Trace.Network=3客户端在建立Ice.Communicator通信器时,使用此属性集初始化通信器。在本文的例子中,客户端同样是使用java语言开发。Ice.Default.Locator属性指定注册器所在的服务器,使用的是tcp协议,客户端与注册器通信内容,不会包含太过重要的信息,因此没有必要使用ssl协议建立通信。客户端示例代码:public class Client extends Ice.Application public int run(String args) /获取Printer的远程代理,这里使用的stringToProxy方式Ice.ObjectPrx base = communicator().stringToProxy(SimplePrinter); /通过checkedCast向下转换,获取Printer接口的远程,并同时检测根据传入的名称获取的服务单元是否Printer的代理接口,如果不是则返回null对象 Demo.PrinterPrx printer = Demo.PrinterPrxHelper.checkedCast(base); if (printer = null) throw new Error(Invalid proxy); /把Hello World传给服务端,让服务端打印出来,因为这个方法最终会在服务端上执行 for(int i = 0;i10;i+) String ret = printer.printString(Hello World!哈哈); System.out.println(ret); return 0;public static void main(String args) Client app = new Client();System.exit(app.main(Client, args,C:client.conf);服务端在调用app.main(Client, args,C:client.conf)的时候,会使用client.conf配置文件初始化通信器,同时会开启IceSSL插件。3. 安装证书在开发过程中,有一个简单的方法创建新的证书(也可以使用其他方式制作证书,只要符合Ice要求的证书格式都可以)。OpenSSL包括所有必要的基础设施来设立自己的证书颁发机构(CA),但是我们必须对OpenSSL非常的熟悉。为了简化这个过程,Ice提供了一系列Python脚本(对应Ice-3.1.1版本的Python版本为2.7.5),位于Ice安装目录下的config/ca子目录,这些Python脚本隐藏了复杂的OpenSSL操作过程,并允许我们快速执行必要的任务:l 初始化一张新的根证书l 生成新的证书请求l 给证书请求签名,创建一个有效的证书链l 转换证书,以匹配特定的平台需求首先需要在系统中安装Python-2.7.5版本,才能够顺利执行Python脚本。设置环境变量ICE_CA_HOME,指定一个目录,制作证书的过程中,运行Python脚本生成的文件,将存放在该目录中。3.1. 初始化root CA通过以下的命令初始化一个根证书python initca.py -no-password -overwrite -overwrite操作会覆盖一个已经存在的根证书,如果对CA的私钥不做加密处理可以使用-no-password操作。 假设ICE_CA_HOME环境变量设置为c:iceca,则会在该目录下生产两个文件,f和ca_cert.pem。ca_cert.pem文件包含根证书,我们的IceSSL配置文件必须指定该根证书作为我们的信任证书,C+程序通过IceSSL.CertAuthFile=C:icecaca_cert.pem 指定,在java中,我们需要添加该证书到信任域中,使用如下的命令: keytool -import -trustcacerts -file ca_cert.pem -keystore ca.jks ca.jks是java支持的密钥库文件格式,Java中通过IceSSL.Truststore属性指定该根证书。3.2. 生成证书请求生成证书请求使用如下命令: python req.py -overwrite -no-password -node|-registry|-server|-user 此脚本会查找f和ca

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论