since.2006  

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

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

异同之处
tomcat4中使用SSL中的异同:jdk1.4中已经包含JSSE。
AcegiX.509双向认证中的异同:tomcat6配置文件多了SSLEnabled="true"属性。

实现方法

  • 生成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

  • 生成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

  • 生成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

  • 根据root证书生成jks文件
C:\OpenSSL\apps\root>keytool -import -v -trustcacerts -storepass password -alias root -file root-cert.pem -keystore root.jks
  • 配置tomcat使用SSL

修改conf/server.xml,tomcat6中多了SSLEnabled="true"属性。keystorefile, truststorefile设置为你正确的相关路径

<CONNECTOR truststorepass="123456" truststoretype="JKS" truststorefile="d:/path/bin/x509/root.jks"  
keystorepass="123456" keystoretype="PKCS12" keystorefile="d:/path/bin/x509/server.p12" clientauth="true"  
sslprotocol="TLS" acceptcount="100" disableuploadtimeout="true" enablelookups="false" maxsparethreads="75"  
minsparethreads="25" maxthreads="150" maxhttpheadersize="8192" sslenabled="true" port="8443" protocol="HTTP/1.1"  
scheme="https" secure="true" />
  • 将root.p12,client.p12分别导入到IE中去(IE->;Internet选项->内容->证书)

root.p12导入至受信任的根证书颁发机构,client.p12导入至个人

  • 访问你的应用http://ip:8443,如果配置正确的话会出现请求你数字证书的对话框。
  • 在jsp中取得符合x.509格式的证书
<%    
    //获得certificate chain    
    X509Certificate[] ca = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");    
    if (ca == null) {    
        out.println("No cert info!");    
    } else {    
        String serial = ca[0].getSerialNumber().toString();    
        String DN = ca[0].getSubjectDN().toString();    
    }    
%> 
标签:

Posted by hee at 06:09 AM | Permalink | 评论(2) | WEB

5789 天 18 小时前
沙发 tom 说:

问个问题:keystorefile必须要使用PKCS12格式的吗?

我在做单向认证的时候,就是默认的JKS(keystore文件),能通过。
改成双向认证之后,客户端会提示提供数字证书,但可用的列表中一个也没有。(客户端已安装带私钥且跟server的证书是同一个CA认证的证书)
我设的keystorefile和truststorefile一样,都是默认JKS类型。

5788 天 23 小时前
板凳 hee 说:

to TOM:
不好意思,这个我也不太清楚了,当时作项目时只用了数字证书中最基本的功能,没有深入学习。

你可以先改为PKCS12格式试试,然后再改为JKS格式试试两者之间的区别

请输入名称
请输入邮件地址

 

    请输入邮件地址