web项目开发——http到https

Posted 熊孩子码农之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web项目开发——http到https相关的知识,希望对你有一定的参考价值。

 一、背景

        我们在日常web开发中,时常使用的是http协议在开发。比如时常使用tomcat、iis等做为我们的应用服务器。它们默认都是http协议传输数据。

        https协议存在也好多年了,相对于http协议,https协议提供了相对更安全的数据传输方式。而且现在很多软件都是基于https制作的。如:CAS单点登录的实现,微信小程序的通讯等等。现在是时候改装你的项目为https了。

        今天我们来从应用角度谈谈https到底是什么,它是如何工作的。

    二、http与https区别

        HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。

        为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

    HTTPS和HTTP的区别主要为以下四点:

一、https协议需要到ca申请证书,一般免费证书很少,需要交费。(而且,提前提一下:证书是对应域名的,域名又对应IP。所以,如果想要你的项目在公网使用https协议运行,前置条件很多的哦)

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

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

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

    三、https原理

        简言说:https其实就是在http应用层与tcp的IP层之间加了一层加密/身份验证。    

        应用层协议http,我想大家都明白也知道。它是一种无状态协议。

        TCP/IP层,是网络数据传输中很重要的一层。它决定了数据的完整性。因为它经过了“三次握手”,是目前网络数据完整性的有效保证。(与其相应的协议是UDP协议,它是“尽最大努力的交付”的传输协议,本身不保证数据完整性,如:视频传输、音频传输等。想要深入学习的,推荐谢希仁教授《计算机网络》书(我的网络基础启蒙书籍呀))

        加密/身份验证,这一块其实也挺杂。首先我们先需要对加密算法有个简单了解,加密分对称加密与非对称加密。导致加密/身份验证也有区别。这里我讲两种:一种是只加密数据,不做身份验证。另一种是既加密数据又加密身份。(加密算法,现在真的很多,分类也很多,希望有时间给大家整理一下)

    四、http升级为https实例

        1)背景

                我在这里选择jdk自带工具keytool生成https安全证书,应用服务器选择tomcat。

         2)软件工具

                jdk1.8.0_65          apache-tomcat-7.0.53

         3)单向https配置

            ① 生成证书

                cmd命令行运行如下命令:

                keytool -genkey -v -alias HttpsDemoD -keyalg RSA -validity 3650 -keystore E:\https_example\dan\HttpsDemoD.keystore

                参数说明:genkey生成方式,对称或者非对称。alias定义别名(HttpsDemoD) keyalg指定加密算法 RSA(非对称加密算法)。FE:\https_example\dan\HttpsDemoD.keystore指定生成服务器证书库路径。validity证书有效期,天为单位,365为一年。(注:运行过程中需要定义密码,验证密码等操作,自己记住即可)

          ② 配置tomcat

                打开tomcat配置文件server.xml(/conf/server.xml)文件,添加如下配置:    

        

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"

               maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"   keystoreFile="E:\https_example\dan\HttpsDemoD.keystore"     keystorePass="123456"/>

    说明:这一步就是导入证书到应用服务器。密码、证书路径与上面生成的时候一致,可以看到tomcat默认https服务端口为8443.

            ③ 项目配置

           配置运行在应用服务器上的项目,进行http到https的重定向(http仍然可以访问,因为作如下配置tomcat会对请求进行重定向)

    <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>

          4)双向https配置

            ①生成证书

            生成服务端证书

                keytool -genkey -v -alias HttpsDemoS -keyalg RSA -keystore E:\https_example\shuang\HttpsDemoS.keystore -validity 36500

            生成客户端证书

                keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore E:\https_example\shuang\HttpsDemoS.key.p12

        说明:生成证书的操作类似上面单向证书生成,这里不再多说了。注意密码一定的保存好。

            ②证书相互认证

         服务端信任客户端证书

                1.由于不能直接将PKCS12格式的证书库导入,所以必须先把客户端证书导出为一个单独的CER文件。命令如下:

                keytool -export -alias mykey -keystore E:\https_example\shuang\HttpsDemoS.key.p12 -storetype PKCS12 -storepass 123456 -rfc -file E:\https_example\shuang\HttpsDemoS.key.cer

                注:alias的别名mykey必须与客户端证书别名一致。storepass为上述设置的密码

                2.服务器信任客户端证书

            keytool -import -v -file E:\https_example\shuang\HttpsDemoS.key.cer -keystore E:\https_example\shuang\HttpsDemoS.keystore

       客户端信任服务端证书

            keytool -keystore E:\https_example\shuang\HttpsDemoS.keystore -export -alias HttpsDemoS -file E:\https_example\shuang\HttpsDemoS.cer

            ③ 配置tomcat       

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  

           maxThreads="150" scheme="https" secure="true"  

           clientAuth="false" sslProtocol="TLS"  

           keystoreFile="E:\https_example\shuang\HttpsDemoS.keystore" keystorePass="123456"  

           truststoreFile="E:\https_example\shuang\HttpsDemoS.keystore" truststorePass="123456" />

            ④ 配置项目web.xml

    <auth-method>CLIENT-CERT</auth-method> 

    <realm-name>Client Cert Users-only Area</realm-name> 

    <security-constraint> 

    Authorization setting for SSL 

    <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>

            说明:双向证书与单向证书配置主要区别就是客户端与服务端的认证,所以这里不再一一说明。但是需要说明的是,客户端是需要在客户端安装的,由于这里模拟的客户端与服务端在一起机器,所以直接安装即可。实际上是需要在客户端电脑安装的。

            另外:项目在https协议下访问时,浏览器会警报不安全。这并非是不安全,只是我们的证书是自己制作的,并且没有得到证书认证机构认证,所以浏览器会报警告。解决办法:1就是设置浏览器使其信任,2就是上传证书到证书认证机构。


        今天关于https的使用就讲到这里了。谢谢大家的支持,更新晚了,非常抱歉。


        还是那句话:点赞,转发,关注,留言就是对小编最好的支持。再次谢谢大家。

    



            

以上是关于web项目开发——http到https的主要内容,如果未能解决你的问题,请参考以下文章

前端基础篇之HTTP协议

如何为 https Web 服务器创建 .pem 文件

nginx websocket 代理

web项目开发——http到https

《网络攻防》第五周学习总结

使用 Fargate + ACM + ALB 构建安全的 HTTPs Web 服务器