设为首页 收藏本站
查看: 934|回复: 0

[经验分享] 带你使用Nginx实现HTTPS双向验证

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-5-26 10:46:58 | 显示全部楼层 |阅读模式
https单向验证应用广泛想必大家都很熟悉,我已经在一篇博文中分享过,这次来看看Nginx如何实现双向验证。


单向验证与双向验证的区别:

单向验证: 指客户端验证服务器端证书,服务器并不需要验证客户端证书。

双向验证:指客户端验证服务器端证书,而服务器也需要通过CA的公钥证书来验证客户端证书。

详细的握手过程:

单向验证

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

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

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

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

4、浏览器随机产生一个用于后面通讯的“通话密钥”,然后用服务器的公钥对其加密,然后将加密后的“预主密码”传给服务器。

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

6、浏览器针对这个密码方案,接着用服务器的公钥加过密后发送给服务器。

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

8、服务器、浏览器接下来的通讯都是用对称密码方案,使用相同的对称密钥。

双向验证

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

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

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

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

5、服务器要求客户的身份认证,用户可以建立一个随机数然后对其进行数字签名,将这个含有签名的随机数和客户自己的证书以及加密过的“预主密码”一起传给服务器。

6、服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的CA 是否可靠,发行CA 的公钥能否正确解开客户证书的发行CA的数字签名,检查客户的证书是否在证书废止列表(CRL)中。检验如果没有通过,通讯立刻中断;如果验证通过,服务器将用自己的私钥解开加密的“预主密码”,然后执行一系列步骤来产生主通讯密码(客户端也将通过同样的方法产生相同的主通讯密码)。

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

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

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

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

11、服务器、浏览器接下来的通讯都是用对称密码方案,使用相同的对称密钥。

一、自建CA,签署证书

1
2
3
4
5
6
7
8
9
10
11
# openssl 配置文件路径
vim /etc/pki/tls/openssl.cnf

# 下面只列出配置文件中和自建CA有关的几个关键指令

dir             = /etc/pki/CA # CA的工作目录
database        = $dir/index.txt # 签署证书的数据记录文件
new_certs_dir   = $dir/newcerts # 存放新签署证书的目录
serial          = $dir/serial # 新证书签署号记录文件
certificate     = $dir/ca.crt # CA的证书路径
private_key     = $dir/private/cakey.pem # CA的私钥路径



使用openssl制作CA的自签名证书
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 切换到CA的工作目录
cd /etc/pki/CA

# 制作CA私钥
(umask 077; openssl genrsa -out private/cakey.pem 2048)

# 制作自签名证书
openssl req -new -x509 -key private/cakey.pem  -out ca.crt

# 生成数据记录文件,生成签署号记录文件,给文件一个初始号。
touch index.txt
touch serial
echo '01'> serial

# 自建CA完成



准备服务器端证书
1
2
3
4
5
6
7
8
# 制作服务器端私钥
(umask 077; openssl genrsa -out server.key 1024)

# 制作服务器端证书申请指定使用sha512算法签名 (默认使用sha1算法)
openssl req -new -key server.key -sha512 -out server.csr

# 签署证书
openssl ca -in server.csr -out server.crt -days 3650



准备客户端证书
1
2
3
4
5
6
7
8
# 制作客户端私钥
(umask 077; openssl genrsa -out kehuduan.key 1024)

# 制作客户端证书申请
openssl req -new -key kehuduan.key -out kehuduan.csr

# 签署证书
openssl ca -in kehuduan.csr -out kehuduan.crt -days 3650



注意事项:

1、制作证书时会提示输入密码,设置密码可选,服务器证书和客户端证书密码可以不相同。

2、服务器证书和客户端证书制作时提示输入省份、城市、域名信息等,需保持一致。

3、以下信息根证书需要和客户端证书匹配,否则可能出现签署问题。

             countryName = match
             stateOrProvinceName = match
             organizationName = match
             organizationalUnitName = match

如何指定签署证书的签名算法

1
2
3
openssl req xx

-[digest]      Digest to sign with (see openssl dgst -h for list)



查看使用的签名算法:

wKiom1dEXMygjao6AABWovfkDhQ536.jpg
1
2
# 使用-sha256指定算法
openssl req -new -key server.key -sha256 -out server.csr



二、提供Nginx配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
server {
        listen       443;
        server_name  pro.server.com;
        ssi on;
        ssi_silent_errors on;
        ssi_types text/shtml;

        ssl                  on;
        ssl_certificate      /data/server/nginx/ssl/self/server.crt;
        ssl_certificate_key  /data/server/nginx/ssl/self/server.key;
        ssl_client_certificate /data/server/nginx/ssl/self/ca/ca.crt;

        ssl_verify_client on;
        ssl_protocols    TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:!ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:!RC4-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH;
        ssl_prefer_server_ciphers On;

        index index.html index.htm index.php;
        root /data/www;
        location ~ .*\.(php|php5)?$
        {
                #fastcgi_pass  unix:/tmp/php-cgi.sock;
                fastcgi_pass  127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi.conf;
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
                expires 30d;
        }
        location ~ .*\.(js|css)?$
        {
                expires 1h;
        }
###this is to use open website lianjie like on apache##
        location / {
                if (!-e $request_filename) {
                        rewrite ^(.*)$ /index.php?s=$1 last;
                        break;
                }
                 keepalive_timeout  0;
        }
        location ~ /.svn/ {
        deny all;
        }
###end##
        include /data/server/nginx/conf/rewrite/test.conf;
        access_log /log/nginx/access/access.log;
}



客户端证书格式转换

1
2
# 将文本格式的证书转换成可以导入浏览器的证书
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12




三、将证书导入浏览器,这里以Chrome为例

1、在浏览器窗口右上角找到设置

wKiom1dFJK_iAIa0AAByQfijKWM484.jpg
2、在设置窗口中找到高级设置

wKioL1dFJbHSnDwQAABp-IlVvZc593.jpg
3、找到管理证书
wKiom1dFJMnR8d3zAACiVLwT94I491.jpg
4、点击导入证书,然后选择证书路径就可以了
wKioL1dFJcqz2RcgAABKRZb2kgU814.jpg
5、在导入证书之后就可以正常访问到服务器数据了
wKiom1dFJTWTqdbeAACGSlVFFqo683.jpg
6、如果没有成功导入客户端证书就访问服务器的话,那么服务器验证客户端证书这步就会失败,然后返回如下错误
wKiom1dFJUPzkeUEAABN92QngcQ596.jpg
由于用的是自签证书不被公有CA信任,所以https那里会有红叉。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-222094-1-1.html 上篇帖子: nginx反代httpd及http-php动静分离 下篇帖子: nginx如何开启https协议
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表