深圳市金蝶中间件有限公司
2007年12月
Table of Contents
1 数字证书使用的场合.......................................................................................................................32 数字证书的颁发...............................................................................................................................32.1 概述...........................................................................................................................................32.2 创建自签名CA.........................................................................................................................32.2.1 生成ca私钥.......................................................................................................................32.2.2 生成ca待签名证书...........................................................................................................42.2.3用CA私钥进行自签名,得到自签名的CA根证书......................................................42.2.4 openssl.cnf配置文档.........................................................................................................52.3 颁发服务器证书.......................................................................................................................72.3.1 生成服务器私钥对及自签名证书....................................................................................72.3.2 生成服务器待签名证书....................................................................................................72.3.3 请求CA签名服务器待签名证书,得到经CA签名的服务器证书.............................82.3.4把CA根证书导入密钥库 mykeystore............................................................................82.3.5把经过CA签名的服务器证书导入密钥库mykeystore.................................................82.4 颁发客户端证书.......................................................................................................................92.4.1 生成客户端私钥................................................................................................................92.4.2生成客户端待签名证书....................................................................................................92.4.3请求CA签名客户端待签名证书,得到经CA签名的客户端证书............................10生成客户端的个人证书client.p12..........................................................................................102.5 CA根证书导入客户端...........................................................................................................112.6个人证书导入客户端..............................................................................................................113 在J2EE中使用证书.......................................................................................................................113.1 配置SSL双向认证.................................................................................................................113.1.1 服务器端密钥库和信任库..............................................................................................123.1.2修改Muxer服务..............................................................................................................123.1.3修改SecurityService服务...............................................................................................133.2 在程序中获取证书信息.........................................................................................................134 练习.................................................................................................................................................135 附录.................................................................................................................................................145.1 SSL v3的处理步骤.................................................................................................................145.2 命令行调试SSL证书.............................................................................................................14
1 数字证书使用的场合
●●●
加密传输机器比较固定使用USB Key
2 数字证书的颁发
2.1 概述数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。证书授权中心(CA)对证书的数字签名过程即为证书的颁发过程。
CA非常重要!企业范围内,建议自建CA,或者采用可信任的证书颁发机构的ROOT CA。
下面介绍使用Openssl(http://www.openssl.org)结合JDK自带的keytool工具来产生CA证书、服务器证书以及可导入浏览器的PKCS#12格式个人证书。
2.2 创建自签名CA
设置系统环境变量Path指向Openssl的bin目录建立工作目录:mkdir ca cd ca
2.2.1 生成ca私钥
openssl dsaparam -out dsaparam 1024
openssl gendsa -out dsakey dsaparam
2.2.2 生成ca待签名证书
openssl req -new -out ca-req.csr -key dsakey -config ..\\openssl.cnf
2.2.3用CA私钥进行自签名,得到自签名的CA根证书
openssl x509 -req -in ca-req.csr -out ca-cert.cer -signkey dsakey -days 365
至此,自签名CA根证书制作完毕。当前目录下将产生四个文件,分别是:
●●
ca-cert.cerca-req.csr
●●
dsakeydsaparam
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\\certscrl_dir = $dir\\crl
database = $dir\\index.txtnew_certs_dir = $dir
certificate = $dir\\cacert.pemserial = $dir\\serialcrl = $dir\\crl.pem
private_key = $dir\\privkey.pemRANDFILE = $dir\\privkey.rnd# For the CA policy[ policy_match ]countryName= optional
stateOrProvinceName= optionalorganizationName= optionalorganizationalUnitName= optionalcommonName= suppliedemailAddress= optional
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'# types.
[ policy_anything ]countryName= optionalstateOrProvinceName= optionallocalityName= optionalorganizationName= optionalorganizationalUnitName= optionalcommonName= suppliedemailAddress= optional
####################################################################[ req ]
default_bits= 1024default_keyfile = privkey.pem
distinguished_name= req_distinguished_nameattributes= req_attributes[ req_distinguished_name ]countryName= Country Name (2 letter code)countryName_min= 2countryName_max= 2stateOrProvinceNamelocalityName0.organizationNameorganizationalUnitNamecommonName
commonName_maxemailAddress
emailAddress_max[ req_attributes ]challengePassword
challengePassword_minchallengePassword_max
= State or Province Name (full name)= Locality Name (eg, city)
= Organization Name (eg, company)
= Organizational Unit Name (eg, section)= Common Name (eg, your website's domain name)
= 64= Email Address= 40
= A challenge password
= 4= 20
[ x509v3_extensions ]
# under ASN.1, the 0 bit would be encoded as 80nsCertType= 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\\dsakey -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。本环节产生三个文件:
●●
mykeystoreserver.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\\dsakey -days 365 -set_serial 02
生成客户端的个人证书client.p12
openssl pkcs12 -export -clcerts -in client.cer -inkey clientkey -out client.p12
至此,个人证书已经制作完毕。本环节产生四个文件,分别是:
●●●●
clientkeyclient.csrclient.cerclient.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服务的配置如下:
3.1.3修改SecurityService服务
打开DOMAIN_HOME\\config\\apusic.conf文件,默认SecurityService服务的配置如下:
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)。
4 练习
1 使用OpenSSL创建一个自签名证书2 创建并颁发一个服务器证书3 创建并颁发一个客户端证书
4 编写一个通过数字证书进行登录的应用
5 附录
5.1 SSL v3的处理步骤SSL status: \"SSLv3 write client hello A\" SSL status: \"SSLv3 read server hello A\" SSL status: \"SSLv3 read server certificate A\" SSL status: \"SSLv3 read server key exchange A\" SSL status: \"SSLv3 read server done A\"
SSL status: \"SSLv3 write client key exchange A\" SSL status: \"SSLv3 write change cipher spec A\" SSL status: \"SSLv3 write finished A\" SSL status: \"SSLv3 flush data\" SSL status: \"SSLv3 read finished A\"
5.2 命令行调试SSL证书openssl s_client -state -connect localhost:443 -cert client\\client.cer -key client\\clientkey -CAfile CA\\ca-cert.cer
因篇幅问题不能全部显示,请点此查看更多更全内容