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,问题应该解决了,看起来效果和第一种方式没什么不同。