小城,风带香

好好学习,天天向上

tomcat实现SSL双向认证

春天的熊:

一、基础知识

 

 

Tomcat 简介

Tomcat是Apache Jakarta的子项目之一,作为一个优秀的开源web应用服务器,全面支持jsp1.2以及servlet2.3规范。因其技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的web应用服务器。

 

https(Secure Hypertext Transfer Protocol)安全超文本传输协议 简介

https是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层。

它是由Netscape开发并内置于其浏览器中,旨在达到在开放网络(Internet)上安全保密地传输信息的目的。

用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的完全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。。

 

SSL (Secure Socket Layer)简介

为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。

 

 

(附)SSL工作原理
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. 本次握手过程结束,会话已经建立。双方使用同一个会话密钥分别对发送以及接受的信息进行加、解密。

 

二、tomcat实现SSL配置

 

 第一步 生成KeyStore

 

keytool -genkey -alias tomcat -keyalg RSA –keysize 1024 –validity 730 -keystore D:\server.keystore

生成.keystore文件在 用户目录下
输入keystore密码: ************
您的名字与姓氏是什么?
[Unknown]: localhost
您的组织单位名称是什么?
[Unknown]: dept
您的组织名称是什么?
[Unknown]: Inc
您所在的城市或区域名称是什么?
[Unknown]: bj
您所在的州或省份名称是什么?
[Unknown]: bj
该单位的两字母国家代码是什么
[Unknown]: CN
CN=localhost, OU= dept, O= Inc, L=bj, ST=bj, C=CN 正确吗?
[否]: Y

输入的主密码
(如果和 keystore 密码相同,按回车):*************

注意: localhost,是网站的域名或者ip,根据实际情况填写,比如 www.baidu.com  192.168.0.85  否则会出现证书上的名称无效,或者与站点名称不匹配。

 

建议:将生成的 server.keystore文件,放到%TOMCAT_HOME%或其子目录中(如:%TOMCAT_HOME%/conf)

(其实放哪里都一样,只是放到%TOMCAT_HOME%里面会方便一些)

 

第二步 修改server.xml

 

 修改%TOMCAT_HOME%/conf/server.xml

去掉下面SSL HTTP那个注释,修改为如下: 

Xml代码 

1          <Connector port="8443" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"    

2             SSLEnabled="true"  

3             maxThreads="150"  

4             scheme="https"  

5             secure="true"  

6             clientAuth="false"  

7             sslProtocol="TLS"    

8             keystoreFile="/conf/server.keystore"  

9             keystorePass="changeit" />  

10       <Connector port="8443" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"  

11          SSLEnabled="true"  

12          maxThreads="150"  

13          scheme="https"  

14          secure="true"  

15          clientAuth="false"  

16          sslProtocol="TLS"  

17          keystoreFile="/conf/server.keystore"  

18          keystorePass="changeit" />  

keystoreFile 是server.keystore放置的位置,keystorePass是密码 (默认密码是changeit)

 

第三步

重启Tomcat,访问地址https://ip:8443/

 

 

 

 

 

 

(附录:)tomcat的配置文件SSL部分详细说明
 

配置文件server.xml,SSL部分:

Xml代码 

19           <!– A "Connector" represents an endpoint by which requests are received   

20                and responses are returned. Documentation at :   

21                Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)   

22                Java AJP  Connector: /docs/config/ajp.html   

23                APR (HTTP/AJP) Connector: /docs/apr.html   

24                Define a non-SSL HTTP/1.1 Connector on port 8080   

25           –>  

26           <Connector  port="8443" maxHttpHeaderSize="8192"  

27               maxThreads="150"  

28               minSpareThreads="25"  

29               maxSpareThreads="75"  

30               enableLookups="false"  

31               disableUploadTimeout="true"  

32               acceptCount="100"  

33               scheme="https"  

34               secure="true"  

35               clientAuth="false"  

36               sslProtocol="TLS"  

37               keystoreFile="D:/Tomcat/conf/tomcatKey.keystore"  

38               keystorePass="changeit"  

39               algorithm="SunX509"  

40           />  

41           <!-- A "Connector" represents an endpoint by which requests are received  

42                and responses are returned. Documentation at :  

43                Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)  

44                Java AJP  Connector: /docs/config/ajp.html  

45                APR (HTTP/AJP) Connector: /docs/apr.html  

46                Define a non-SSL HTTP/1.1 Connector on port 8080  

47           -->  

48           <Connector  port="8443" maxHttpHeaderSize="8192"  

49               maxThreads="150"  

50               minSpareThreads="25"  

51               maxSpareThreads="75"  

52               enableLookups="false"  

53               disableUploadTimeout="true"  

54               acceptCount="100"  

55               scheme="https"  

56               secure="true"  

57               clientAuth="false"  

58               sslProtocol="TLS"  

59               keystoreFile="D:/Tomcat/conf/tomcatKey.keystore"  

60               keystorePass="changeit"  

61               algorithm="SunX509"  

62           />  

 

属性说明:

port:     这个port属性(默认值是8443)是 TCP/IP端口数码,Tomcat在其上监听安全连接。你可以把它更改成任何你愿意要的数值(如默认的https通信,数目是443)。不过,在许多操作系统中,要想在比1024小的端口数码上运行Tomcat,需要特殊的设置(它超出了这个文档资料的范围)。
 
redirectPort: 如果你在这里更改端口数值,你还必须更改在non-SSL连接器上的redirectPort 这个属性特定的值。这允许Tomcat自动地redirect那些试图访问有安全限制页面的用户,指明根据 Servlet 2.4 Specification要求,SSL是必需的
 
clientAuth: 如果你想要Tomcat要求所有的SSL客户在使用这个socket时出示用户认证书,把这个值设定为 true 。如果你想要Tomcat要求出示用户认证书,但是如果没有认证书也可以, 就把这个值设定为want 。
 
keystoreFile: 如果你产生的keystore文件不在Tomcat期望的默认地方(一个叫做.keystore 的文件在Tomcat运行的主目录),就添加这个属性。你可以指定一个绝对路径名称, 或者一个由$CATALINA_BASE环境变量而派生的相对路径名称。
 
keystorePass: 如果你使用一个不同的keystore(以及认证书)密码,而不是Tomcat期望的密码 (就是changeit),添加这个元素。
 
keystoreType: 如果使用一个PKCS12 keystore的话,就添加这个element。 有效的值是JKS 和 PKCS12
 
sslProtocol: 要在这个socket上被使用的加密/解密协定。如果你在使用Sun的JVM,我们不提倡更改 这个值。据报道,TLS协定的IBM's 1.4.1 实现与一些通用的浏览器不兼容。 如果是这样,就使用value SSL
 
ciphers: 这个socket允许使用的由逗号分隔开的加密密码列单。默认的情况下,任何可用的密码都允许被使用。
 
algorithm: 可用的X509算法。默认是Sun的实现( SunX509 )。 对于IBM JVMs,你应该使用值 IbmX509。对于其他卖主,查阅JVM文档资料来 找正确的值。
 
truststoreFile: 用来验证用户认证书的TrustStore文件。
 
truststorePass: 访问TrustStore的密码。默认值就是keystorePass的值。
 
truststoreType: 如果你在使用与KeyStore不同格式的TrustStore,添加这个元素。 合法的值是JKS和PKCS12
 
keyAlias: 如果 keystore 里面有多个 key,你可以为用这个选项为加入的 key 起一个名字。 如果没有指定名字,使用时 keystore 内的第一个 key 将会被使用

 

评论

热度(3)