SSL认证(单向认证+双向认证+WebService+Jboss)

一、SSL(Server Socket Layer)简介
Netscape公司提出的SSL协议,旨在达到 在开放网络(Internet)上安全保密地传输信息的目的,这种协议在WEB上获得了广泛的应用。 之后IETF(www.ietf.org )对SSL作了标准化,即RFC2246,并将其称为TLS(Transport Layer Security),从技术上讲,TLS1.0与SSL3.0的差别非常微小。

 

二、工作原理

SSL协议使用不对称加密技术实现会话双方之间信息的安全传递。可以实现信息传递的保密性、完整性,并且会话双方能鉴别对方身份。不同于常用的http协议,我们在与网站建立SSL安全连接时使用https协议,即采用https://ip:port/ 的方式来访问。
当我们与一个网站建立https连接时,我们的浏览器与Web Server之间要经过一个握手的过程来完成身份鉴定与密钥交换,从而建立安全连接。具体过程如下:
1.      用户浏览器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送到服务器。
2.      服务器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送给浏览器,同时发给浏览器的还有服务器的证书。如果配置服务器的SSL需要验证用户身份,还要发出请求要求浏览器提供用户证书。
3.      客户端检查服务器证书,如果检查失败,提示不能建立SSL连接。如果成功,那么继续。
4.      客户端浏览器为本次会话生成pre-master secret,并将其用服务器公钥加密后发送给服务器。
5.      如果服务器要求鉴别客户身份(双向认证),客户端还要再对另外一些数据签名后并将其与客户端证书一起发送给服务器。
6.      如果服务器要求鉴别客户身份,则检查签署客户证书的CA是否可信。如果不在信任列表中,结束本次会话。如果检查通过,服务器用自己的私钥解密收到的pre-master secret,并用它通过某些算法生成本次会话的master secret。
7.      客户端与服务器均使用此master secret生成本次会话的会话密钥(对称密钥)。在双方SSL握手结束后传递任何消息均使用此会话密钥。这样做的主要原因是对称加密比非对称加密的运算量低一个数量级以上,能够显著提高双方会话时的运算速度。
8.      客户端通知服务器此后发送的消息都使用这个会话密钥进行加密。并通知服务器客户端已经完成本次SSL握手。
9.      服务器通知客户端此后发送的消息都使用这个会话密钥进行加密。并通知客户端服务器已经完成本次SSL握手。
10.      本次握手过程结束,会话已经建立。双方使用同一个会话密钥分别对发送以及接受的信息进行加、解密。

 

三、服务器端证书

     命令行打开%java_home%/bin,keytool  是JDK提供的证书生成工具,所有参数的用法参见keytool –help

  1、生成服务端 证书私钥

    dos状态下执行命令:

keytool ‐genkey ‐v ‐alias jbossserver ‐keyalg RSA ‐keystore jbossserver.jks ‐dname "CN=127.0.0.1,OU=michael,O=michael,L=SZ,ST=GD,C=CN" ‐validity 3650 ‐storepass ffffff ‐keypass ffffff
说明:

keytool  是JDK提供的证书生成工具,所有参数的用法参见keytool –help
-genkey  创建新证书
-v  详细信息
-alias   jbossserver 以”jbossserver ”作为该证书的别名。这里可以根据需要修改
-keyalg  RSA 指定算法
-keystore   jbossserver .jks 保存在%java_home%/bin目录下
-dname  "CN=127.0.0.1,OU=michael,O=michael,L=SZ,ST=GD,C=CN " 证书发行者身份,这里的CN要与发布后的访问域名一致。但由于我们是自己发行的证书,如果在浏览器访问,仍然会有警告提示
-validity
 3650证书有效期,单位为天
-storepass   ffffff 证书的存取密码
-keypass   ffffff 证书的私钥

2、  生成证书签名请求
keytool -certreq -alias tomcat_server -sigalg MD5withRSA -file tomcat_server.csr -keypass 123456 -storepass 123456 -keystore server_keystore

 

导出服务端证书 

执行命令:

keytool -export -alias tomcat -keystore D:/SSL/server/tomcat.keystore -storepass pdepde -rfc -file D:/SSL/server/tomcat.cer  

说明:

把服务端证书导出。这里提供的密码也是服务端证书的密码。

 

1.2 生成客户端证书 

执行命令:

keytool ‐genkey ‐v ‐alias client ‐keyalg RSA ‐storetype PKCS12 ‐keystore D:/SSL/client/client.p12 ‐dname "CN=client,OU=pde,O=pde,L=bj,ST=bj,C=CN" ‐validity 3650 ‐storepass client ‐keypass client  

说明:

参数说明同上。这里的-dname  证书发行者身份可以和前面不同

 

1.3 导出客户端证书 

执行命令:

keytool ‐export ‐alias client ‐keystore D:/SSL/client/client.p12 ‐storetype PKCS12 ‐storepass client ‐rfc ‐file D:/SSL/client/client.cer  

说明:


-export  执行导出


-file
 导出文件的文件路径

 

1.4 把客户端证书加入服务端证书信任列表 

执行命令:

keytool ‐import ‐alias client ‐v ‐file D:/SSL/client/client.cer ‐keystore D:/SSL/server/tomcat.keystore ‐storepass pdepde  

说明:

参数说明同前。这里提供的密码是服务端  证书的密码。

1.5 导出服务端证书 

执行命令:

keytool -export -alias tomcat -keystore D:/SSL/server/tomcat.keystore -storepass pdepde -rfc -file D:/SSL/server/tomcat.cer  

说明:

把服务端证书导出。这里提供的密码也是服务端证书的密码。

1.6 生成客户端信任列表 

执行命令:

keytool -import -file D:/SSL/server/tomcat.cer -storepass pdepde -keystore D:/SSL/client/client.truststore -alias tomcat –noprompt  

说明:

让客户端信任服务端证书

 

2. 配置服务端参数


2.1 配置Tomcat 目录下的/conf/server.xml  

[xhtml]   view plain copy
  1. < Connector   port = "8443"   protocol = "HTTP/1.1"   SSLEnabled = "true"   
  2.    maxThreads = "150"   scheme = "https"   secure = "true"   clientAuth = "true"   
  3.    sslProtocol = "TLS"   keystoreFile = "D:/SSL/server/tomcat.keystore"   
  4.    keystorePass = "pdepde"   truststoreFile = "D:/SSL/server/tomcat.keystore"   
  5.    truststorePass = "pdepde"   />   



这里的参数clientAuth  决定了是否执行强制客户端证书验证,true-只允许持有证书的客户端执行https连接


2.2 配置服务端项目web.xml  

增加:

[xhtml]   view plain copy
  1. < security-constraint >   
  2.    < web-resource-collection >   
  3.      < web-resource-name > services </ web-resource-name >   
  4.      < url-pattern > /services/* </ url-pattern >   
  5.    </ web-resource-collection >   
  6.    < user-data-constraint >   
  7.      < transport-guarantee > CONFIDENTIAL </ transport-guarantee >   
  8.    </ user-data-constraint >   
  9. </ security-constraint >   




这里的“<url-pattern>/services/*</url-pattern>  ”指定了必须采用https的链接,当访问这些路径时,http协议的访问将被转发至https协议。这里需要根据服务端项目中web service的访问地址来配置

3. 修改客户端代码 

在执行访问之前,增加:

[java]   view plain copy
  1. System.setProperty( "javax.net.ssl.trustStore" "D:/SSL/client/client.truststore" );  
  2. System.setProperty("javax.net.ssl.trustStorePassword" , "pdepde" );  
  3. System.setProperty("javax.net.ssl.keyStoreType" , "PKCS12" ) ;  
  4. System.setProperty("javax.net.ssl.keyStore" , "D:/SSL/client/client.p12" ) ;  
  5. System.setProperty("javax.net.ssl.keyStorePassword" , "client" ) ;  
  6.   
  7. String endPoint="https://127.0.0.1:8443/easbCut/services/ApplyFormService" ;  
  8. ...  



通过设置参数来指定客户端连接时所使用的客户端证书,这里还可以采用修改JVM启动参数的的方式来执行,但处于不影响其他功能的考虑,这里采用System.setProperty的方式来设置这些参数,在使用结束后,可以还原这些参数配置。

做为客户端的开发者,可以把拿到的证书文件后,只执行步骤3。

 

 

====================================
JDK中keytool常用命令
-genkey      在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书
-alias       产生别名
-keystore    指定密钥库的名称(产生的各类信息将不在.keystore文件中
-keyalg      指定密钥的算法   
-validity    指定创建的证书有效期多少天
-keysize     指定密钥长度
-storepass   指定密钥库的密码
-keypass     指定别名条目的密码
-dname       指定证书拥有者信息 例如:  "CN=sagely,OU=atr,O=szu,L=sz,ST=gd,C=cn"
-list        显示密钥库中的证书信息      keytool -list -v -keystore sage -storepass ....
-v           显示密钥库中的证书详细信息
-export      将别名指定的证书导出到文件  keytool -export -alias caroot -file caroot.crt
-file        参数指定导出到文件的文件名
-delete      删除密钥库中某条目          keytool -delete -alias sage -keystore sage
-keypasswd   修改密钥库中指定条目口令    keytool -keypasswd -alias sage -keypass .... -new .... -storepass ... -keystore sage
-import      将已签名数字证书导入密钥库  keytool -import -alias sage -keystore sagely -file sagely.crt
             导入已签名数字证书用keytool -list -v 以后可以明显发现多了认证链长度,并且把整个CA链全部打印出来。
 
1.证书的显示
-list
[-v | -rfc] [-alias <alias>]
[-keystore <keystore>] [-storepass <storepass>]
[-storetype <storetype>] [-provider <provider_class_name>]
例如:keytool -list -v -alias RapaServer -keystore cacerts -storepass 12345678
keytool -list -v -keystore d2aapplet.keystore -storepass 12345678 -storetype IAIKKeystore
2.将证书导出到证书文件
例如:keytool -export -keystore monitor.keystore -alias monitor -file monitor.cer
将把证书库 monitor.keystore 中的别名为 monitor 的证书导出到 monitor.cer 证书文件中,它包含证书主体的信息及证书的公钥,不包括私钥,可以公开。
keytool -export -keystore d2aApplet.keystore -alias RapaServer -file Rapa.cert -storetype IAIKKeystore
3.将keystore导入证书中
这里向Java默认的证书 cacerts导入Rapa.cert
keytool -import -alias RapaServer -keystore cacerts -file Rapa.cert -keystore cacerts
4.证书条目的删除
keytool的命令行参数 -delete 可以删除密钥库中的条目,如: keytool -delete -alias RapaServer -keystore d2aApplet.keystore ,这条命令将 d2aApplet.keystore 中的 RapaServer 这一条证书删除了。
5.证书条目口令的修改
使用 -keypasswd 参数,如:keytool -keypasswd -alias RapaServer -keystore d2aApplet.keystore,可以以交互的方式修改 d2aApplet.keystore证书库中的条目为 RapaServer 的证书。
Keytool -keypasswd -alias RapaServer -keypass 654321 -new 123456 -storepass 888888 -keystore d2aApplet.keystore这一行命令以非交互式的方式修改库中别名为 RapaServer 的证书的密码为新密码 654321,行中的 123456 是指该条证书的原密码, 888888 是指证书库的密码。

你可能感兴趣的:(webservice)