HTTPS 原理及配置

[TOC]

一、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 进行几次握手,互相证明身份:

握手的流程图:

HTTPS 身份验证握手流程图

一种解释:

1)客户端请求服务器,发送握手消息

2)服务器返回客户端自己的加密算法、数字证书和公钥;

3)客户端验证服务器端发送来的数字证书是否与本地受信任的证书相关信息一致;如果不一致则客户端浏览器提示证书不安全。如果验证通过,则浏览器会采用自身的随机数算法产生一个随机数,并用服务器发送来的公钥加密;发送给服务器;这里如果有人通过攻击获取了这个消息,那也没用,因为他没有解密此段消息所需要私钥;验证通过的网站在浏览器地址栏的右边会有一安全锁的标识;

3)服务器解密得到此随机数,并用此随机数作为密钥采用对称加密算法加密一段握手消息发送给浏览器;

4)浏览器收到消息后解密成功,则握手结束,后续的信息都通过此随机密钥加密传输。

以上是服务端认证的情况,如果服务端对访问的客户端也有认证需求,则客户端也需要将自己的证书发送给服务器,服务器认证不通过,通讯结束;原理同上;

另外,一般在传输过程中为了防止消息窜改,还会采用消息摘要后再加密的方式,以此保证消息传递的正确性。

另一种解释说明:

  1. 客户端发起一个 https 的请求,把自身支持的一系列 Cipher Suite(密钥算法套件,简称Cipher)发送给服务端。

  2. 服务端,接收到客户端所有的 Cipher 后与自身支持的对比,如果不支持则连接断开,反之则会从中选出一种加密算法和HASH算法,以证书的形式返回给客户端 证书中还包含了:公钥、颁证机构、网址、失效日期等等。

  3. 客户端收到服务端响应后会做以下几件事:

    3.1 验证证书的合法性

颁发证书的机构是否合法与是否过期,证书中包含的网站地址是否与正在访问的地址一致等

​ 证书验证通过后,在浏览器的地址栏会加上一把小锁(每家浏览器验证通过后的提示不一样 不做讨论)

3.2 生成随机密码

​ 如果证书验证通过,或者用户接受了不授信的证书,此时浏览器会生成一串随机数,然后用证书中的公钥加密。

3.3 HASH握手信息

​ 用一开始约定好的 HASH 方式,把握手消息取 HASH 值, 然后用随机数加密 “握手消息 + 握手消息 HASH 值(签名)” 并一起发送给服务端。

​ 在这里之所以要取握手消息的 HASH 值,主要是把握手消息做一个签名,用于验证握手消息在传输过程中没有被篡改过。

  1. 服务端拿到客户端传来的密文,用自己的私钥来解密握手消息取出随机数密码,再用随机数密码 解密 握手消息与HASH值,并与传过来的HASH值做对比确认是否一致。

​ 然后用随机密码加密一段握手消息(握手消息+握手消息的HASH值 )给客户端

  1. 客户端用随机数解密并计算握手消息的 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 配置

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容