tomcat 容器下web项目由http改为https操作步骤及相关的坑

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

二、https与http区别:

    1、https协议需要到ca申请证书,一般免费证书很少,需要交费。

  2、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

  3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。       

  4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

三、SSL协议:

  SSL安全套接层协议(Secure Socket Layer)

  为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。目前一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境。只要3.0版本以上之IE.或Netscape浏览器即可支持SSL。

  当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。

SSL协议位于TCP/IP协议与各种应用层协议之间,是一种国际标准的加密及身份认证通信协议,为TCP提供一个可靠的端到端的安全服务,为两个通讯个体之间提供保密性和完整性(身份鉴别)。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

四、TOMCAT 配置https:
  1、生成服务器端证书文件(仅用于开发和测试,如用于对外服务的商业网站会提示不安全之类的问题)

  可以使用Windows系统或者Linux系统(以Windows系统为例,Linux系统雷同,只是命令行输入信息时可能是英文)
  (1)    Windows环境生成证书
    步骤:
  • 进入%JAVA_HOME%/bin目录
  • 执行命令
    keytool -genkey -alias tomcat -keyalg RSA -keystore F: omcat.keystore -validity 365
  • 参数简要说明:“F: omcat.keystore”含义是将证书文件保存在F盘,证书文件名称是tomcat.keystore ;“-validity 36500含义是证书有效期,单位是天,默认值90
  • 在命令行填写必要的参数(jdk版本不同可能稍有不同):
    A、输入密匙库口令:此处需要输入大于6个字符的字符串
    B、“您的名字与姓氏是什么?”这是必填项,并且必须是TOMCAT部署主机的域名或者IP[如:gbcom.com 或者 10.1.25.251],就是你将来要在浏览器中输入的访问地址
    C、 “你的组织单位名称是什么?”、“您的组织名称是什么?”、“您所在城市或区域名称是什么?”、“您所在的州或者省份名称是什么?”、“该单位的两字母国 家代码是什么?”可以按照需要填写也可以不填写直接回车,在系统询问“正确吗?”时,对照输入信息,如果符合要求则使用键盘输入字母“y”,否则输入“n”重新填写上面的信息
    D、输入<tomcat>的主密码,这项较为重要,会在tomcat配置文件中使用,建议输入与keystore的密码一致,设置其它密码也可以
      完成上述输入后,直接回车则在你在配置的位置找到生成的文件
 (2)、商业网站的证书申请:参考https://blog.csdn.net/qq_19558705/article/details/60756689
2、配置TOMCAT服务器
(1)    如果你是在Windows环境中生成证书文件,则需要将生成的证书tomcat.keystore拷贝到Tomcat将要引用的位置,假设tomcat的应用证书的路径是“/etc/tomcat.keystore”,则需要将证书文件拷贝到“etc/”下;如果是在Linux环境按照上述介绍的步骤生成证书文件的话,此时证书文件已经在“etc/”下。
(2)    配置Tomcat,打开$CATALINA_HOME/conf/server.xml,修改如下,
    这是原来的配置,http访问端口
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    去掉原本注释掉的https配置的注释并修改为以下配置
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" keystoreFile="/etc/tomcat.keystore" keystorePass="www.test.cn"/>

    

<Connector port="8009" enableLookups="false" protocol="AJP/1.3" redirectPort="8443" />

    主要修改:1、去掉注释;2、增加keystoreFile和keystorePass两个参数,分别表示证书文件的路径和密码(之前申请证书时输入的tomcat密码)

    注意事项:1、8443端口同时是上面http配置的8080端口的redirectPort,表示http请求会跳转到8443的https

         2、8080、8009两个端口配置根据实际需求修改

         3、网上有些文章提到https默认是443,tomcat是8443,这个具体有什么影响和特别需要注意的地方我尚未知,后续碰到再说

 

2.修改项目的web.xml文件,并强制https访问
  在web应用的web.xml文件中修改并加上下面配置:

<!--强制使用https,http请求会自动转为https-->
<login-config>
    <auth-method>CLIENT-CERT</auth-method>
    <realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<!--配置网站支持https,/* 表示全部请求都走https, transport-guarantee 标签设置为 CONFIDENTIAL 以便使应用支持 SSL。
如果需要关闭 SSL ,将 CONFIDENTIAL 改为 NONE 即可-->
<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>

  修改tomcatconfweb.xml文件也可,对该tomcat下所有程序生效

3、上述配置完成后,重启TOMCAT后即可以使用SSL。IE地址栏中可以直接输入地址不必输入http://” 或者 https://” ;也可以输入 “http:// ” 会跳转成为 “https://” 来登录
4、注意事项与坑:
(1) 、生成证书的时间,如果IE客户端所在机器的时间早于证书生效时间,或者晚于有效时间,IE会提示“该安全证书已到期或还未生效”

(2) 、如果IE提示“安全证书上的名称无效或者与站点名称不匹配”,则是由生成证书时填写的服务器所在主机的域名“您的名字与姓氏是什么?”/“What is your first and last name?”不正确引起的

 (3)、在一次改为https的改动实验后,改回http,将之前所有的改动都还原了,但是程序就是异常,能正常打开登录页面但是登录报错(由于程序逻辑的原因,没有任何有效的日志可以查看到该问题的原因),折腾了2个小时,后来清空了浏览器缓存重新登录就正常了,推测是缓存记录的是https的session,使用http访问后无法获取到session的有效信息。其实只需要另外一台电脑或者浏览器访问一下可能早就发现该原因了,坑爹。

 (4)、如果需要在原端口上提供https服务,直接将8443端口改为原端口如8080,但是同一个端口无法同时提供http和https两种服务。且这样修改后,强制http跳转到https的配置也失效了,只能通过其他办法跳转,如使用Nginx等转发(尚未实验)

转载并修改至:http://blog.sina.com.cn/s/blog_618592ea01012q40.html

谢谢。

原文地址:https://www.cnblogs.com/parker-yu/p/10690837.html