2waySSL数字证书

来源:互联网 发布:移车易软件下载 编辑:程序博客网 时间:2024/05/16 06:07
1 数字证书使用的场合
●加密传输
●机器比较固定
●使用USB Key

2 数字证书的颁发

2.1

概述

数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。证书授权中心(CA)对证书的数字签名过程即为证书的颁发过程。
CA非常重要!企业范围内,建议自建CA,或者采用可信任的证书颁发机构的ROOT CA。

下面介绍使用Openssl(http://www.openssl.org)结合JDK自带的keytool工具来产生CA证书、服务器证书以及可导入浏览器的KCS#12格式个人证书。

2.2
创建自签名CA

设置系统环境变量Path指向Openssl的bin目录

建立工作目录:
mkdir ca
cd ca  

2.2.1 生成ca私钥
openssl dsaparam -out dsaparam 1024  
openssl gendsa -out cakey.pem dsaparam


2.2.2 生成ca待签名证书

openssl req -new -out ca-req.csr -key cakey.pem -config ..\openssl.cnf //-config ..\openssl.cnf may remove

2.2.3用CA私钥进行自签名,得到自签名的CA根证书
openssl x509 -req -in ca-req.csr -out ca-cert.cer -signkey cakey.pem -days 365

至此,自签名CA根证书制作完毕。当前目录下将产生四个文件,分别是:
●ca-cert.cer
●ca-req.csr
●cakey.pem
●dsaparam

生成CA根证书
openssl pkcs12 -export -clcerts -in ca-cert.cer  -inkey cakey.pem -out ca.p12

2.2.4 openssl.cnf
配置文档
#
# SSLeay example configuration file.
# This is mostly being used for generation of certificate requests.
#
RANDFILE = .rnd
####################################################################
[ ca ]
default_ca= CA_default
# The default ca section
####################################################################
[ CA_default ]
dir = ssl
certs = $dir\certs
crl_dir = $dir\crl
database = $dir\index.txt
new_certs_dir = $dir
certificate = $dir\cacert.pem
serial = $dir\serial
crl = $dir\crl.pem
private_key = $dir\privkey.pem
RANDFILE = $dir\privkey.rnd
# For the CA policy
[ policy_match ]
countryName= optional
stateOrProvinceName= optional
organizationName= optional
organizationalUnitName= optional
commonName= supplied
emailAddress= optional
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
countryName= optional
stateOrProvinceName= optional
localityName= optional
organizationName= optional
organizationalUnitName= optional
commonName= supplied
emailAddress= optional
####################################################################
[ req ]
default_bits= 1024
default_keyfile = privkey.pem
distinguished_name= req_distinguished_name
attributes= req_attributes
[ req_distinguished_name ]
countryName= Country Name (2 letter code)
countryName_min= 2
countryName_max= 2
stateOrProvinceName= State or Province Name (full name)
localityName= Locality Name (eg, city)
organizationName= Organization Name (eg, company)
organizationalUnitName= Organizational Unit Name (eg, section)
commonName = Common Name (eg, your website's domain name)
commonName_max= 64
emailAddress = Email Address
emailAddress_max= 40
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min= 4
challengePassword_max = 20
[ x509v3_extensions ]
# under ASN.1, the 0 bit would be encoded as 80
nsCertType= 0x40
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
#nsCertSequence
#nsCertExt
#nsDataType



2.3 颁发服务器证书
服务器端证书用来向客户端证明服务器的身份,也就是说在SSL协议握手的时候,服务器发给客户端的证书。生成服务器证书时用到了JDK
的密钥管理工具Keytool.

建立工作目录:
cd ..  
mkdir server
cd server  

2.3.1 生成服务器私钥对及自签名证书
生成的文件将保存在密钥库mykeystore中。
keytool -genkey -alias myserver -keyalg RSA -keysize 1024 -keypass keypass -storepass keypass
-dname "cn=localhost, ou=support, o=apusic, l=shenzhen, st=guangdong, c=CN" -keystore mykeystore  

2.3.2 生成服务器待签名证书

keytool -certreq -alias myserver -sigalg SHA1withRSA -file server.csr -keypass keypass -storepass

keypass -keystore mykeystore  

2.3.3 请求CA签名服务器待签名证书,得到经CA签名的服务器证书
openssl x509 -req -in server.csr -out server-cert.cer -CA ..\ca\ca-cert.cer -CAkey ..\ca\cakey.pem -days 365 -set_serial 02  

2.3.4把CA根证书导入密钥库mykeystore
keytool -import -alias caroot -file ..\ca\ca-cert.cer -noprompt -keypass keypass -storepass keypass -keystore mykeystore  

2.3.5把经过CA签名的服务器证书导入密钥库mykeystore

keytool -import -alias myserver -file server-cert.cer -noprompt -keypass keypass -storepass keypass -keystore mykeystore  

至此,服务器证书已经生成,并且已经将服务器证书、密钥、根证书导入到了密钥库mykeystore。本环节产生三个文件:
●mykeystore
●server.csr
●server-cert.cer

2.4 颁发客户端证书

个人证书用来向服务器证明个人的身份,也就是说在SSL协议握手的时候,客户端发给服务器端的证书。同时个人证书中包含个人信息如用户名等,如果需要,
这个用户名将作为登录服务器的用户名。

建立工作目录:
cd ..  
mkdir client
cd client  

2.4.1 生成客户端私钥
openssl genrsa -out clientkey 1024

2.4.2 生成客户端待签名证书
openssl req -new -out client.csr -key clientkey -config ..\openssl.cnf

2.4.3请求CA签名客户端待签名证书,得到经CA签名的客户端证书
openssl x509 -req -in client.csr -out client.cer -CA ..\ca\ca-cert.cer -CAkey ..\ca\cakey.pem -days 365 -set_serial 02  

生成客户端的个人证书client.p12
openssl pkcs12 -export -clcerts -in client.cer -inkey clientkey -out client.p12
至此,个人证书已经制作完毕。本环节产生四个文件,分别是
●clientkey
●client.csr
●client.cer
●client.p12

2.5 CA根证书导入客户端
在这里CA的根证书用来在SSL握手时验证服务器发给客户端浏览器的证书。如果没有此证书,浏览器将无法自动验证服务器证书,因此浏览器将弹出确认信息,
让用户来确认是否信任服务器证书。 在客户端的IE中使用"工具-> Internet选项 -> 内容 -> 证书-> 导入"把我们生成的CA根证书ca\ca-cert.cer
导入至受信任的根证书颁发机构,使其成为用户信任的CA。

2.6个人证书导入客户端
在客户端的IE中使用"工具 -> Internet选项 ->内容 -> 证书-> 导入"把我们生成的CA根证书client.p12导入个人,使其成为用户信任的CA。

3 在J2EE中使用证书
3.1 配置SSL双向认证
Apusic应用服务器默认配置下不支持双向认证,要支持SSL双向认证,需要对配置作如下修改:

3.1.1 服务器端密钥库和信任库

在本文中密钥库和信任库放在一起,都放在server\mykeystore中,在前面已经创建了 mykeystore,并且把服务器证书和CA根证书导入了mykeystore。
现在需要把mykeystore拷贝到DOMAIN_HOME\config目录下。
copy server\mykeystore %DOMAIN_HOME%\config
注意:使用Apusic 4.0.3时,这里的DOMAIN_HOME表示Apusic安装目录;使用Apusic 5.0 + 时,表示Apusic安装目录下domains目录中当前所使用到的domain目录。

3.1.2修改Muxer服务

打开DOMAIN_HOME\config\apusic.conf文件,默认Muxer服务的配置如下:
<SERVICE CLASS="com.apusic.net.Muxer" >
<ATTRIBUTE NAME="Port" VALUE="6888"/>
<ATTRIBUTE NAME="Backlog" VALUE="50"/>
<ATTRIBUTE NAME="Timeout" VALUE="300"/>
<ATTRIBUTE NAME="SSLEnabled" VALUE="True"/>
<ATTRIBUTE NAME="SecurePort" VALUE="6889"/>
<ATTRIBUTE NAME="KeyStore" VALUE="config/sslserver"/>
<ATTRIBUTE NAME="KeyPassword" VALUE="keypass"/>
</SERVICE>

改成如下:
<SERVICE CLASS="com.apusic.net.Muxer">
<ATTRIBUTE NAME="Port" VALUE="6888"/>
<ATTRIBUTE NAME="Backlog" VALUE="50"/>
<ATTRIBUTE NAME="Timeout" VALUE="300"/>
<ATTRIBUTE NAME="MaxWaitingClients" VALUE="500"/>
<ATTRIBUTE NAME="WaitingClientTimeout" VALUE="5"/>
<ATTRIBUTE NAME="SSLEnabled" VALUE="True"/>
<ATTRIBUTE NAME="SecurePort" VALUE="6889"/>
<ATTRIBUTE NAME="KeyStore" VALUE="config/mykeystore"/>
<ATTRIBUTE NAME="KeyPassword" VALUE="keypass"/>
<ATTRIBUTE NAME="MutualAuthPort" VALUE="443"/>
<ATTRIBUTE NAME="NeedClientAuth" VALUE="True"/>
<ATTRIBUTE NAME="TrustStore" VALUE="config/mykeystore"/>
<ATTRIBUTE NAME="TrustStorePassword" VALUE="keypass"/>
<ATTRIBUTE NAME="TrustStoreType" VALUE="JKS"/>
</SERVICE>

3.1.3修改SecurityService服务

打开DOMAIN_HOME\config\apusic.conf文件,默认SecurityService
服务的配置如下:
<SERVICE CLASS="com.apusic.security.SecurityService">
</SERVICE>

改成如下:
<SERVICE CLASS="com.apusic.security.SecurityService">
<ATTRIBUTE NAME="ClientRootCA" VALUE="config/mykeystore"/>
</SERVICE>

3.2 在程序中获取证书信息

在JSP页面中,访问证书很简单,代码样例如下:
X509Certificate[]  
certs=(X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");
X500Principal cert = certs[0].getIssuerX500Principal();
String cn = cert.getName("CN");

可以获得的证书相关属性值包括:CN、L、ST、O、OU、C、STREET、DC 和 UID。进一步的详细使用方法请参考

JDK API (http://gceclub.sun.com.cn/Java_Docs/jdk6/html/zh_CN/api/javax/security/auth/x500/X500Principal.html)。


Sample:
CA:
openssl dsaparam -out dsaparam 1024  
openssl gendsa -out cakey.pem dsaparam
openssl req -new -out ca-req.csr -key cakey.pem -config ..\openssl.cnf //-config ..\openssl.cnf may remove
openssl x509 -req -in ca-req.csr -out ca-cert.cer -signkey cakey.pem -days 3650
openssl pkcs12 -export -clcerts -in ca-cert.cer  -inkey cakey.pem -out ca.p12

server:
##for admin used to configured SSL)
keytool -genkey -alias qfix_server -keyalg RSA -keysize 1024 -keypass password -storepass password -dname "cn=ifop-app382.hkg.swissbank.com, ou=SPARTA, o=ODC, l=ShenZhen, st=GuangDong, c=CN" -keystore qfix_server_keystore.jks
keytool -certreq -alias qfix_server -sigalg SHA1withRSA -file qfix_server.csr -keypass password -storepass password -keystore qfix_server_keystore.jks
openssl x509 -req -in qfix_server.csr -out qfix_server.cer -CA ca-cert.cer -CAkey cakey.pem -days 3650 -set_serial 02
keytool -import -alias caroot -file ca-cert.cer -noprompt -keypass password -storepass password -keystore qfix_server_keystore.jks
keytool -import -alias qfix_server -file qfix_server.cer -noprompt -keypass password -storepass password -keystore qfix_server_keystore.jks  

client:
##for webjava(webEar)[System.setProperty("javax.net.ssl.keyStore",webInfoPath+ConstantKeys.SPARTA_FIX_KEYSTORE);
                   System.setProperty("javax.net.ssl.keyStorePassword","password");]
keytool -genkey -alias sparta_fix -keyalg RSA -keysize 1024 -keypass password -storepass password -dname "cn=ifop-app382.hkg.swissbank.com, ou=SPARTA, o=ODC, l=ShenZhen, st=GuangDong, c=CN" -keystore sparta_fix_keystore.jks
keytool -certreq -alias sparta_fix -sigalg SHA1withRSA -file sparta_fix.csr -keypass password -storepass password -keystore sparta_fix_keystore.jks
openssl x509 -req -in sparta_fix.csr -out sparta_fix.cer -CA ca-cert.cer -CAkey cakey.pem -days 3650 -set_serial 02
keytool -import -alias caroot -file ca-cert.cer -noprompt -keypass password -storepass password -keystore sparta_fix_keystore.jks
keytool -import -alias sparta_fix -file sparta_fix.cer -noprompt -keypass password -storepass password -keystore sparta_fix_keystore.jks


or
##(just for IE used)
openssl genrsa -out clientkey 1024
openssl req -new -out client.csr -key clientkey
openssl x509 -req -in client.csr -out qfix_client.cer -CA ca-cert.cer -CAkey cakey.pem -days 3650 -set_serial 02
openssl pkcs12 -export -clcerts -in qfix_client.cer -inkey clientkey -out qfix_client.p12
 


 







0 0