有的网站服务在web层数据传输时,需要保证数据的私密性,这时候就需要用到https来发送请求/接受数据。设置https又是需要求网站全局进行设置,有时仅仅需要对个别请求进行设置,比如登录(用户需要提交密码等隐私信息)。
在tomcat中配置https,可按照以下步骤进行操作:
1. 使用jdk自带的keytool生成证书
cmd进入java的安装目录下的bin文件夹,再执行以下语句(最后一个参数为生成证书的位置,可按需更改):
keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "D:\tomcat.keystore"
按照步骤完成设置,并生成keystore文件
② 再次输入新口令:即确认,再次输入123456
③ 您的名字与姓氏是什么:随便输入
④ 您的组织单位名称是什么:随便输入
⑤ 您所在的城市或区域名称是什么:随便输入
⑥ 您所在的省/市/自治区名称是什么?:随便输入
⑦ 该单位的双字母国家/地区代码是什么?:随便输入,如:CN
⑧ 是否正确:输入“y”
⑨ 输入 <tomcat> 的密钥口令 :输入①设置的口令,如123456
⑩ 再次输入新口令:输入①设置的口令,如123456
完成以上步骤,若没报错,则证书生成成功。
2.配置tomcat目录下conf/server.xml文件
找到以下被注释的内容:
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
type="RSA" />
</SSLHostConfig>
</Connector>
-->
修改为:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile="D:/tomcat.keystore"
keystorePass="123456">
</Connector>
说明:https端口为8443,相应的需要修改步骤1存放的keystore文件的位置,以及设置的keystorePass密钥口令。
至此,https就配置好了,访问https://localhost:8443/就可以work了。
3.强制使用https访问
正如开头提到的,有的时候为了保证数据的安全性,我们需要让request必须通过https提交。这时候我们就需要在tomcat的conf/web.xml进行设置了。
3.1 设置全局https
在web.xml的最后,</welcome-file-list>之后,</web-app>之前,加上以下内容:
<security-constraint>
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
3.1 设置局部https
当我们仅需要对某一个url请求或某几个url请求强制https时,只需要更改以上的<url-pattern>/*</url-pattetn>即可。如下是控制https://ip/app/fts/login请求:
<security-constraint>
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/fts/login</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
多个url,加多个<url-pattern>即可。