HTTPS 原理及配置
一、HTTPS 身份验证介绍
1. HTTPS 原理
HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),简单来讲就是加了安全验证的 HTTP,即HTTP + SSL
;我们知道 HTTP 通讯时,如果客户端C 请求服务器S,那么可以通过网络抓包的形式来获取信息,甚至可以模拟服务器 S 端,来骗取与 C 端的通讯信息;这对互联网应用在安全领域的推广非常不利;HTTPS解决了这个问题。
HTTPS 与 HTTP 的区别
1)HTTPS 的服务器需要到 CA 申请证书,以证明自己服务器的用途;
2)HTTP 信息是明文传输,HTTPS 信息是密文传输;
3)HTTP 与 HTTPS 的默认端口不同,前者是 80 端口,后者是 443 端口;
可以说 HTTP 与 HTTPS 是完全不同的连接方式,HTTPS 集合了加密传输,身份认证,更加的安全。
2. HTTPS 身份验证流程
client 向 server 发送实际的业务 HTTPS 请求之前,会先与 server 进行几次握手,互相证明身份:
握手的流程图:
一种解释:
1)客户端请求服务器,发送握手消息
2)服务器返回客户端自己的加密算法、数字证书和公钥;
3)客户端验证服务器端发送来的数字证书是否与本地受信任的证书相关信息一致;如果不一致则客户端浏览器提示证书不安全。如果验证通过,则浏览器会采用自身的随机数算法产生一个随机数,并用服务器发送来的公钥加密;发送给服务器;这里如果有人通过攻击获取了这个消息,那也没用,因为他没有解密此段消息所需要私钥;验证通过的网站在浏览器地址栏的右边会有一安全锁的标识;
3)服务器解密得到此随机数,并用此随机数作为密钥采用对称加密算法加密一段握手消息发送给浏览器;
4)浏览器收到消息后解密成功,则握手结束,后续的信息都通过此随机密钥加密传输。
以上是服务端认证的情况,如果服务端对访问的客户端也有认证需求,则客户端也需要将自己的证书发送给服务器,服务器认证不通过,通讯结束;原理同上;
另外,一般在传输过程中为了防止消息窜改,还会采用消息摘要后再加密的方式,以此保证消息传递的正确性。
另一种解释说明:
客户端发起一个 https 的请求,把自身支持的一系列 Cipher Suite(密钥算法套件,简称Cipher)发送给服务端。
服务端,接收到客户端所有的 Cipher 后与自身支持的对比,如果不支持则连接断开,反之则会从中选出一种加密算法和HASH算法,以证书的形式返回给客户端 证书中还包含了:公钥、颁证机构、网址、失效日期等等。
客户端收到服务端响应后会做以下几件事:
3.1 验证证书的合法性
颁发证书的机构是否合法与是否过期,证书中包含的网站地址是否与正在访问的地址一致等
证书验证通过后,在浏览器的地址栏会加上一把小锁(每家浏览器验证通过后的提示不一样 不做讨论)
3.2 生成随机密码
如果证书验证通过,或者用户接受了不授信的证书,此时浏览器会生成一串随机数,然后用证书中的公钥加密。
3.3 HASH握手信息
用一开始约定好的 HASH 方式,把握手消息取 HASH 值, 然后用随机数加密 “握手消息 + 握手消息 HASH 值(签名)”
并一起发送给服务端。
在这里之所以要取握手消息的 HASH 值,主要是把握手消息做一个签名,用于验证握手消息在传输过程中没有被篡改过。
- 服务端拿到客户端传来的密文,用自己的私钥来解密握手消息取出随机数密码,再用随机数密码 解密 握手消息与HASH值,并与传过来的HASH值做对比确认是否一致。
然后用随机密码加密一段握手消息(握手消息+握手消息的HASH值 )给客户端
- 客户端用随机数解密并计算握手消息的 HASH,如果与服务端发来的 HASH 一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密,因为这串密钥只有客户端和服务端知道,所以即使中间请求被拦截也是没法解密数据的,以此保证了通信的安全。
- 非对称加密算法:RSA,DSA/DSS 在客户端与服务端相互验证的过程中用的是对称加密
- 对称加密算法:AES,RC4,3DES 客户端与服务端相互验证通过后,以随机数作为密钥时,就是对称加密
- HASH算法:MD5,SHA1,SHA256 在确认握手消息没有被篡改时
二、windows 环境下配置 tomcat HTTPS
要么找 CA 授信机构颁发证书,要么自己给自己颁证书(不受信任的HTTPS)
下面我们在 windows 上配置 tomcat 的HTTPS 访问
1. 生成密钥库 keystore
首先使用 JDK 的 keytool
命令,生成 keystore,在 cmd 命令行模式下执行:
keytool -genkey -alias uzipi.com -keyalg RSA -keystore 1024 -validity 365 -keystore d:/server.keystore -keypass Cs123456 -storepass Cs123456
-genkey 表示要生成密钥
-keyalg 指定密钥算法,这里指定为 RSA 算法。
-keysize 指定密钥长度,默认 1024 bit,这里指定为 2048 bit。
-sigalg 指定数字签名算法,这里指定为 SHA1withRSA 算法。
-validity 指定证书有效期,这里指定为 365 天。
-alias 指定生成的密钥库的别名,这里是 uzipi.com
-keystore 指定密钥库存储位置,这里设定的是 d:/server.keystore
-keypass 密钥口令
-storepass 密钥库口令
2. 配置 Tomcat
2.1 将 server.keystore 文件移动到 Tomcat 根目录下
为什么要移动到 Tomcat 根目录下呢?因为 Tomcat 启动时优先扫描当前根目录。
2.2 配置 server.xml 文件
进入 ${TOMCAT_BASE}/conf
,编辑 server.xml
文件,按照 Tomcat 官网的提示,我们可以找到 port="8443"
的 <Connector>
标签注释,解开注释修改内容, 也可以直接复制如下内容(自己改密码),加入到 server.xml
文件:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="server.keystore" keystorePass="Cs123456"
clientAuth="false" sslProtocol="TLS" />
keystoreFile
属性值,填写我们刚刚创建的server.keystore
的文件(如果放在了其他目录下,需要指定路径)keystorePass
属性值,填写之前创建的密钥库密码
2.3 配置项目的 web.xml
配置 webapps 目录中的项目,找到 WEB-INF/web.xml
文件,添加如下内容:
<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. 启动 Tomcat,使用 Https + 8443 端口方式访问项目
用 https + 8443 端口方式访问项目,会发现与之前普通 http + 8080 端口方式访问的区别:浏览器地址栏前面多了不安全的警告。因为是我们自己颁发的证书,所以是不被其他机构信任的。
三、linux 环境下配置 tomcat HTTPS
linux 上的配置与 windows 环境的配置是相同的。
1. 生成密钥库 keystore
(1)cd 转向到 tomcat 主目录,执行命令生成 keystore
文件
keytool -genkey -alias uzipi.com -keyalg RSA -keypass Cs123456 -storepass Cs123456 -keystore server.keystore -validity 3600
执行命令之后,将会在tomcat主目录下生成 server.keystore
文件;
(2)根据 keystore
文件产生的证书请求,向 CA 申请服务器数字证书:
keytool -export -trustcacerts -alias uzipi.com -file server.cer -keystore server.keystore -storepass Cs123456
执行命令之后,将会在tomcat主目录下生成 server.cer
文件;
(3)将信息中心签发的服务器证书 server.cer
导入到 server.keystore
文件:
keytool -import -trustcacerts -alias uzipi.com -file server.cer -keystore server.keystore -storepass Cs123456
2. 生成客户端证书
(1)为了确保客户端证书能够顺利导入到 IE 和 Firefox 浏览器,须将证书格式为 PKCS12
,命令如下:
keytool -genkey -v -alias clientAlias -keyalg RSA -storetype PKCS12 -validity 3600 -keystore client.p12 -storepass clientStorePass -keypass clientKeyPass
执行命令之后,将会在tomcat主目录下生成 client.p12
文件;
3. 让服务器信任客户端证书
双向 SSL 认证,服务器须要信任客户端证书,因此要把客户端证书添加为服务器的信任认证。
由于不能直接将 PKCS12
格式的证书导入,要先把客户端证书导出为一个单独的 CER
文件,命令如下:
keytool -export -alias clientAlias -keystore client.p12 -storetype PKCS12 -storepass clientStorePass -rfc -file client.cer
执行命令之后,将会在tomcat主目录下生成 client.cer
文件;
然后将 client.cer
导入到服务器的证书库 server.keystore
,添加为一个信任证书:
keytool -import -v -file client.cer -keystore server.keystore -storepass Cs123456
执行后,认证就已添加至 keystore
中了。
4. keytool 的其他命令选项
(1)通过list命令查看服务器的证书库,可以看到两个输入,一个是服务器证书,一个是受信任的客户端证书:
keytool -list -keystore server.keystore -storepass Cs123456
(2)删除证书命令
keytool -delete -alias myKey -keystore server.keystore -storepass Cs123456
5. 修改 tomcat 配置
修改 conf/server.xml
文件,配置 <Connector> port="8443"
:
<!-- Define a SSL HTTP/1.1 Connector on port 8443 This connector uses the JSSE configuration, when using APR, the connector should be using the OpenSSL style configuration described in the APR documentation -->
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="server.keystore" keystorePass="Cs123456"
truststoreFile="server.keystore" truststorePass="Cs123456" />
clientAuth="true"
,双向认证;clientAuth="false"
,单向认证;
6. 重启 tomcat,访问应用
执行 ./bin/startup.sh
命令,访问 https://127.0.0.1:8443
(你自己的地址) 。
单向认证相关的配置到此结束。如果还需要配置双向认证,继续往下看。
将 server.xml
文件中的 clientAuth="true"
,设置为双向认证,打开 Firefox 菜单:编辑->首选项->高级->加密->查看证书->你的证书
,将 client.p12
导入到 IE 中,按照 Firefox 提示完成登录 tomcat 首页;
7. 双向认证,让服务器 SSL 证书获取代码
if(request.isSecure()) { //如果是SSL通信
Java.security.cert.X509Certificate[] certs =
(java.security.cert.X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");
if(certs!=null && certs.lengtt>0) {
subjectDN="Certificates found";
}
}
使用java解析证书可获取证书中用户信息:
issue=certs.getIssuerDN().toString(); //证书签发者
subject=certs.getSubjectDN().getName(); //证书所有者
after=certs.getNotAfter().toString(); //证书起效时间
before=certs.getNotBefore().toString(); //证书到期时间
version=Integer.toString(certs.getVersion()); //证书版本
serialno=certs.getSerialNumber().toString(); //证书序列号
参考文章:
http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html tomcat7.0 ssl配置
http://wenku.baidu.com/view/e7b22df0f90f76c661371a6f.html Tomcat SSL 配置
HTTPS 原理及配置的更多相关文章
- HTTPS 原理浅析及其在 Android 中的使用
作者:曹丰斌 本文首先分析HTTP协议在安全性上的不足,进而阐述HTTPS实现安全通信的关键技术点和原理.然后通过抓包分析HTTPS协议的握手以及通信过程.最后总结一下自己在开发过程中遇到的HTT ...
- HAProxy原理和配置
HAProxy原理和配置 目录 1.HAProxy简介 2.haproxy安装和配置说明 proxies配置参数 bind配置 Balance配置 基于cookie的会话绑定 统计接口启用相关的参数 ...
- Tengine HTTPS原理解析、实践与调试【转】
本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验.内容主要有四个方面:HTTPS趋势.HTTPS基础.HTTPS实践.HTTPS调试. 一.HTTPS趋势 这一 ...
- 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中
[大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...
- HTTPS原理解析-转
这篇文章关于Https的讲解真的是太透彻了,转过来备忘. 来源:腾讯bugly 另附两个SSL/TLS的交互详解:一.二 基于此文章的学习总结:下一篇文章 1.HTTPS 基础 HTTPS(Secur ...
- https原理解读
参考:架构师必读!以图文的方式解锁 HTTPS原理,10分钟还原HTTPS真像! 对于消息安全的定义是:即使消息被中间人拦截到,中间人也没办法解读出其中的消息. 对称加密 要实现消息安全,首先想到的是 ...
- [转帖]keepalived工作原理和配置、使用
keepalived工作原理和配置.使用 https://www.iteye.com/blog/aoyouzi-2288124 keepalived是什么 keepalived是集群管理中保证集群高可 ...
- 网络知识杂谈 - https - 原理简述
概述 简单描述 https 尽量介绍它的原理 实际的机制, 可能会更加复杂一些... 背景 这玩意, 困扰我好多年了 今天开始, 想做个了断 之前工作也接触过, 但从我的角度来说, 认识很浅 会配置 ...
- Nginx基本功能及其原理,配置原理
Nginx基本功能及其原理,配置原理 一.正向代理.反向代理 二.Nginx配置文件的整体结构 三.Nginx配置SSL及HTTP跳转到HTTPS 四.nginx 配置管理 [nginx.conf 基 ...
随机推荐
- Windbg Watch(监视)窗口的使用
在WinDbg中,可以使用“监视”窗口显示和更改全局和局部变量和寄存器信息. 您可以自定义此窗口以显示您正在跟踪的项..“监视”窗口可以显示所需的任何变量列表.这些变量可以包括来自任何函数的全局变量和 ...
- CPU 的由来
由 c# 的CEF 框架提供的 js 扩展,WebBrowser. JavascriptObjectRepository. 问:为什么要提供这一种方式. 提供了一种 能让js 与后端代码通讯的 方式. ...
- luoguP2173 [ZJOI2012]网络 LCT
链接 luogu 思路 颜色很少,开10个lct分别维护 if (Hash.count(make_pair(u, v)) && Hash[make_pair(u, v)] == col ...
- R语言排序 -- sort() order() rank()
order() 的返回值是对应“排名”元素所在向量中的位置.注意返回的不是元素本身,而是元素的位置. sort() 是直接对向量中的元素进行排序,返回的是排序后的元素组成的向量. rank() 是求秩 ...
- salt修改主机名
#!/bin/bash if [ $# != 2 ];then echo "bash $0 old_hostname new_hostname" exit 0 fi old_hos ...
- 【Gamma阶段】第六次Scrum Meeting
冰多多团队-Gamma阶段第六次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 卓培锦 编辑器风格切换(添加夜间模式) UI界面手势切换 牛雅哲 语音输入shell应用:基于pytorch ...
- dial tcp 10.96.0.1:443: getsockopt: no route to host --- kubernetes(k8s)DNS 服务反复重启
kubernetes(k8s)DNS 服务反复重启解决: k8s.io/dns/pkg/dns/dns.go:150: Failed to list *v1.Service: Get https:// ...
- 【计算机视觉】stitching_detail算法介绍
已经不负责图像拼接相关工作,有技术问题请自己解决,谢谢. 一.stitching_detail程序运行流程 1.命令行调用程序,输入源图像以及程序的参数 2.特征点检测,判断是使用surf还是orb, ...
- SVN版本管理系统使用教程
1.下载SVN安装包 https://tortoisesvn.net/downloads.html 2.下载SVN汉化包 网页下翻到下载处 3.下载服务端 https://www.visualsvn. ...
- Arcmap图层浏览遇到ORA-07445 [QCDLAUCN] 错误
Oracle 12.1.0.2版本,在图层浏览时遇到了ORA-07445 [QCDLAUCN] 错误.根据MOS的查询结果,得知这是一个bug (Doc ID 1932725.1): 文章中同时给出了 ...