BlogJava 联系 聚合 管理  

Blog Stats

随笔分类

随笔档案


chinadave

2009年12月14日 #

Tomcat6.0 SSL的配置

J2EE   2009-07-27 15:30   阅读217   评论0  
字号:    

1. 参考:

Tomcat 6.0 自带的文档docs/ssl-howto.html,详细介绍了配置过程。

2. 目的:

       以下详细描述配置过程,仅作为备忘录。

3. 备忘录:

Step1,安装tomcat 6.0.18,此为当前最新版本,需JDK5.0或以上。

l         JDK安装后,可以在命令行下使用如下命令检测是否成功。

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)

看到以上蓝色信息,则表示JDK安装配置成功。

l         Tomcat的运行需要配置JDK_HOMEJRE_HOME环境变量,JRE_HOME默认等于JDK_HOME的值。

Step2,创建服务器端certificate keystore和自签名certificate

       在命令行下使用如下命令:

C:\Documents and Settings\new>keytool -genkey -alias mykey -keyalg RSA -keystore server.keystore

输入keystore密码:123456

再次输入新密码:123456

您的名字与姓氏是什么?

  [Unknown]  dinstone

您的组织单位名称是什么?

  [Unknown]  advance software ltd.

您的组织名称是什么?

  [Unknown]  china

您所在的城市或区域名称是什么?

  [Unknown]  beijing

您所在的州或省份名称是什么?

  [Unknown]  beijing

该单位的两字母国家代码是什么

  [Unknown]  cn

CN=dinstone, OU=advance software ltd., O=china, L=beijing, ST=beijing, C=cn 正确吗?

  []  y

 

输入<mykey>的主密码

        (如果和 keystore 密码相同,按回车):

C:\Documents and Settings\new下可以找到一个文件:server.keystore,其中就包含了自签名的证书。

注意:

       这里要求certificate keystore certificate的密码一致,此为Tomcat的约束。

Step3,在%TOMCAT_HOME%目录下新建目录keystore,并拷贝server.keystore到其目录下。

Step4,修改%TOMCAT_HOME%/conf/server.xml文件。添加httpsConnector

<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"/>

注意:

       keystoreFile指向文件%TOMCAT_HOME%/keystore/server.keystore文件。

       keystorePass就是刚才生成certificate keystore的密码。

Step5,测试Https。访问https://localhost:8443/,提示有不安全的证书,接受证书,看到可亲的tom猫。

4. 延伸

某些情况下,某些特定资源需要走https协议,如登录请求。这时,我们可以在web.xml中配置约束。

<security-constraint>

       <web-resource-collection>

           <web-resource-name>SSL Resource</web-resource-name>

           <url-pattern>/login.jsp</url-pattern>

       </web-resource-collection>

       <user-data-constraint>

               <transport-guarantee>
                       CONFIDENTIAL

</transport-guarantee>

       </user-data-constraint>

</security-constraint>

这样当使用如下请求访问登录页面时,则服务器将该请求建立在https连接上。

http://localhost:8080/CCB/login.jsp

posted @ 2009-12-14 17:30 whoami 阅读(553) | 评论 (0)编辑 收藏

最近要做一个登录时数字证书验证的功能,在用户登录时除了效验用户名密码,还需验证其数字证书。

相关资源:IBM developerWroks中国中的tomcat4中使用SSLjavaeye中的Acegi X.509双向认证

tomcat4中使用SSL中的异同:jdk1.4中已经包含JSSE。

AcegiX.509双向认证中的异同:tomcat6配置文件多了SSLEnabled="true"属性。

1.生成CA证书。目前不使用第三方权威机构的CA来认证,自己充当CA的角色。

1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out root/root-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out root/root-req.csr -key root/root-key.pem
3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey
root/root-key.pem -days 3650
4.将证书导出成浏览器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey
root/root-key.pem -out root/root.p12

2.生成server证书。

1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out server/server-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out server/server-req.csr -key server/server-key.pem
3.自签署证书 :C:\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格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey
server/server-key.pem -out server/server.p12

3.生成client证书。

1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out client/client-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out client/client-req.csr -key client/client-key.pem
3.自签署证书 :C:\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格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey
client/client-key.pem -out client/client.p12

4.根据root证书生成jks文件

C:\OpenSSL\apps\root>keytool -import -v -trustcacerts -storepass password -alias root -file root-cert.pem
-keystore root.jks

5.配置tomcat ssl,修改conf/server.xml。tomcat6中多了SSLEnabled="true"属性。
keystorefile, truststorefile设置为你正确的相关路径
xml 代码
 
  1. <connector secure="true" scheme="https" protocol="HTTP/1.1" port="8443"      
  2. sslenabled="true" maxhttpheadersize="8192" maxthreads="150"      
  3. minsparethreads="25" maxsparethreads="75" enablelookups="false"      
  4. disableuploadtimeout="true" acceptcount="100" sslprotocol="TLS"      
  5. clientauth="true" keystorefile="d:/path/bin/x509/server.p12"      
  6. keystoretype="PKCS12" keystorepass="123456" truststorefile="d:/path/bin/x509/root.jks"    
  7. truststoretype="JKS" truststorepass="123456"/>    

6.将root.p12,client.p12分别导入到IE中去(打开IE->;Internet选项->内容->证书)。
root.p12导入至受信任的根证书颁发机构,client.p12导入至个人
7.访问你的应用http://ip:8443,如果配置正确的话会出现请求你数字证书的对话框。
8.在jsp中取得符合x.509格式的证书
  1. <%      
  2.         //获得certificate chain     
  3.         X509Certificate[] ca=(X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");     
  4.       if(ca==null)     
  5.       {     
  6.         out.println("No cert info!");     
  7.       } else {     
  8.         String  serial=ca[0].getSerialNumber().toString();     
  9.         String DN=ca[0].getSubjectDN().toString();       
  10.       }     
  11.       %> 


posted @ 2009-12-14 11:51 whoami 阅读(135) | 评论 (0)编辑 收藏

2009年11月16日 #

Java IDL技术在Java平台上添加了CORBA(Common Object Request Broker Architecture)功能,提供了基于标准的互操作能力和连接性。Java IDL技术使得分布式的Java Web应用能够通过使用工业标准的IDL和IIOP(Internet Inter-ORB Protocol)来透明地调用远程网络服务的操作。运行时组件(Runtime Components)包括了一个用于分布式计算且使用IIOP通信的Java ORB.

可移植对象适配器(Portable Object Adapter,POA)
CORBA对象的负责分隔服务器端远程调用句柄 (handler)到远程对象和它的服务者(servant)。对象由远程调用所暴露,而服务者包含实际处理这些请求的方法。每个对象都可以选择服务者为 静态的(一次)或动态的(每个远程调用),在这两种情况下,都允许调用转移到另一台服务器。
在服务器端,POA形成了类似树状的结构,每个POA都负责一到多个服务的对象。树的分支可以是独立活动的、或钝化的,服务者调用有不同的代码和不同的请求处理策略。

API规范
    * org.omg.CORBA 包 - 提供了OMG CORBA APIs到Java编程语言的映射
    * org.omg.CosNaming 包 - 为Java IDL提供命名服务
    * org.omg.PortableServer 包 - 为建立服务器端的可移植的、跨越多ORB的应用程序提供类和接口
    * org.omg.PortableInterceptor 包 - 提供了注册ORB钩子的机制,此钩子通过ORB服务能截取正常的ORB执行流
    * org.omg.DynamicAny 包 - 提供了使得任何值都能被动态解释(或遍历)和通过DynAny对象构造出来的类和接口
    * org.omg.CORBA.ORB - 为CORBA ORB功能的API

分布式对象之间的关系有两方面:客户端和服务器。
服务器提供远程接口,客户端调用远程接口。
在客户端,应用程序包括远程对象的引用。该对象引用有stub方法,它是独立的远程方法。stub方法实际连接到ORB,因此调用它实际上转发调用到服务器。
在服务器端,ORB使用skeleton代码翻译远程调用为本地对象的方法调用。Skeleton把调用转换成指定实现的格式,并在方法中调用。当方法返回时,Skeleton代码转换方法调用的结果或错误,经ORB送回客户端。

Java IDL开发过程
1)定义远程接口
使用IDL语言为远程对象定义接口。
【Billing.idl源代码】如下:

  1. // 声明CORBA IDL模块  
  2. module BillingApp{  
  3.     // 声明接口  
  4.     interface Billing{  
  5.         string successBilling();  
  6.         oneway void shutdown();  
  7.     };  
  8. };  

2)编译远程接口
使用idlj编译器生成Java语言的stub和skeleton源文件。
idlj编译器缺省只生成客户端的binding代码。如果同时需要客户端的bindings和服务器端的skeletons,必须加上-fall选项。
使用POA(Portable Object Adaptor)的优点:
· 允许编程者构建对象在不同ORB产品之间的可移植实现
· 支持带持久化标识的对象
· 对对象的透明活动提供支持
· 允许单个servant支持多种对象同时标识
注意:确定jdk/bin目录下有:idlj、java、javac、orbd
命令:
 idlj -fall Billing.idl
在当前目录下生成BillingApp目录,包含如下六个文件:
· Billing.java    ————> 此接口包含IDL接口的Java版本。它继承自org.omg.CORBA.Object,提供标准的CORBA对象功能。
· BillingHelper.java    ————> 此类提供辅助功能,Helper类负责读写数据类型到CORBA流,以及插入和提取数据类型。
· BillingHolder.java    ————> This final class holds a public instance member of type Billing.
· BillingOperations.java    ————> 此接口包含successBilling()和shutdown()方法。
· BillingPOA.java    ————> 此抽象类是基于流的服务器Skeleton,为服务器提供基本的CORBA功能。它继承org.omg.PortableServer.Servant, 实现了InvokeHandler接口和BillingOperations接口。服务器类BillingServant继承BillingPOA。
· _BillingStub.java    ————> 此类是客户端stub,为客户端提供CORBA功能。它继承org.omg.CORBA.Object,提供标准CORBA对象功能。还扩展了 BillingOperations接口和org.omg.CORBA.portable.IDLEntity接口。

3)实现服务器端
一旦使用idlj编译器后,就可以使用它产生的Skeleton装配服务器应用程序了。另外要实现远程接口方法,服务器代码应包含启动ORB和等待远程客户端调用的机制。
服务器端由两个类组成,一个是servant,另一个是Server。
servant是BillingImpl类,是Billing IDL接口的实现,每个Billing实例均由BillingImpl实例实现。servant是BillingPOA的子类。
servant包含了IDL定义的所有方法,与通常的Java方法类似。
server类含服务器的main()方法,它:
· 创建和初始化ORB实例
· 获得根POA的引用并激活POAManager
· 创建一个Servant实例(CORBA的Billing对象的实现)并通知ORB
· 获得根命名上下文
· 在命名上下文用“Billing”名注册新对象
· 等待客户端调用此新对象

【BillingImpl.java源码】:

  1. import org.omg.CORBA.ORB;  
  2. import BillingApp.*;  
  3. class BillingImpl extends BillingPOA{  
  4.  private ORB orb;  
  5.  public void setORB(ORB orb_val){  
  6.   this.orb = orb_val;  
  7.  }  
  8.  /** 
  9.   * 实现successBilling()方法 
  10.   */  
  11.  public String successBilling() {  
  12.   return "\nBilling success!!\n";  
  13.  }  
  14.  /** 
  15.   * 实现shutdown()方法 
  16.   */  
  17.  public void shutdown(){  
  18.   orb.shutdown(false);  
  19.  }  
  20. }  

【BillingServer.java源码】:

  1. import org.omg.CORBA.ORB;  
  2. import org.omg.CosNaming.NameComponent;  
  3. import org.omg.CosNaming.NamingContextExt;  
  4. import org.omg.CosNaming.NamingContextExtHelper;  
  5. import org.omg.PortableServer.POA;  
  6. import BillingApp.*;  
  7. public class BillingServer {  
  8.  public static void main(String args[]){  
  9.   try{  
  10.    // 创建和初始化ORB  
  11.    ORB orb = ORB.init(args, null);  
  12.    // 获得根POA的引用并激活POAManager  
  13.    POA rootpoa = (POA)orb.resolve_initial_references("RootPOA");  
  14.    rootpoa.the_POAManager().activate();  
  15.    // 创建servant并注册到ORB  
  16.    BillingImpl billingImpl = new BillingImpl();  
  17.    billingImpl.setORB(orb);  
  18.    // 从servant获得对象引用  
  19.    org.omg.CORBA.Object ref = rootpoa.servant_to_reference(billingImpl);  
  20.    Billing href = BillingHelper.narrow(ref);  
  21.    // 得到根命名上下文  
  22.    org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");  
  23.    // 使用命名上下文,它是互操作命名服务规范的一部分  
  24.    NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);  
  25.    // 在命名中绑定对象引用  
  26.    String name = "Billing";  
  27.    NameComponent path[] = ncRef.to_name(name);  
  28.    ncRef.rebind(path, href);  
  29.    System.out.println("BillingServer is ready and waiting...");  
  30.    // 等待客户端调用  
  31.    orb.run();  
  32.   }catch(Exception e){  
  33.    System.err.println("ERROR:"+e);  
  34.    e.printStackTrace(System.out);  
  35.   }  
  36.   System.out.println("BillingServer Exiting ...");  
  37.  }  
  38. }  

4)实现客户端
与第三步类似,可以使用idlj产生的stub作为客户端应用程序的基础。客户端代码建立于stub之上,启动ORB,使用服务器提供的命名服务查询,获得远程对象的引用,调用其方法。
【BillingClient.java源码】:

  1. import org.omg.CORBA.ORB;  
  2. import org.omg.CosNaming.NamingContextExt;  
  3. import org.omg.CosNaming.NamingContextExtHelper;  
  4. import BillingApp.*;  
  5. public class BillingClient {  
  6.  static Billing billingImpl;  
  7.  public static void main(String args[]){  
  8.   try{  
  9.    // 创建和初始化ORB  
  10.    ORB orb = ORB.init(args, null);  
  11.    System.out.println("ORB initialised");  
  12.    // 获得根命名上下文  
  13.    org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");  
  14.    // 使用NamingContextExt代替命名上下文,它是互操作命名服务的一部分  
  15.    NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);  
  16.    // 在命名中解析对象引用  
  17.    String name = "Billing";  
  18.    billingImpl = BillingHelper.narrow(ncRef.resolve_str(name));  
  19.      
  20.    System.out.println("Obtained a handle on server object: "+billingImpl);  
  21.    System.out.println(billingImpl.successBilling());  
  22.    billingImpl.shutdown();  
  23.   }catch(Exception e){  
  24.    System.out.println("ERROR: "+e);  
  25.    e.printStackTrace(System.out);  
  26.   }  
  27.  }  
  28. }  


5)启动应用程序
要运行服务器和客户端,必须先启动命名服务,再启动服务器,最后运行客户端。
此例用到命名服务,它使得servant对象的操作对客户端有效。服务器需要命名服务的对象引用,命名服务可以发布对象引用实现各种接口。客户端使用对象引用来调用方法。
Java SE 1.4以上提供了两种可选的命名服务:
· tnameserv
一种透明的命名服务
· orbd
包含自启动服务、透明的命名服务、持久化命名服务和命名管理器的后台处理进程。
本例使用orbd。

5.1)启动orbd
注意:Solaris系统运行要求root权限并以1024端口开始进程。因此,对所有OS,可以选用大于或等于1024的端口以实现统一。
-ORBInitialPort选项用于指定端口(非缺省状态)。
例如:假定使用1050端口的Java ORB Daemon(orbd),命令如下:
start orbd -ORBInitialPort 1050 -ORBInitialHost localhost

5.2)开始Billing服务器
start java BillingServer -ORBInitialPort 1050 -ORBInitialHost localhost
注:如在同一台主机上运行,可省略-ORBInitialHost localhost

5.3)运行客户端应用程序
java BillingClient -ORBInitialPort 1050 -ORBInitialHost localhost

posted @ 2009-11-16 11:05 whoami 阅读(370) | 评论 (0)编辑 收藏

一、 使用到的软件
1. corba产品:OpenORB
下载地址:
http://sourceforge.net/projects/openorb/
解压后如下图所示



2. 开发工具Eclipse 3.4.2


3. 插件:ORBStudio777
下载地址:.
ftp://www.orbzone.org 用户名称:orbzone_downloads 密码:orbzone_downloads
使用第三方Ftp工具或者迅雷的资源探测器登陆后进入CORBA_Utilities文件夹,下面有3个zip压缩文件ORBStudio 775, ORBStudio776, ORBStudio777 ,我选择了777下载。
解压后如下图所示

4. Javacc
下载javacc,网址:
https://javacc.dev.java.net/
解压后如下图所示

二、安装配置
1. 解压OpenOrb.rar
2. 解压ORBStudio777.zip,从ORBStudio/plugins/下面取得 ORBStudio_7.7.7.jar 的JAR包放到Eclipse/plugins下面.我用的Eclipse版本是Eclipse3.4.2。如果考入Jar包前以前Eclipse是运行 的请关闭,重新运行。
3. 运行CMD 到DOS,再到存放javacc的bin目录,输入 javacc -tm D:\Eclipse3.22\eclipse\ORBStudio\IDLParser.jj

4. 添加环境变量TCOO_HOME,值为OpenOrb目录的路径
5. 启动eclipse
6. windows/preferences/出现如下窗口选择ORB Studio/IDL Compiler/ 在右边选择OpenORB这里有5种编译器我们使用JacORB. 打开IDL Compiler 前面的加号选择

右边参数IDL Command: D:\ComponentTechnology\OpenOrb\OpenORB\bin\idl2java.bat
Command Options: -d %D% %F%

这样就配置成功了Eclipse下面的Corba开发。Eclipse的新建选择如图:


三、开发步骤参考
1. 在eclipse里新建项目,Project lauyout 选择Create separate source and output folders

2. 给新项目添加Libraries,右键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文件

3. src上右键New--->Other--->CORBA Wizard--->IDL files--->Simple IDL

4. 选择IDL文件,右键ORB Menu--->Compile,就自动生成文件

5. src上右键New--->Other--->CORBA Wizard--->Server--->Active object map--->Next在弹出的对话框里IDL filename栏选择/{projectName}/src/{IDLname}.idl
    Interface栏选择IDL文件里定义的接口名
    Package栏里填写包名
    Server classname栏里填写服务端类名
--->Next 在弹出的对话框,选中Create server class:项

6. 为生成的服务端类添加未实现的方法,并填写方法体

7. src 上右键New--->Other--->CORBA Wizard--->Client--->Simple implementation 在弹出的对话框里IDL filename栏选择/{projectName}/src/{IDLname}.idl
    Interface栏选择IDL文件里定义的接口名
    Package栏里填写包名
    Client classname栏里填写客户端类名

8. 在客户端类的main方法里,取消注释test.getORBInterface().operation1("A message in the bottle..."); 并修改传递的String内容

9. 运行服务端程序Server_AOM.java,然后运行客户端程序MyServiceClientImpl.java

如果,你要将你的程序包发布到别的机器上,就要用到名称服务,使用名称服务,我们需要在java代码上作些修改:

使用名称空间的配置:

1. 找到并注释服务端Server_AOM.java里main方法的下列代码:

PrintWriter ps = new PrintWriter(new FileOutputStream(new File("server.ior")));
ps.println(orb.object_to_string(obj));
ps.close();

取消下列代码(位置在上面代码的上方)的注释:

// org.omg.CORBA.Object ncobj = orb.resolve_initial_references("NameService");
// NamingContextExt nc = NamingContextExtHelper.narrow(ncobj);
// nc.bind(nc.to_name("MyServerObject"), obj);

修改bind方法为rebind,并引入新的类


2. 找到并注释客户端MyServiceClientImpl.java里main方法的下列代码:

LineNumberReader input = new LineNumberReader(new FileReader("server.ior"));
String ior = input.readLine();
org.omg.CORBA.Object obj = orb.string_to_object(ior);

取消下列代码(位置在上面代码的上方)的注释:

// org.omg.CORBA.Object ncobj = orb.resolve_initial_references("NameService");
// NamingContextExt nc = NamingContextExtHelper.narrow(ncobj);
// org.omg.CORBA.Object obj = nc.resolve_str("MyServerObject");

引入新的类

修改org.omg.CORBA.Object ncobj = orb.resolve_initial_references("NameService");里面的参数,服务端Server_AOM.java也要改。

改为"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 运行服务端Server_AOM.java,


5. 然后运行客户端程序MyServiceClientImpl.java,结果是一样的。

目前为止,corba的本地、远程开发都已经配置完毕。

posted @ 2009-11-16 09:42 whoami 阅读(1133) | 评论 (0)编辑 收藏

仅列出标题