前提:
已经安装WebLogic9应用服务器,需要使用SSL(单向或者是双向),但是不想用DEMO版本的证书,而是想用自己的CA签名的证书(或者是自己创建的证书申请,然后由信任机构签名的证书也可以参考本文)。
其实,用自己的CA签名的证书有很多好处(bea不推荐在生产环境下用DEMO证书,而信任机构签名收费不菲):可以任意创建服务器所需要的证书(SSL通信需要证书,Web Service也需要独立的签名证书及加密证书等等);可以用自己的CA任意创建IE客户端证书;可以用自己的CA创建存储到jks中的证书以提供给JAVA程序使用等等。
具体工作:
需要做的是生成CA自签名证书,然后利用CA自签名证书再生成服务器证书与其它客户端证书,当然,还有其它的一些额外操作(如将客户端证书存放到服务器的truststore中等)。
环境要求:
操作系统是Windows XP SP3,安装的软件有:
1. jdk1.6.0_10,安装目录JAVA_HOME=D:\Program Files\Java\jdk1.6.0_10
2. BEA的WebLogic Server 10.3,安装目录BEA_HOME=D:\Program Files\bea
3. VS2008(Microsoft Visual Studio 9.0,主要安装VC)或者Microsoft Visual Studio 6.0(主要是VC++),安装目录MVS_HOME=D:\Program Files\Microsoft Visual Studio 9.0\VC。
在实现过程中需要的软件有:
Perl for win32:(ActivePerl-5.10.1.1006-MSWin32-x86-291086.msi
Openssl:(openssl-0.9.8k.tar.tar)
安装 activeperl
ActivePerl下载的是.msi文件,点击后可以安装,安装后,添加环境变量:
PERL_HOME= D:\Program Files\Perl
在path环境变量中增加:%PERL_HOME%\bin;
安装operssl
下载openssl的压缩源文件以后,解开压缩到目录D:\openssl-0.9.8k目录,通过DOS窗口,进入 到 D:\openssl-0.9.8k目录后,执行
1. perl Configure VC-WIN32 --prefix=c:/openssl
其中c:/openssl为准备安装openssl的目录,注意要写作/,否则会在编译cversion.c文件时出现错误信息。
2. cd D:\Program Files\Microsoft Visual Studio 9.0\VC\bin
然后在该目录输入 >VCVARS32.BAT。注册环境变量。
(注:找到VCVARS32.BAT所在的VC安装目录就行,上面的地址是我电脑上的目录)
3. cd D:\openssl-0.9.8k
4. ms\do_ms
如果上述执行没有错误,则创建相应的安装目录c:/openssl,然后执行
5. 编译 nmake -f ms\ntdll.mak
6. 测试 nmake -f ms\ntdll.mak test
7. 安装 nmake -f ms\ntdll.mak install
安装openSSL,编译的时间比较长,请耐心等待,并且确认没有错误。
Openssl安装成功以后,需要增加如下的环境变量:
OPENSSL_HOME=C:\openSSL
在path中添加:%OPENSSL_HOME%\bin
增加环境变量:
OPENSSL_CONF=%OPENSSL_HOME%\openssl.cnf
对于各个软件的初始化设置,主要是设置环境变量,通过“我的电脑”右键,“属性”-“高级”-“环境变量”,添加如下:
JAVA_HOME=D:\Program Files\Java\jdk1.6.0_10
BEA_HOME=D:\Program Files\bea
MVS_HOME=D:\Program Files\Microsoft Visual Studio 9.0\VC
CLASSPATH=%BEA_HOME%\wlserver_10.3\server\lib\weblogic.jar; %JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
INCLUDE=%MVS_HOME%\include
LIB=%MVS_HOME%\lib
在Path环境变量中增加(编译openssl使用和java相关命令使用)
%MVS_HOME%\bin;%MVS_HOME%\ce\bin;%BEA_HOME%\jdk160_05\bin;%JAVA_HOME%\bin…
在生成证书和私钥时,我们使用了openssl软件,由于openssl软件在windows上安装需要perl环境,因此我们需要下载Active Perl相关软件,并且需要安装VC++或者Delphi,以便编译安装openssl。
设置工作目录为myDir,目录结构为:
myDir\ca 目录,存放CA证书
myDir\server 目录,存放服务器证书
myDir\client 目录,存放客户端证书
myDir\ca\ca-cert.srl 文件,仅包括"00"两个字符,执行OpenSSL签名证书时需要读取此配置文件(每签名一个证书,此数加一)。
myDir\openssl.cnf 文件,从X:\OpenSSL\bin目录拷贝过来,执行OpenSSL生成待签名证书命令时需要使用此配置文件。
myDir\setEnv.cmd 文件,内容为:
call X:\bea91\weblogic91\samples\domains\wl_server\setExamplesEnv.cmd
作用为设置WebLogic的环境,这样才可以调用keytool,java utils.pem2der等命令。
开始:
打开命令行窗口,切换到myDir目录。然后执行setEnv.cmd命令,以设置环境。
步骤一:创建自签名CA证书
1. 生成CA私钥
openssl genrsa -out ca\ca-key.pem 1024
2. 生成待签名证书
openssl req -new -out ca\ca-req.csr -key ca\ca-key.pem -config openssl.cnf
(这是交换式命令,需要输入证书信息)
3. 用CA私钥进行自签名
openssl x509 -req -in ca\ca-req.csr -out ca\ca-cert.pem -signkey ca\ca-key.pem -days 7300
步骤二:创建服务器证书
1. 生成KeyPair
keytool -genkey -alias support -keyalg RSA -keysize 1024 -dname "cn=127.0.0.1, ou=Mycompany Support WebService, o=Mycompany Inc,l=Beijing, st=Beijing, c=CN" -keypass mypassword -keystore server\support.jks -storepass support -validity 7300
2. 生成待签名证书
keytool -certreq -alias support -sigalg "MD5withRSA" -file server\certreq.pem -keypass mypassword -keystore server\support.jks -storepass support
3. 用CA私钥进行签名
openssl x509 -req -in server\certreq.pem -out server\supportcert.pem -CA ca\ca-cert.pem -CAkey ca\ca-key.pem -days 7300
4. 导入信任的CA根证书到指定的jks文件
keytool -import -alias rootca -trustcacerts -file ca\ca-cert.pem -keystore server\supporttrust.jks -storepass rootca
5. 导入服务器证书到指定的jks文件
...下面,需要用编辑器合并ca-cert.pem与supportcert.pem的内容,ca-cert.pem在前面,请注意不要留下空格之类的字符在文档里面;然后再执行下面的命令,否则会报"keytool错误: java.lang.Exception: 无法从回复中建立链接"的错误...
keytool -import -alias support -trustcacerts -file server\supportcert.pem -keypass mypassword -keystore server\support.jks -storepass support
6. 到这儿,服务器证书制作完成。最终输出为:server\support.jks与server\supporttrust.jks两个文件,可以在WebLogic 9的控制台中配置SSL的相关设置以使用新的证书。具体操作可以参考bea公司的在控制中配置SSL的文档,或者是参考附录中的SWF。
步骤三:创建IE客户端证书(在双向SSL的情况下使用)
1. 生成client私钥
openssl genrsa -out client\client-key.pem 1024
2. 生成待签名证书
openssl req -new -out client\client-req.csr -key client\client-key.pem -config openssl.cnf
(这是交换式命令,需要输入证书信息)
3. 用CA私钥进行签名
openssl x509 -req -in client\client-req.csr -out client\client.crt -signkey client\client-key.pem -CA ca\ca-cert.pem -CAkey ca\ca-key.pem -CAcreateserial -days 7300
4. 生成client端的个人证书
因为JSSE1.0.2没有完全实现了对PKCS#12格式文件的操作(只能读取,不能输出),所以在这里需要用openssl制作client端的个人证书(已经包含私钥)。
openssl pkcs12 -export -clcerts -in client\client.crt -inkey client\client-key.pem -out client\client.p12
5. 生成信任的根证书,把ca\ca-cert.pem拷贝为ca\ca-cert.cer。
copy ca\ca-cert.pem ca\ca-cert.cer
6. 到这儿,IE客户端证书制作完成。最终输出为ca\ca-cert.cer与client\ client.p12这两个证书,需要在IE中安装此两个证书 (直接单击文件名即可,安装个人证书的过程可能需要输入创建时的密码-如果创建个人证书时输入了密码的话)。
步骤四:创建JAVA调用keystore(像Web Service中的2way SSL需要使用此keystore)
类似服务器证书的制作,但是要注意:
The SSL package of J2SE requires that the password of the client's private key must be the same as the password of the client's keystore.
1. 创建KeyPair
keytool -genkey -alias clientsupport -keyalg RSA -keysize 1024 -dname "CN=127.0.0.1, OU=test webservice, O=test, L=Beijing, ST=Beijing, C=CN" -keypass support -keystore client\clientsupport.jks -storepass support -validity 7300
2. 生成待签名证书
keytool -certreq -alias clientsupport -sigalg "MD5withRSA" -file client\clientreq.pem -keypass support -keystore client\clientsupport.jks -storepass support
3. 用CA私钥进行签名
openssl x509 -req -in client\clientreq.pem -out client\clientcert.pem -CA ca\ca-cert.pem -CAkey ca\ca-key.pem -days 7300
4. 生成truststore
keytool -import -alias rootca -trustcacerts -file ca\ca-cert.pem -keystore client\supporttrust.jks -storepass rootca
5. 生成keystore
...下面,需要合并ca-cert.pem与clientcert.pem的内容,ca-cert.pem在前面;然后...
keytool -import -alias clientsupport -trustcacerts -file client\clientcert.pem -keypass support -keystore client\clientsupport.jks -storepass support
6. 到这儿,JAVA调用的keystore制作完成。最终输出为client\supporttrust.jks与client\clientsupport.jks两个文件。提供给JAVA程序即可以使用。
步骤五:创建JAVA调用证书(像Web Service中的message-level级别需要用此证书)
下面是在IE客户端的证书基础上进行的。
1. 拷贝client.crt为client-cert.pem,这样就有了client-cert.pem证书与client-key.pem私钥。
copy client\client.crt client\client-cert.pem
2.将client-cert.pem转换为der格式。
java utils.pem2der client\client-cert.pem
3.. 将client-key.pem转换为pkcs8的der格式。
openssl pkcs8 -topk8 -inform PEM -outform DER -in client\client-key.pem -out client\client-key-pkcs8.der -nocrypt
用最终生成的client-cert.der与client-key-pkcs8.der两个文件提供给JAVA客户端调用。
其它操作:
1. 查看keystore内容
keytool -list -keystore server\supporttrust.jks
keytool -list -keystore client\clientsupport.jks
2. 加其它证书到服务器truststore
先转换服务器证书DER格式为PEM格式:
openssl x509 -inform DER -outform PEM -in client-cert.der -out client-cert.pem
然后导入到truststore中
keytool -import -alias demowebca -trustcacerts -file client-cert.pem -keystore server\supporttrust.jks -storepass rootca