Tomcat的HTTPS配置详解

HTTPS原理详解: http://blog.csdn.net/tenfyguo/article/details/5802682
http://blog.csdn.net/sean_cd/article/details/6966130
http://www.codeceo.com/article/https-worker.html
http://hittyt.iteye.com/blog/1618497
对称加密与非对称加密: http://www.cnblogs.com/jfzhu/p/4020928.html
几种加密算法的测试,包括对称加密和非对称加密: http://www.cnblogs.com/cnblogs-lin/archive/2012/10/18/2728996.html
SSL协议详解: http://kb.cnblogs.com/page/162080/
SSL与TLS的区别以及介绍: http://kb.cnblogs.com/page/197396/
web.xml中<security-constraint>和四种认证类型 : http://blog.csdn.net/lisheng19870305/article/details/40819481
tomcat提供安全机制-security-constraint: http://czh.iteye.com/blog/740138
Tomcat提供的安全机制: http://blog.csdn.net/doupei2006/article/details/11602247
HTTP 验证 Tomcat中进行基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication) :
[url] http://blog.csdn.net/renminzdb/article/details/42422141[/url]
完美配置Tomcat的HTTPS : http://blog.csdn.net/huaishuming/article/details/8965597
配置Tomcat使用https协议(配置SSL协议) : http://blog.csdn.net/jimmy609/article/details/18557955
配置Tomcat使用https协议: http://www.cnblogs.com/wanghaoyuhappy/p/5267702.html
Realm 配置: http://wiki.jikexueyuan.com/project/tomcat/realms-aaa.html

修改hosts文件
进入C:\Windows\System32\drivers\etc\文件夹下
修改hosts文件添加以下内容

127.0.0.1  www.donald.com


保存.
这个配置的域名,后面我们生成keystore的时候,要用到,查看能不能ping通
C:\Users\donald>ping www.donald.com

正在 Ping www.donald.com [127.0.0.1] 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64

127.0.0.1 的 Ping 统计信息:
    数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms


C:\Users\donald>java -version
java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)


我的java版本是:1.7.0_17

进入dos环境下,生成keystore,和crt文件,具体如下:
用java keytool工具,生成keystore文件

C:\Users\donald>keytool
密钥和证书管理工具
命令:
 -certreq            生成证书请求
 -changealias        更改条目的别名
 -delete             删除条目
 -exportcert         导出证书
 -genkeypair         生成密钥对
 -genseckey          生成密钥
 -gencert            根据证书请求生成证书
 -importcert         导入证书或证书链
 -importkeystore     从其他密钥库导入一个或所有条目
 -keypasswd          更改条目的密钥口令
 -list               列出密钥库中的条目
 -printcert          打印证书内容
 -printcertreq       打印证书请求的内容
 -printcrl           打印 CRL 文件的内容
 -storepasswd        更改密钥库的存储口令


使用 "keytool -command_name -help" 获取 command_name 的用法

生成keystore文件命令:
keytool -genkey -alias keyssl -keyalg RSA -keystore F:/keys


C:\Users\donald>keytool -genkey -alias keyssl -keyalg RSA -keystore F:/keys
输入密钥库口令:
再次输入新口令:
它们不匹配。请重试
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  www.donald.com
您的组织单位名称是什么?
  [Unknown]:  donald
您的组织名称是什么?
  [Unknown]:  donald
您所在的城市或区域名称是什么?
  [Unknown]:  guangzhou
您所在的省/市/自治区名称是什么?
  [Unknown]:  guangdong
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CN
CN=www.donald.com, OU=donald, O=donald, L=guangzhou, ST=guangdong, C=CN是否正确?
  [否]:  Y

输入 <keyssl> 的密钥口令
        (如果和密钥库口令相同, 按回车):
再次输入新口令:
我的密码是h123456




导出crt文件命令:
keytool -export -file F:/donald.crt -alias keyssl -keystore F:/keys

注意-alias 后的keyssl为F:/keys的别名,跟上面保持一致

C:\Users\donald>keytool -export -file F:/donald.crt -alias keyssl -keystore F:/keys

输入密钥库口令:
存储在文件 <F:/donald.crt> 中的证书




配置tomcat的conf目录下的server.xml文件,配置文件:
由于我的80端口已经被占用,这里我们用8080,我的tomcat版本是7.0.54
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" URIEncoding="UTF-8"/>	 

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
            maxThreads="150" maxHttpHeaderSize="8192" 
			enableLookups="false" disableUploadTimeout="true"
			acceptCount="100" scheme="https" secure="true"
			clientAuth="false" sslProtocol="SSL"
			ciphers="SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, 
			 TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 
			 SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,   
			 SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA"
			keystoreFile="F:/keys" keystorePass="h123456"/>

当我们访问web时,使用的是端口为80Connector,然后重定向到443端口,从上的配置
可以看是启用的SSL,scheme为https,客户端的验证状态为false,ssl协议为SSL,
ciphers算法为SSL_RSA_WITH_RC4_128_SHA,...,keystore文件为F:/keys,密码为h123456

SSLEnabled="true"
scheme="https"
clientAuth="false"
sslProtocol="SSL"
ciphers="SSL_RSA_WITH_RC4_128_SHA,..."
keystoreFile="F:/keys"
keystorePass="h123456"

这种配置方式,客户端不需要验证,同时keystorePass为明文;
另外一种配置方式:
参考:http://blog.sina.com.cn/s/blog_64a52f2a0101g35m.html
<Connector port="443" maxHttpHeaderSize="8192"
                 maxThreads="150"
                 enableLookups="false" disableUploadTimeout="true"
                 acceptCount="100" scheme="https" secure="true"
                 SSLEnabled="true"
                 sslProtocol="TLS" 
                 SSLCertificateFile="${catalina.base}/conf/server.cer"
                 SSLCertificateKeyFile="${catalina.base}/conf/server.key" />


SSLCertificateFile是指证书文件
SSLCertificateKeyFile是指私钥文件,
这两个问价你是如何来的呢?
首先下载openssl工具:http://gnuwin32.sourceforge.net/packages/openssl.htm

解压后除了openssl.exe以外,还有一个bat文件,这个可以帮助我们快速创建证书申请文件。
运行autocsr.bat,按照提示输入信息,之后按任意键确认。你会得到两个文件,
一个server.key,这是私钥文件,还有一个名为certreq.csr的证书请求文件。
如果你要向证书颁发机构申请正式的安全证书,那么就把这个certreq.csr文件发给他们就行了。
他们会给你发来两个cer文件,一个是服务器证书,一个是根证书;如果你只是要使用https,
那么证书自己签署就可以了。

步骤如下:
在命令行下,进入刚才解压的目录,找到openssl.exe所在的目录,执行以下命令
openssl x509 -req -in certreq.csr -out server.cer -signkey server.key -days 3650
现在你将得到一个名为server.cer的证书文件,这两个文件就是我们上面用的。

如果真的向证书颁发机构申请到了正式的安全证书,那么配置还有点不同,如下
<Connector port="443" maxHttpHeaderSize="8192"
                 maxThreads="150"
                 enableLookups="false" disableUploadTimeout="true"
                 acceptCount="100" scheme="https" secure="true"
                 SSLEnabled="true"
                 sslProtocol="TLS" 
		 SSLCertificateFile="conf/server.cer"
		 SSLCertificateKeyFile="conf/server.key"
		 SSLCertificateChainFile="conf/intermediate.cer" />


因为证书颁发机构会给两个整数,一个是签署后的服务器证书,还有一个中级CA证书,所以要多一行配置。
可能证书颁发机构只会给你服务器证书也就是server.cer,  中级的CA证书即 intermediate.cer 需要到
证书颁发机构提供的网站中去下载,具体的操作会为证书颁发机构给发的邮箱中会有相关的提示。


web.xml配置如下:
     
 <!-- 配置应用安全 -->
	<login-config> 
		<!-- Authorization setting for SSL --> 
		<!-- <auth-method>CLIENT-CERT</auth-method> 
		<realm-name>Client Cert Users-only Area</realm-name> 
		<auth-method>BASIC</auth-method>
		 -->
		<auth-method>BASIC</auth-method>
		
	</login-config> 
        <!-- 登录、注册SSL -->
        <security-constraint> 
		<web-resource-collection > 
			<web-resource-name >SSL</web-resource-name>
			<!-- /*代表对所有web资源,使用HTTPS -->
                        <!-- <url-pattern>/*</url-pattern> -->
                        <!-- 仅对以下连接,使用HTTPS -->
			<url-pattern>/login.do</url-pattern> 
			<url-pattern>/register.do</url-pattern> 
			<url-pattern>/saveRegist.do</url-pattern> 
			<http-method>GET</http-method>
			<http-method>POST</http-method>
		</web-resource-collection> 
		<user-data-constraint> 
			<transport-guarantee>CONFIDENTIAL</transport-guarantee> 
		</user-data-constraint> 
	</security-constraint>
	<!-- 禁止不安全的http方法 --> 
	<security-constraint> 
		<web-resource-collection> 
			<web-resource-name>unfortune</web-resource-name> 
			<url-pattern>/*</url-pattern> 
			<http-method>PUT</http-method> 
			<http-method>DELETE</http-method> 
			<http-method>HEAD</http-method> 
			<http-method>OPTIONS</http-method> 
			<http-method>TRACE</http-method> 
			<http-method>PATCH</http-method> 
		</web-resource-collection> 
		<auth-constraint></auth-constraint> 
	</security-constraint> 


login-config配置项:
auth-method:有四种客户端的认证方式BASIC,DIGEST,FORM,CLIENT-CERT认证;BASIC为base64方式,
DIGEST为md5信息摘要方式,FORM为基础自定义表单的认证,你可以指定登录时的验证表单,CLIENT-CERT方式,
客户端要安装数字证书;
ream-name: http://wiki.jikexueyuan.com/project/tomcat/realms-aaa.html

security-constraint配置项:
web-resource-collection:
web-resource-name:
url-pattern:
http-method:

此元素确定应该保护的资源,所有security-constraint元素都必须包含至少一个web-resource-collection项,
此元素由一个给出任意标识名称的web-resource-name元素、一个确定应该保护URL的url-pattern元素、
一个指出此保护所适用的HTTP命令(GET、POST等,缺省为所有方法)的http-method元素和
一个提供资料的可选description元素组成, 重要的是应该注意到,url-pattern仅适用于直接访问这些资源的客户机,
特别是,它不适合于通过MVC体系结构利用RequestDispatcher来访问的页面,
或者不适合于利用类似jsp:forward的手段来访问的页面;

auth-constraint:
子元素 auth-constraint需要和login-config相配合使用,也可可以被单独使用;
如果没有 auth-constraint子元素,这表明任何身份的用户都可以访问相应的资源,
也就是说,如果security-constraint>中没有auth-constraint子元素的话,配置实际上是不起作用的,
如果加入了 auth-constraint子元素,但是其内容为空,这表示所有身份的用户都被禁止访问相应的资源;

user-data-constraint:
这个可选的元素指出在访问相关资源时使用任何传输层保护,它必须包含一个transport-guarantee子元素
(合法值为NONE、 INTEGRAL或CONFIDENTIAL),并且可选地包含一个description元素,
transport-guarantee为NONE值将 对所用的通讯协议不加限制,
INTEGRAL值表示数据必须以一种防止截取它的人阅读它的方式传送,
虽然原理上(并且在未来的HTTP版本中),在 INTEGRAL和CONFIDENTIAL之间可能会有差别,
但在当前实践中,他们都只是简单地要求用SSL。

启动服务器,访问web,就可以看到效果,如下图:





选择信任,并前往www.donald.com即可访问web,
网上很多人说遇到这个问题,不过,我没有遇到,
通常会是一个exception,大概是说APR not available,如果遇到这个异常,
说明你的tomcat没有安装apr支持,apr安装详见: http://www.blogjava.net/yongboy/archive/2009/08/31/293343.html
之后启动tomcat,问题应该解决了,看起来效果和第一种方式没什么不同。

猜你喜欢

转载自donald-draper.iteye.com/blog/2333710