在基于spring框架下使用HTTPS技术需要对Tomcat服务器以及Spring进行配置。
首先使用java命令:keytool
jdk1.7中keytool命令列表如下:
-certreq 生成证书请求
-changealias 更改条目的别名
-delete 删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令
快速创建命令:
keytool -genkey -alias tomcat -keyalg RSA
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]:
您的组织单位名称是什么?
[Unknown]:
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的省/市/自治区名称是什么?
[Unknown]:
该单位的双字母国家/地区代码是什么?
[Unknown]:
创建完成后可以通过keytool -list 查看
==========================
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
==========================
同时在用户根目录下将会创建一个.keystore文件
将.keystore文件放在一个合适的位置(之后要用)
配置Tomcat:
找到Tomcat目录下的conf/server.xml文件
找到有关8443端口的一项,取消注释,修改几项。如:
<Connector port="8443" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="conf/keystore/.keystore" keystorePass="你的密匙口令"
protocol="org.apache.coyote.http11.Http11NioProtocol"
acceptCount="100" disableUploadTimeout="true" enableLookups="false"
/>
配置成功后,启动 Tomcat 并访问 https://localhost:8443. 你将看到 Tomcat 默认的首页。
配置项目
配置应用使用 SSL,不同框架配置方式可能有所不同,一下是通用配置:
打开应用的 web.xml 文件,增加配置如下:
<security-constraint>
<web-resource-collection>
<web-resource-name>securedapp</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
将 URL 映射设为 /* ,这样你的整个应用都要求是 HTTPS 访问,而 transport-guarantee 标签设置为 CONFIDENTIAL 以便使应用支持 SSL。
如果你希望关闭 SSL ,只需要将 CONFIDENTIAL 改为 NONE 即可。
对站点进行自动的安全保护
我们假设你在对客户的数据进行SSL保护时遇到了麻烦,你想把应用的特定部分置于SSL的保护之下。幸运的是,Spring Security让这一切变得很简单,只需要在<intercept-url>声明上添加一个配置属性。
requires-channel属性能够添加到任何<intercept-url>声明中,以要求所有匹配的URL要以特定的协议(HTTP,HTTPS或都可以)进行传递。如果按照这种形式来增强JBCP Pets站点,配置可能如下所示:
- <http auto-config="true" use-expressions="true">
- <intercept-url pattern="/login.do" access="permitAll"
- requires-channel="https"/>
- <intercept-url pattern="/account/*.do"
- access="hasRole('ROLE_USER') and fullyAuthenticated"
- requires-channel="https"/>
- <intercept-url pattern="/*" access="permitAll"
- requires-channel="any"/>
- <!-- ... -->
- </http>
如果此时重启应用,你将会发现:
l 现在访问登录页和账号页需要HTTPS,浏览器将会为用户自动从不安全的(HTTP)URL重定向到安全的URL。安全的端口映射
在一些特定的环境中,可能不会使用标准的HTTP和HTTPS端口,其默认为80/443或8080/8443。在这种情况下,你必须配置你的应用包含明确的端口映射,这样ChannelEntryPoint的实现能够确定当重定向用户到安全或不安全的URL时,使用什么端口。
这仅需要增加额外的配置元素<port-mappings>,它能够指明除了默认的端口以外,额外的HTTP 的HTTPS端口:
- <port-mappings>
- <port-mapping http="9080" https="9443"/>
- </port-mappings>
如果你的应用服务器在反向代理后的话,端口映射将会更加的重要。