tomcat实现SSL双向认证
一、基础知识Tomcat 简介Tomcat 是Apache Jakarta 的子项目之一,作为一个优秀的开源web 应用服务器,全面支持jsp1.2以及servlet2.3规范。因其技术先进、性能稳定
一、基础知识
Tomcat 简介
Tomcat 是Apache Jakarta 的子项目之一,作为一个优秀的开源web 应用服务器,全面支持jsp1.2以及servlet2.3规范。因其技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的web 应用服务器。
用于对数据进行压缩和解压操作,并返回网络上传送回的结果。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 连接时,我们的浏览器与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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
keystoreFile 是server.keystore 放置的位置,keystorePass 是密码 (默认密码是changeit)
第三步
重启Tomcat ,访问地址https://ip:8443/
,(附录:)tomcat 的配置文件SSL 部分详细说明 配置文件server.xml ,SSL 部分:
Xml 代码
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 secure ="true" clientAuth ="false" sslProtocol ="TLS" keystoreFile ="D:/Tomcat/conf/tomcatKey.keystore" keystorePass ="changeit" algorithm ="SunX509" />
属性说明:
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 将会被使用