??xml version="1.0" encoding="utf-8" standalone="yes"?>
1. 参考:
Tomcat 6.0 自带的文?/span>docs/ssl-howto.htmlQ详l介l了配置q程?/span>
2. 目的Q?/span>
以下详细描述配置q程Q仅作ؓ备忘录?/span>
3. 备忘录:
Step1Q安?/span>tomcat 6.0.18Q此为当前最新版本,需JDK5.0或以上?/span>
l JDK安装后,可以在命令行下用如下命令检是否成功?/span>
C:\Documents and Settings\new>java -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)
看到以上蓝色信息Q则表示JDK安装配置成功?/span>
l Tomcat的运行需要配|?/span>JDK_HOME?/span>JRE_HOME环境变量Q?/span>JRE_HOME默认{于JDK_HOME的倹{?/span>
Step2Q创建服务器?/span>certificate keystore和自{certificate?/span>
在命令行下用如下命令:
C:\Documents and Settings\new>keytool -genkey -alias mykey -keyalg RSA -keystore server.keystore
输入keystore密码Q?/span>123456
再次输入新密?/span>:123456
您的名字与姓氏是什么?
[Unknown]Q?/span> dinstone
您的l织单位名称是什么?
[Unknown]Q?/span> advance software ltd.
您的l织名称是什么?
[Unknown]Q?/span> china
您所在的城市或区域名U是什么?
[Unknown]Q?/span> beijing
您所在的州或省䆾名称是什么?
[Unknown]Q?/span> beijing
该单位的两字母国家代码是什?/span>
[Unknown]Q?/span> cn
CN=dinstone, OU=advance software ltd., O=china, L=beijing, ST=beijing, C=cn 正确吗?
[?/span>]Q?/span> y
输入<mykey>的主密码
Q如果和 keystore 密码相同Q按回RQ:
?/span>C:\Documents and Settings\new下可以找C个文Ӟserver.keystoreQ其中就包含了自{的证书?/span>
注意Q?/span>
q里要求certificate keystore ?/span>certificate的密码一_此ؓTomcat的约束?/span>
Step3Q在%TOMCAT_HOME%目录下新建目?/span>keystoreQƈ拯server.keystore到其目录下?/span>
Step4Q修?/span>%TOMCAT_HOME%/conf/server.xml文g。添?/span>https?/span>Connector?/span>
<Connector
port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="keystore/server.keystore" keystorePass="123456"
clientAuth="false" sslProtocol="TLS"/>
注意Q?/span>
keystoreFile指向文g%TOMCAT_HOME%/keystore/server.keystore文g?/span>
keystorePass是刚才生成certificate keystore的密码?/span>
Step5Q测?/span>Https。访?/span>https://localhost:8443/Q提C有不安全的证书Q接受证书,看到可亲?/span>tom猫?/span>
4. 延
某些情况下,某些特定资源需要走https协议Q如dh。这Ӟ我们可以?/span>web.xml中配|约束?/span>
<security-constraint>
<web-resource-collection>
<web-resource-name>SSL Resource</web-resource-name>
<url-pattern>/login.jsp</url-pattern>
</web-resource-collection>
<user-da
<transport-guarantee>
CONFIDENTIAL
</transport-guarantee>
</user-da
</security-constraint>
q样当用如下请求访问登录页面时Q则服务器将该请求徏立在httpsq接上?/span>
http://localhost:8080/CCB/login.jsp
1.创徏U钥 QC:\OpenSSL\apps>openssl genrsa -out root/root-key.pem 1024
2.创徏证书h QC:\OpenSSL\apps>openssl req -new -out root/root-req.csr -key root/root-key.pem
3.自签|证?QC:\OpenSSL\apps>openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey
root/root-key.pem -days 3650
4.证书导出成览器支持的.p12格式 QC:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey
root/root-key.pem -out root/root.p12
1.创徏U钥 QC:\OpenSSL\apps>openssl genrsa -out server/server-key.pem 1024
2.创徏证书h QC:\OpenSSL\apps>openssl req -new -out server/server-req.csr -key server/server-key.pem
3.自签|证? QC:\OpenSSL\apps>openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey
server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
4.证书导出成览器支持的.p12格式 QC:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey
server/server-key.pem -out server/server.p12
1.创徏U钥 QC:\OpenSSL\apps>openssl genrsa -out client/client-key.pem 1024
2.创徏证书h QC:\OpenSSL\apps>openssl req -new -out client/client-req.csr -key client/client-key.pem
3.自签|证? QC:\OpenSSL\apps>openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey
client/client-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
4.证书导出成览器支持的.p12格式 QC:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey
client/client-key.pem -out client/client.p12
C:\OpenSSL\apps\root>keytool -import -v -trustcacerts -storepass password -alias root -file root-cert.pem
-keystore root.jks
root.p12导入?strong>受信ȝ根证书颁发机?/strong>Qclient.p12导入?strong>个h7.讉K你的应用http://ip:8443Q如果配|正的话会出现h你数字证书的对话框?
Java IDL技术在Javaq_上添加了CORBA(Common Object Request Broker Architecture)功能Q提供了Z标准的互操作能力和连接性。Java IDL技术得分布式的Java Web应用能够通过使用工业标准的IDL和IIOP(Internet Inter-ORB Protocol)来透明地调用远E网l服务的操作。运行时lg(Runtime Components)包括了一个用于分布式计算且用IIOP通信的Java ORB.
可移植对象适配器(Portable Object AdapterQPOAQ?br /> CORBA对象的负责分隔服务器端远E调用句? QhandlerQ到q程对象和它的服务者(servantQ。对象由q程调用所暴露Q而服务者包含实际处理这些请求的Ҏ。每个对象都可以选择服务者ؓ 静态的Q一ơ)或动态的Q每个远E调用)Q在q两U情况下Q都允许调用转移到另一台服务器?br /> 在服务器端,POA形成了类似树状的l构Q每个POA都负责一到多个服务的对象。树的分支可以是独立zd的、或钝化的,服务者调用有不同的代码和不同的请求处理策略?/p>
API规范
* org.omg.CORBA ?- 提供了OMG CORBA APIs到Java~程语言的映?br />
* org.omg.CosNaming ?- 为Java IDL提供命名服务
* org.omg.PortableServer ?- 为徏立服务器端的可移植的、跨多ORB的应用程序提供类和接?br />
* org.omg.PortableInterceptor ?- 提供了注册ORB钩子的机Ӟ此钩子通过ORB服务能截取正常的ORB执行?br />
* org.omg.DynamicAny ?- 提供了得Q何值都能被动态解释(或遍历)和通过DynAny对象构造出来的cd接口
* org.omg.CORBA.ORB - 为CORBA ORB功能的API
分布式对象之间的关系有两斚wQ客L和服务器?br /> 服务器提供远E接口,客户端调用远E接口?br /> 在客LQ应用程序包括远E对象的引用。该对象引用有stubҎQ它是独立的q程Ҏ。stubҎ实际q接到ORBQ因此调用它实际上{发调用到服务器?br /> 在服务器端,ORB使用skeleton代码译q程调用为本地对象的Ҏ调用。Skeleton把调用{换成指定实现的格式,q在Ҏ中调用。当Ҏq回ӞSkeleton代码转换Ҏ调用的结果或错误Q经ORB送回客户端?/p>
Java IDL开发过E?br /> 1Q定义远E接?br /> 使用IDL语言E对象定义接口?br /> 【Billing.idl源代码】如下:
2Q编译远E接?br />
使用idlj~译器生成Java语言的stub和skeleton源文件?br />
idlj~译器缺省只生成客户端的binding代码。如果同旉要客L的bindings和服务器端的skeletonsQ必d?fall选项?br />
使用POA(Portable Object Adaptor)的优点:
· 允许~程者构建对象在不同ORB产品之间的可UL实现
· 支持带持久化标识的对?br />
· 对对象的透明zd提供支持
· 允许单个servant支持多种对象同时标识
注意Q确定jdk/bin目录下有Qidlj、java、javac、orbd
命oQ?br />
idlj -fall Billing.idl
在当前目录下生成BillingApp目录Q包含如下六个文Ӟ
· Billing.java ———?gt; 此接口包含IDL接口的Java版本。它l承自org.omg.CORBA.ObjectQ提供标准的CORBA对象功能?br />
· BillingHelper.java ———?gt; 此类提供辅助功能QHelperc负责读写数据类型到CORBA,以及插入和提取数据类型?br />
· BillingHolder.java ———?gt; This final class holds a public instance member of type Billing.
· BillingOperations.java ———?gt; 此接口包含successBilling()和shutdown()Ҏ?br />
·
BillingPOA.java ———?gt;
此抽象类是基于流的服务器SkeletonQؓ服务器提供基本的CORBA功能。它l承org.omg.PortableServer.ServantQ?
实现了InvokeHandler接口和BillingOperations接口。服务器cBillingServantl承BillingPOA?br />
·
_BillingStub.java ———?gt;
此类是客LstubQؓ客户端提供CORBA功能。它l承org.omg.CORBA.ObjectQ提供标准CORBA对象功能。还扩展?
BillingOperations接口和org.omg.CORBA.portable.IDLEntity接口?/p>
3Q实现服务器?br />
一旦用idlj~译器后Q就可以使用它生的Skeleton装配服务器应用程序了。另外要实现q程接口ҎQ服务器代码应包含启动ORB和等待远E客L调用的机制?br />
服务器端׃个类l成Q一个是servantQ另一个是Server?br />
servant是BillingImplc,是Billing IDL接口的实玎ͼ每个Billing实例均由BillingImpl实例实现。servant是BillingPOA的子cR?br />
servant包含了IDL定义的所有方法,与通常的JavaҎcM?br />
servercd服务器的main()ҎQ它Q?br />
· 创徏和初始化ORB实例
· 获得根POA的引用ƈȀzPOAManager
· 创徏一个Servant实例QCORBA的Billing对象的实玎ͼq知ORB
· 获得根命名上下文
· 在命名上下文?#8220;Billing”名注册新对象
· {待客户端调用此新对?/p>
【BillingImpl.java源码】:
【BillingServer.java源码】:
4Q实现客L
与第三步cMQ可以用idlj产生的stub作ؓ客户端应用程序的基础。客L代码建立于stub之上Q启动ORBQ用服务器提供的命名服务查询,获得q程对象的引用,调用其方法?br />
【BillingClient.java源码】:
5Q启动应用程?br />
要运行服务器和客LQ必d启动命名服务Q再启动服务器,最后运行客L?br />
此例用到命名服务Q它使得servant对象的操作对客户端有效。服务器需要命名服务的对象引用Q命名服务可以发布对象引用实现各U接口。客L使用对象引用来调用方法?br />
Java SE 1.4以上提供了两U可选的命名服务Q?br />
· tnameserv
一U透明的命名服?br />
· orbd
包含自启动服务、透明的命名服务、持久化命名服务和命名管理器的后台处理进E?br />
本例使用orbd?/p>
5.1Q启动orbd
注意QSolarispȝq行要求root权限q以1024端口开始进E。因此,Ҏ有OSQ可以选用大于或等?024的端口以实现l一?br />
-ORBInitialPort选项用于指定端口Q非~省状态)?br />
例如Q假定?050端口的Java ORB DaemonQorbdQ,命o如下Q?br />
start orbd -ORBInitialPort 1050 -ORBInitialHost localhost
5.2Q开始Billing服务?br />
start java BillingServer -ORBInitialPort 1050 -ORBInitialHost localhost
注:如在同一CZq行Q可省略-ORBInitialHost localhost
5.3Q运行客L应用E序
java BillingClient -ORBInitialPort 1050 -ORBInitialHost localhost
2. 开发工具Eclipse 3.4.2
3. 插gQORBStudio777
下蝲地址Q?ftp://www.orbzone.org 用户名称Qorbzone_downloads 密码Qorbzone_downloads
使用W三方Ftp工具或者迅L资源探测器登陆后q入CORBA_Utilities文g夹,下面?个zip压羃文gORBStudio 775, ORBStudio776, ORBStudio777 Q我选择?77下蝲?br />
解压后如下图所C?/font>
4. Javacc
下蝲javacc,|址Q?/font>https://javacc.dev.java.net/
解压后如下图所C?br />
二、安装配|?/font>
1. 解压OpenOrb.rar
2. 解压ORBStudio777.zipQ从ORBStudio/plugins/下面取得 ORBStudio_7.7.7.jar
的JAR包放到Eclipse/plugins下面.我用的Eclipse版本是Eclipse3.4.2。如果考入Jar包前以前Eclipse是运?
的请关闭Q重新运行?br />
3. q行CMD 到DOSQ再到存放javacc的bin目录Q输?javacc -tm D:\Eclipse3.22\eclipse\ORBStudio\IDLParser.jj
4. d环境变量TCOO_HOMEQgؓOpenOrb目录的\?br />
5. 启动eclipse
6. windows/preferences/出现如下H口选择ORB Studio/IDL Compiler/ 在右辚w择OpenORBq里?U编译器我们使用JacORB. 打开IDL Compiler 前面的加号选择
双参数IDL CommandQ?D:\ComponentTechnology\OpenOrb\OpenORB\bin\idl2java.bat
Command Options: -d %D% %F%
q样配|成功了Eclipse下面的Corba开发。Eclipse的新建选择如图Q?/font>
三、开发步骤参?/font>
1. 在eclipse里新建项目,Project lauyout 选择Create separate source and output folders
2.
l新目dLibraries,右键Properites--->Libraries--->Add
Library--->User Library--->User
Libraries...--->New...--->Add JARs...
扑ֈOpenOrb\OpenORB\lib目录下openorb_orb-1.4.0.jar,openorb_orb_tools-1.4.0.jar
OpenOrb\OpenORB\lib\endorsed目录下openorb_orb_omg-1.4.0.jar
OpenOrb\tools\lib目录下launcher.jar,tools-1.4.0.jar
OpenOrb\tools\lib\ext目录下所?jar文g
3. src上右键New--->Other--->CORBA Wizard--->IDL files--->Simple IDL
4. 选择IDL文gQ右键ORB Menu--->Compile,p动生成文?/font>
5.
src上右键New--->Other--->CORBA Wizard--->Server--->Active
object map--->Next在弹出的对话框里IDL
filename栏选择/{projectName}/src/{IDLname}.idl
Interface栏选择IDL文g里定义的接口?br />
Package栏里填写包名
Server classname栏里填写服务端类?br />
--->Next 在弹出的对话?选中Create server class:?/font>
6. 为生成的服务端类d未实现的Ҏ,q填写方法体
7. src
上右键New--->Other--->CORBA Wizard--->Client--->Simple
implementation 在弹出的对话框里IDL filename栏选择/{projectName}/src/{IDLname}.idl
Interface栏选择IDL文g里定义的接口?br />
Package栏里填写包名
Client classname栏里填写客户端类?/font>
8. 在客LcȝmainҎ里,取消注释test.getORBInterface().operation1("A message in the bottle..."); q修改传递的String内容
9. q行服务端程序Server_AOM.javaQ然后运行客LE序MyServiceClientImpl.java
如果Q你要将你的E序包发布到别的机器上,p用到名称服务Q用名U服务,我们需要在java代码上作些修改:
使用名称I间的配|:
1. 扑ֈq注释服务端Server_AOM.java里mainҎ的下列代码:
PrintWriter ps = new PrintWriter(new FileOutputStream(new File("server.ior")));
ps.println(orb.object_to_string(obj));
ps.close();
取消下列代码Q位|在上面代码的上方)的注释:
// org.omg.CORBA.Object ncobj = orb.resolve_initial_references("NameService");
// NamingContextExt nc = NamingContextExtHelper.narrow(ncobj);
// nc.bind(nc.to_name("MyServerObject"), obj);
修改bindҎ为rebindQƈ引入新的c?/font>
2. 扑ֈq注释客LMyServiceClientImpl.java里mainҎ的下列代码:
LineNumberReader input = new LineNumberReader(new FileReader("server.ior"));
String ior = input.readLine();
org.omg.CORBA.Object obj = orb.string_to_object(ior);
取消下列代码Q位|在上面代码的上方)的注释:
// org.omg.CORBA.Object ncobj = orb.resolve_initial_references("NameService");
// NamingContextExt nc = NamingContextExtHelper.narrow(ncobj);
// org.omg.CORBA.Object obj = nc.resolve_str("MyServerObject");
引入新的c?/font>
修改org.omg.CORBA.Object ncobj = orb.resolve_initial_references("NameService");里面的参敎ͼ服务端Server_AOM.java也要攏V?/font>
改ؓ"corbaloc::1.2@hostname:portNumber/NameService"
修改resolve_initial_referencesҎ为string_to_object
修改所有异ؓException
3. 用命令行的方式,在OpenOrb\NamingService\bin目录下执行ins -ORBPort=portNumber
4. 带参?-ORBInitRef NameService=corbaloc::1.2@hostname:portNumber/NameService q行服务端Server_AOM.javaQ?/font>
5. 然后q行客户端程序MyServiceClientImpl.javaQ结果是一L?/font>
目前为止Qcorba的本地、远E开发都已经配置完毕?/font>