HTTPS单向认证和双向认证
  • 发布时间: 2015/07/30 15:27
  • 阅读: 4177
  • 收藏: 178
  • 点赞: 6
  • 评论: 3

一、背景&概念

HTTPS:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议。 http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层。从发送端看,这一层负责把http的内容加密后送到下层 的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成http的内容。

SSL(Secure Socket Layer):是Netscape公司设计的主要用于WEB的安全传输协议。从名字就可以看出它在https协议栈中负责实现上面提到的加密层。因此,一个https协议栈大致是这样的:

数字证书:一种文件的名称,好比一个机构或人的签名,能够证明这个机构或人的真实性。其中包含的信息,用于实现上述功能。

加密和认证:加密是指通信双方为了防止铭感信息在信道上被第三方窃听而泄漏,将明文通过加密变成密文,如果第三方无法解密的话,就算他获得密文也无能为力;认证是指通信双方为了确认对方是值得信任的消息发送或接受方,而不是使用假身份的非法者,采取的确认身份的方式。只有同时进行了加密和认证才能保证通信的安全,因此在SSL通信协议中这两者都被应。早期一般是用对称加密算法,现在一般都是不对称加密,最常见的算法就是RSA。

消息摘要:这个技术主要是为了避免消息被篡改。消息摘要是把一段信息,通过某种算法,得出一串字符串。这个字符串就是消息的摘要。如果消息被篡改(发生了变化),那么摘要也一定会发生变化(如果2个不同的消息生成的摘要是一样的,那么这就叫发生了碰撞)。

消息摘要的算法主要有MD5和SHA,在证书领域,一般都是用SHA(安全哈希算法)。

数字证书、加密和认证、消息摘要三个技术结合起来,就是在HTTPS中广泛应用的证书(certificate),证书本身携带了加密/解密的信息,并且可以标识自己的身份,也自带消息摘要。

HTTPS认证过程:

① 浏览器发送一个连接请求给安全服务器。

② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器。

③ 客户浏览器检查服务器送过来的证书是否是由自己信赖的 CA 中心所签发的。如果是,就继续执行协议;如果不是,客户浏览器就给客户一个警告消息:警告客户这个证书不是可以信赖的,询问客户是否需要继续。

④ 接着客户浏览器比较证书里的消息,例如域名和公钥,与服务器刚刚发送的相关消息是否一致,如果是一致的,客户浏览器认可这个服务器的合法身份。

⑤ 服务器要求客户发送客户自己的证书。收到后,服务器验证客户的证书,如果没有通过验证,拒绝连接;如果通过验证,服务器获得用户的公钥。

⑥ 客户浏览器告诉服务器自己所能够支持的通讯对称密码方案。

⑦ 服务器从客户发送过来的密码方案中,选择一种加密程度最高的密码方案,用客户的公钥加过密后通知浏览器。

⑧ 浏览器针对这个密码方案,选择一个通话密钥,接着用服务器的公钥加过密后发送给服务器。

⑨ 服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥。

⑩ 服务器、浏览器接下来的通讯都是用对称密码方案,对称密钥是加过密的。

上面所述的是双向认证 SSL 协议的具体通讯过程,这种情况要求服务器和用户双方都有证书。单向认证 SSL 协议不需要客户拥有 CA 证书,具体的过程相对于上面的步骤,只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的 (这并不影响 SSL 过程的安全性)密码方案。这样,双方具体的通讯内容,就是加过密的数据,如果有第三方攻击,获得的只是加密的数据,第三方要获得有用的信息,就需要对加密 的数据进行解密,这时候的安全就依赖于密码方案的安全。而幸运的是,目前所用的密码方案,只要通讯密钥长度足够的长,就足够的安全。这也是我们强调要求使用128 位加密通讯的原因。

二、环境准备

Oracle Linux Server release 6.5、JDK1.7.0_45、openssl-1.0.2d

三、单向认证

3.1 为服务器生成证书

keytool -genkey -keyalg RSA -dname "cn=127.0.0.1,ou=inspur,o=none,l=shandong,st=jinan,c=cn" -alias server -keypass 111111 -keystore server.keystore -storepass 111111 -validity 3650

注:cn=127.0.0.1配置的是服务器IP

3.2 生成csr

生成csr文件用于提交CA认证生成证书使用。

keytool -certReq -alias server -keystore server.keystore -file ca.csr

3.3 生成cer

这个ca.cer是为了解决不信任时要导入的

keytool -export -alias server -keystore server.keystore -file ca.cer -storepass 111111

3.4 tomcat配置ssl

clientAuth="false"代表单向认证,配置如下:

<Connector SSLEnabled="true" clientAuth="false"

maxThreads="150" port="8443"

protocol="org.apache.coyote.http11.Http11Protocol"或者HTTP/1.1

scheme="https" secure="true" sslProtocol="TLS"

keystoreFile="D:/server.keystore" keystorePass="111111"/>

注: Http11Protocol支持HTTP/1.1协议,是http1.1协议的ProtocolHandler实现。

3.5 解决不信任

启动tomcat,输入 https://127.0.0.1:8443/

这时提示框显示:服务器的证书不受信任。在浏览器内显示以下提示:

此服务器无法证明它是127.0.0.1;您计算机的操作系统不信任其安全证书。出现此问题的原因可能是配置有误或您的连接被拦截了。

选择“继续前往(不安全)”,也能访问,但是此时就是以普通的HTTP方式进行信息传输了。

选择安装步骤3.3生成的ca.cer文件,将证书存储在“受信任的证书颁发机构”,就可以通过HTTPS正常访问了。

3.6 解决程序访问异常

这时候如果用程序去访问可能还会抛证书不信任的异常sun.security.validator.ValidatorException: PKIX path building failed...

需要将生成的证书(ca.cer ) 导入到jdk中

执行以下命令:

keytool -import -alias tomcatsso -file "ca.cer" -keystore "D:\java\jdk1.6.0_11\jre\lib\security\cacerts" -storepass changeit

其中changeit是jre默认的密码。

如果抛 No subject alternative names present,请在生成keystore 注意CN必须要为域名(或机器名称)例如localhost 不能为IP 。

如果抛 No name matching localhost found,表示你生成keystore CN的名称和你访问的名称不一致。

四、双向认证

4.1 目录建立

Linux环境下,在home下建立out32dll目录,在此目录下建立ca、client、server三个文件夹。以下命令均在out32dll目录下执行。

4.2 生成CA证书

  1. 创建私钥 :

openssl genrsa -out ca/ca-key.pem 1024

  1. 创建证书请求 :

openssl req -new -out ca/ca-req.csr -key ca/ca-key.pem

-----

Country Name (2 letter code) [AU]:cn 
State or Province Name (full name) [Some-State]:beijing
Locality Name (eg, city) []:fengtai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY 
Organizational Unit Name (eg, section) []:0953
Common Name (eg, YOUR name) []:CA
Email Address []:20095335@mail.besti.edu.cn

弹出密码输入选项,Enter默认即可

  1. 自签署证书 :

openssl x509 -req -in ca/ca-req.csr -out ca/ca-cert.pem -signkey ca/ca-key.pem -days 3650

  1. 将证书导出成浏览器支持的.p12格式 :

openssl pkcs12 -export -clcerts -in ca/ca-cert.pem -inkey ca/ca-key.pem -out ca/ca.p12

密码:111111

4.3 生成Server证书

一.   1.创建私钥 : 
openssl genrsa -out server/server-key.pem 1024 
2.创建证书请求 : 
openssl req -new -out server/server-req.csr -key server/server-key.pem 
----- 
Country Name (2 letter code) [AU]:cn 
State or Province Name (full name) [Some-State]:beijing 
Locality Name (eg, city) []:fengtai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY 
Organizational Unit Name (eg, section) []:0953
Common Name (eg, YOUR name) []:222.28.129.224   注意:一定要写服务器所在的ip地址 
Email Address []:20095335@mail.besti.edu.cn

弹出密码输入选项,Enter默认即可

3.自签署证书 : 
openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650 
4.将证书导出成浏览器支持的.p12格式 : 
openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12 
密码:111111

4.4 生成Clinet证书

  1. 创建私钥 :

openssl genrsa -out client/client-key.pem 1024

  1. 创建证书请求 :openssl req -new -out client/client-req.csr -key client/client-key.pem

-----

Country Name (2 letter code) [AU]:cn

State or Province Name (full name) [Some-State]:Beijing

Locality Name (eg, city) []:fengtai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY

Organizational Unit Name (eg, section) []:0953

Common Name (eg, YOUR name) []:Client

Email Address []:20095335@mail.besti.edu.cn

Please enter the following 'extra' attributes to be sent with your certificate request 
A challenge password []:123456 
An optional company name []:tsing 
3.自签署证书 :

openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650 
4.将证书导出成浏览器支持的.p12格式 : 
openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12 
密码:111111

4.5 根据CA证书生成jks文件

keytool -keystore truststore.jks -keypass 222222 -storepass 222222 -alias ca -import -trustcacerts -file /home/out32dll/ca/ca-cert.pem

4.6 tomcat配置ssl

tomcat6.0的配置:修改conf/server.xml。 将keystoreFile、truststoreFile的路径填写为正确的放置路径。如下图:

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

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

clientAuth="true" sslProtocol="TLS"

keystoreFile="server.p12" keystorePass="111111"  keystoreType="PKCS12"

truststoreFile="truststore.jks" truststorePass="222222" truststoreType="JKS"/>

4.7 导入证书

将ca.p12,client.p12分别导入到IE中去(打开IE->Internet选项->内容->证书)。 ca.p12导入至 受信任的根证书颁发机构,client.p12导入至个人。

五、浏览器验证

验证ssl配置是否正确访问你的应用https://服务器ip:8443/,如果配置正确的话,

单向认证方式会直接跳转到地址,并且https显示绿色。

双向认证方式会出现请求你数字证书的对话框,选择确定,再跳转到地址,并且https显示绿色。

六、帮助

6.1 Tomcat—server.xml—Connector属性

属性

说明

clientAuth

设置是否双向验证,默认为false,设置为true代表双向验证

keystoreFile

服务器证书文件路径

keystorePass

服务器证书密码

truststoreFile

用来验证客户端证书的根证书,此例中就是服务器证书

truststorePass

根证书密码

6.2 keytool

Keytool是一个Java数据证书的管理工具,Keytool将密钥和证书存在一个称为keystore的文件中。常用命令属性如下:

命令属性

说明

-genkey

在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书

-alias

别名,每个keystore都关联一个唯一的alias,通常不区分大小写

-keystore

指定密钥库的名称(产生的各类信息将不在.keystore文件中)

-keyalg

指定密钥的算法(如 RSA  DSA(如果不指定默认采用DSA)

-validity

指定创建的证书有效期多少天

-keysize

指定密钥长度

-storepass

指定密钥库的密码(获取keystore信息所需的密码)

-keypass

指定别名条目的密码(私钥的密码)

-dname

指定证书拥有者信息。例如:"CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=省份名称,C=单位的两字母国家代码"

-list

显示密钥库中的证书信息

-v

显示密钥库中的证书详细信息

-export

将别名指定的证书导出到文件,例:

keytool   -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码

-file

参数指定导出到文件的文件名

-delete

删除密钥库中某条目,例:

keytool -delete -alias 指定需删除的别名 -keystore 指定keystore  -storepass 密码

-printcert

查看导出的证书信息,例:keytool   -printcert -file yushan.crt

-keypasswd

修改密钥库中指定条目口令,例:

keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new  新密码  -storepass keystore密码  -keystore

-import

将已签名数字证书导入密钥库,例:

keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书

6.3 openssl

http://www.openssl.org/docs/apps/openssl.html

参考资料:

http://my.oschina.net/nearzk/blog/485652

http://seanlook.com/2015/05/28/nginx-ssl/

【HTTPS双向加密认证】的更多相关文章

  1. 搭建私有CA并基于OpenSSL实现双向身份认证

    0x00 前言 互联网上的Web应用由于用户数目广泛,都是采用单向身份认证的,只需要客户端验证服务端的身份.但如果是企业内部的应用对接,客户端数量有限,可能就会要求对客户端也做身份验证,这时就需要一个 ...

  2. iOS - HTTPS接口加密和身份认证

    为什么要使用HTTPS代替HTTP HTTPS和HTTP的区别 https协议需要到CA申请证书,一般免费证书很少,需要交费. http是超文本传输协议,信息是明文传输,https则是具有安全性的SS ...

  3. httpd设置HTTPS双向认证

    去年用tomcat.jboss配置过HTTPS双向认证,那时候主要用的是JDK自带的keytool工具.这次是用httpd + openssl,区别比较大 在网上搜索了很多文章,发现全面介绍的不多,或 ...

  4. Android Https双向认证 + GRPC

    keywords:android https 双向认证android GRPC https 双向认证 ManagedChannel channel = OkHttpChannelBuilder.for ...

  5. Tomcat服务器配置https双向认证(使用keytool生成证书)

    一,HTTPS原理   1,HTTP.HTTPS.SSL.TLS介绍与相互关系 (1)HTTP:平时浏览网页时候使用的一种协议.HTTP协议传输的数据都是未加密的(明文),因此使用HTTP协议传输隐私 ...

  6. 原 用Tomcat服务器配置https双向认证过程实战

    什么是https? 百度百科足够解释它:http://baike.baidu.com/view/14121.htm 工具:keytool (Windows下路径:%JAVA_HOME%/bin/key ...

  7. Keytool配置 Tomcat的HTTPS双向认证

    Keytool配置 Tomcat的HTTPS双向认证 证书生成 keytool 简介 Keytool是一个Java数据证书的管理工具, Keytool将密钥(key)和证书(certificates) ...

  8. HTTPS 双向认证构建移动设备安全体系

    HTTPS 双向认证构建移动设备安全体系 对于一些高安全性要求的企业内项目,我们有时希望能够对客户端进行验证.这个时候我们可以使用Https的双向认证机制来实现这个功能. 单向认证:保证server是 ...

  9. Tomcat 配置 HTTPS双向认证

    Tomcat 配置 HTTPS 双向认证指引说明: � 本文档仅提供 Linux 操作系统下的指引 � 在阅读本指引前请您在 Linux 部署 JDK 和 Tomcatserver为了 Tomcat ...

随机推荐

  1. python 使用装饰器并记录log

    1.首先定义一个log文件 # -*- coding: utf-8 -*- import os import time import logging import sys log_dir1=os.pa ...

  2. mapper配置文件中的动态SQL

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  3. hibernate基础学习

    转载自:http://blog.csdn.net/fb281906011/article/details/17628111 一:下载hibernate:http://hibernate.org/orm ...

  4. 解决:org.apache.tomcat.jni.Error: 70023: This function has not been implemented on this platform

    centos7.3 启动tomcat 出现错误: 八月 08, 2017 4:58:47 下午 org.apache.catalina.core.StandardEngine startInterna ...

  5. hammer.js触摸,手指缩放等许多手势操作

    使用方法: 插件描述:Hammer.js是一个开源的,轻量级的javascript库,它可以在不需要依赖其他东西的情况下识别触摸,鼠标事件. <script src="http://e ...

  6. Laravel5.5 生成测试数据

    1.在database/factories/UserFactory.php 中添加 2.在tinker中生成数据 3.数据生成成功

  7. 如何用sqlplus执行sql脚本,且让出错后及时退出sqlplus

    按sqlplus常规作法,是要登陆,输入用户名和密码才能操作的. 并且,如果不作特别设置,SQL脚本里的部门语句有问题后,它还是会坚持执行完成其余的SQL的. 为了安全和自动化,得改进一下了. sql ...

  8. HDU 2689.Sort it-冒泡排序

    Sort it Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  9. HDU 1066 Last non-zero Digit in N!(数论,大数,wait)

    The expression N!, read as "N factorial," denotes the product of the first N positive inte ...

  10. 递归输入与引用传值(UVa839 Not so Mobile)

    题目的大意是一个树形天平,输入给出样例的个数,然后空一行,每行4个数W1,D1,W2,D2,分别代表天平左侧的重量.力臂和天平右侧的重量.力臂.如果W1或者W2为0,则代表该节点有左子树或右子树,如果 ...