Tomcat配置Https

HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

HTTPS解决的问题:

一、信任主机的问题.

采用https 的server(服务器) 必须从CA (Certificate Authority)申请一个用于证明服务器用途类型的证书. 该证书只有用于对应的server 的时候,客户端才信任此主机. 所以目前所有的银行系统网站,关键部分应用都是https 的. 客户通过信任该证书,从而信任了该主机.

二、通讯过程中的数据的泄密和被篡改

1. 一般意义上的https, 就是 server 有一个证书.

a) 主要目的是保证server 就是他声称的server. 这个跟第一点一样.

b) 服务端和客户端之间的所有通讯,都是加密的.

i. 具体讲,是客户端产生一个对称的密钥,通过server 的证书来交换密钥. 一般意义上的握手过程.

ii. 接下来所有的信息往来就都是加密的. 第三方即使截获,也没有任何意义.因为他没有密钥. 当然篡改也就没有什么意义了.

2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书.

a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码, 还有一个CA 认证过的身份. 因为个人证书一般来说是别人无法模拟的,所有这样能够更深的确认自己的身份.

b) 目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘(即U盾)作为一个备份的载体.

关于单向认证和双向认证

单向认证:客户端向服务器发送消息,服务器接到消息后,用服务器端的密钥库中的私钥对数据进行加密,然后把加密后的数据和服务器端的公钥一起发送到 客户端,客户端用服务器发送来的公钥对数据解密,然后在用传到客户端的服务器公钥对数据加密传给服务器端,服务器用私钥对数据进行解密,这就完成了客户端 和服务器之间通信的安全问题,但是单向认证没有验证客户端的合法性。

双向认证:客户端向服务器发送消息,首先把消息用客户端证书加密然后连同时把客户端证书一起发送到服务器端,服务器接到消息后用首先用客户端证书把 消息解密,然后用服务器私钥把消息加密,把服务器证书和消息一起发送到客户端,客户端用发来的服务器证书对消息进行解密,然后用服务器的证书对消息加密, 然后在用客户端的证书对消息在进行一次加密,连同加密消息和客户端证书一起发送到服务器端,到服务器端首先用客户端传来的证书对消息进行解密,确保消息是 这个客户发来的,然后用服务器端的私钥对消息在进行解密这个便得到了明文数据。

在万达在线网站中的应用:

在万达网站中,我们需要对用户登录,注册已经支付页面的数据通过HTTP提交到服务器的过程中,进行加密,所以访问这些页面的URL需要采用HTTPS协议。在这过程中,只需要采用单向认证的形式,即客户信任服务器,则安装证书。在用户数据提交至服务器之前,浏览器将使用证书的公钥对数据进行加密,然后提交至服务器,服务器使用证书的私钥对数据进行解密。这样,保证了数据在传输过程中的安全。所有我们需要进行的工作就是生成服务器证书,配置Tomcat使得Tomcat支持https。

使Tomcat支持HTTPS

Ø 第一步:为服务器生成证书
使用keytool为Tomcat生成证书,假定目标机器的域名是“localhost”,keystore文件存放在“E:\tomcat.keystore”,使用如下命令生成:
keytool -genkey -v -alias tomcat -keyalg RSA -keystore E:\tomcat.keystore
安装提示输入用户名,组织,地区,国家等,即可正确生成,该步为服务器生成了证书。单向认证的话,到这一步即可。但是这样产生的证书,因为没有经过专门的CA认证,浏览器访问时,会弹出警告。

Ø 第二步:为客户端生成证书
下一步是为浏览器生成证书,以便让服务器来验证它。为了能将证书顺利导入至IE和Firefox,证书格式应该是PKCS12,因此,使用如下命令生成:
keytool -genkey -v -alias myKey -keyalg RSA -storetype PKCS12 -keystore my.p12 -dname "CN=MyKey,OU=cn,o=cn,L=cn,ST=cn,C=cn" -storepass password1 -keypass password2

Ø 第三步:让服务器信任客户端证书
由于是双向SSL认证,服务器必须要信任客户端证书,因此,必须把客户端证书添加为服务器的信任认证。由于不能直接将PKCS12格式的证书库导入,我们必须先把客户端证书导出为一个单独的CER文件,使用如下命令:
keytool -export -alias myKey -keystore my.p12 -storetype PKCS12 -storepass password1 -rfc -file my.cer
通过以上命令,客户端证书就被我们导出到“C:\my.cer”文件了。下一步,是将该文件导入到服务器的证书库,添加为一个信任证书:
keytool -import -v -file my.cer -keystore E:\tomcat.keystore -storepass changeit

Ø 最后:配置tomcat根目录下中conf的server.xml
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="E:/tomcat.keystore" keystorePass="111111"
truststoreFile="E:/tomcat.keystore" truststorePass="111111"
/>
验证:其中,clientAuth指定是否需要验证客户端证书,如果该设置为“false”,则为单向SSL验证,SSL配置可到此结束。如果clientAuth设置为“true”,表示强制双向SSL验证 ,必须验证客户端证书。如果clientAuth设置为“want”,则表示可以验证客户端证书,但如果客户端没有有效证书,也不强制验证。 true是 服务器不会颁发证书必须由客户端导入 。重启服务器,输入url:https://localhost/可看到tomcat欢迎页面,即为成功。

Ø 特别说明:其实做完第一步,然后配置tomcat根目录下中conf的server.xml中的Connector即可使的tomcat支持https了。如果还需要对客户端进行验证,则需进行二三步。

支持特定页面采用HTTPS传输,普通页面采用HTTP传输

HTTPS相比HTTP来说,最大的好处就是安全。但是为了安全付出的代价是牺牲了性能。

所有我们需要采取控制,对特定需要https的页面采用https传输,普通页面采取http传输。

我们采用了过滤器。过滤器中的逻辑是这样子的,分为四种情况:

Ø 当前协议是HTTPS,当前请求的URL是需要采取 HTTPS传输的URL,直接请求页面。

Ø 当前协议是HTTPS,当前请求的URL是不需要采取 HTTPS传输的URL,重定向到HTTP的端口。

Ø 当前协议是HTTP,当前请求的URL是不需要采取 HTTPS传输的URL,直接请求该页面。

Ø 当前协议是HTTP,当前请求的URL是需要采取 HTTPS传输的URL,重定向到HTTPS的端口

发表评论