Nginx HTTPS单向/双向认证

  • A+
所属分类:Nginx

关于HTTPS证书

  http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

  目前大部分网站都在忘https上转,Chrome也将https作为浏览器的默认连接,如果网站没采用https的话,就会出现!的标识。比如我们连接某些WIFI,经常出现app莫名奇妙增加的很多广告,这种就是典型的进行流量劫持、嗅探,可以获得通过HTTP传输的敏感信息。

  苹果宣布了一个最后期限:到2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能。App Transport Security(ATS)是苹果在iOS9中引入的一项隐私保护功能,屏蔽明文HTTP资源加载,连接必须经过更安全的HTTPS。苹果目前允许开发者暂时关闭ATS,可以继续使用HTTP连接,但到年底所有官方商店的应用都必须强制性使用ATS。所以,推行HTTPS是整个互联网行业的趋势。

证书分类

HTTP协议需要到CA申请证书,一般免费证书很少,需要交费。

目前主流的SSL证书主要分为DV SSL 、 OV SSL 、EV SSL。

DV SSL

DV SSL证书是只验证网站域名所有权的简易型(Class
1级)SSL证书,可10分钟快速颁发,能起到加密传输的作用,但无法向用户证明网站的真实身份。

目前市面上的免费证书都是这个类型的,只是提供了对数据的加密,但是对提供证书的个人和机构的身份不做验证。

OV SSL

OV SSL,提供加密功能,对申请者做严格的身份审核验证,提供可信身份证明。

和DV SSL的区别在于,OV SSL 提供了对个人或者机构的审核,能确认对方的身份,安全性更高。

所以这部分的证书申请是收费的~

EV SSL

超安=EV=最安全、最严格 超安EV SSL证书遵循全球统一的严格身份验证标准,是目前业界安全级别最高的顶级 (Class 4级)SSL证书。

金融证券、银行、第三方支付、网上商城等,重点强调网站安全、企业可信形象的网站,涉及交易支付、客户隐私信息和账号密码的传输。

这部分的验证要求最高,申请费用也是最贵的。

常见的颁发证书机构

赛门铁克(Symantec)是 SSL/TLS 证书的领先提供商,GeoTrust是全球第二大数字证书颁发机构;

可以通过证书检测工具,查看证书类型、颁发机构、到期时间等信息

https://www.trustasia.com/tools-ssl-state

另外,作为 Secure Site 服务的一部分,您可以使用 True Site Seal,作为真实、安全、可靠的标识――可以增加客户对您站点的信心。

GeoTrust True Site Seal安装指导请访问

https://www.geotrust.com/support/seal/agreement/installation-instructions/

证书成功安装后建议使用安装检查工具,确保您已正确安装证书:

https://knowledge.geotrust.com/support/knowledge-base/index?page=content&id=SO9557&actp=LIST

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

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

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

单向验证

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

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

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

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

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

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

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

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

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

双向验证

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

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

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

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

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

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

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

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

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

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

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

NGINX部署HTTPS证书

创建ssl证书临时存放目录

cd /tmp
mkdir ssl;
cd ssl

CA与自签名

制作 CA 根证书(私钥)

openssl genrsa -des3 -out ca.key 2048

制作 CA 根证书(公钥)

openssl req -new -x509 -days 7305 -key ca.key -out ca.crt
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:beijing
Locality Name (eg, city) []:beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]: test
Organizational Unit Name (eg, section) []:test
Common Name (eg, YOUR name) []:www.liuyalei.top
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Country Name ISO国家代码(两位字符) cn
State or Province Name 所在省份 beijing
Locality Name 所在城市 beijing
Organization Name 公司名称 test
Organizational Unit Name 部门名称 test
Common Name 申请证书的域名 www.liuyalei.top
Email Address 不需要输入
A challenge password 不需要输入

从Email地址开始,下面的信息都不需要,请保留为空,直接回车即可。在完成了如上的交互信息输入后,当前目录下将产生两个文件:server.key 和
server.csr。请妥善保存这两个文件,请不要泄露server.key私钥文件。

服务器端证书

制作服务端私钥

openssl genrsa -out server.pem 1024
openssl rsa -in server.pem -out server.key

生成签发请求

openssl req -new -key server.key -out server.csr

用 CA 签发

openssl x509 -req -in server.csr -out server.pem -signkey server.key -CA 
ca.crt -CAkey ca.key -CAcreateserial -days 3650

nginx单向认证

[root@Develop3 vhosts]# vim www.liuyalei.top.conf 
server {
         listen       443;
         server_name  www.liuyalei.com;
         ssl                  on;
         ssl_certificate      /usr/local/nginx/conf/vhosts/ssl/server.pem;
         ssl_certificate_key  /usr/local/nginx/conf/vhosts/ssl/server.key;
         ssl_session_timeout  5m;
         #ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
         #启用TLS1.1、TLS1.2要求OpenSSL1.0.1及以上版本,若您的OpenSSL版本低于要求,请使用 ssl_protocols TLSv1;
         #ssl_ciphers  HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
         ssl_prefer_server_ciphers   on;
        #vancloud-tenant
        location / {
          root /www/;
          index test.html;
       }
}

IE浏览器---Internet选项---内容---证书---受信任的根证书办法机构---导入ca.crt

访问https://www.liuyalei.top/test.html不会提示https证书未授权信任

客户端证书

制作客户端私钥

openssl genrsa -out client.pem 1024
openssl rsa -in client.pem -out client.key

生成签发请求

openssl req -new -key client.key -out client.csr

用 CA 签发

openssl x509 -req -in client.csr -out client.pem -signkey client.key -CA 
ca.crt -CAkey ca.key -CAcreateserial -days 3650

如果用浏览器验证,需要把客户端证书导出成client.p12格式导入浏览器。

IE浏览器---Internet选项---内容---证书---个人---导入client.p12

openssl pkcs12 -export -clcerts -in client.pem -inkey client.key -out 
client.p12

nginx双向认证

[root@Develop3 vhosts]# vim www.liuyalei.top.conf 
server {
         listen       443;
         server_name  www.liuyalei.com;
         ssl                  on;
         ssl_certificate      /usr/local/nginx/conf/vhosts/ssl/server.pem;
         ssl_certificate_key  /usr/local/nginx/conf/vhosts/ssl/server.key;
 ssl_client_certificate /usr/local/nginx/conf/vhosts/ssl/ca.crt;
         ssl_verify_client on;
         ssl_session_timeout  5m;
         #ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
         #启用TLS1.1、TLS1.2要求OpenSSL1.0.1及以上版本,若您的OpenSSL版本低于要求,请使用 ssl_protocols TLSv1;
         #ssl_ciphers  HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
         ssl_prefer_server_ciphers   on;
        #vancloud-tenant
        location / {
          root /www/;
          index test.html;
       }
}

参考文章

https://www.cnblogs.com/UnGeek/p/6049004.html

https://www.cnblogs.com/acool/p/4933325.html

http://www.willrey.com/support/SSL_Nginx.html

http://tchuairen.blog.51cto.com/3848118/1782945/

YaLei

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: