使⽤Nginx实现HTTPS双向验证的⽅法
https单向验证应⽤⼴泛想必⼤家都很熟悉,我已经在⼀篇博⽂中分享过,这次来看看Nginx如何实现双向验证。
单向验证与双向验证的区别:
单向验证:指客户端验证服务器端证书,服务器并不需要验证客户端证书。nginx和apache区别
双向验证:指客户端验证服务器端证书,⽽服务器也需要通过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,签署证书
#openssl配置⽂件路径
vim/etc/pki/tls/opensslf
#下⾯只列出配置⽂件中和⾃建CA有关的⼏个关键指令
dir=/etc/pki/CA#CA的⼯作⽬录
database=$#签署证书的数据记录⽂件
new_certs_dir=$dir/newcerts#存放新签署证书的⽬录
serial=$dir/serial#新证书签署号记录⽂件
certificate=$#CA的证书路径
private_key=$dir/private/cakey.pem#CA的私钥路径
使⽤openssl制作CA的⾃签名证书
#切换到CA的⼯作⽬录
cd/etc/pki/CA
#制作CA私钥
(umask077;opensslgenrsa-outprivate/cakey.pem2048)
#制作⾃签名证书
opensslreq-new-x509-keyprivate/
#⽣成数据记录⽂件,⽣成签署号记录⽂件,给⽂件⼀个初始号。
<
touchserial
echo'01'>serial
#⾃建CA完成
准备服务器端证书
#制作服务器端私钥
(umask077;opensslgenrsa-outserver.key1024)
#制作服务器端证书申请指定使⽤sha512算法签名(默认使⽤sha1算法)
opensslreq-new-keyserver.key-sha512-outserver.csr
#签署证书
-days3650
准备客户端证书
#制作客户端私钥
(umask077;opensslgenrsa-outkehuduan.key1024)
#制作客户端证书申请
opensslreq-new-keykehuduan.key-outkehuduan.csr
#签署证书
-days3650
注意事项:
1、制作证书时会提⽰输⼊密码,设置密码可选,服务器证书和客户端证书密码可以不相同。
2、服务器证书和客户端证书制作时提⽰输⼊省份、城市、域名信息等,需保持⼀致。
3、以下信息根证书需要和客户端证书匹配,否则可能出现签署问题。
countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = match
如何指定签署证书的签名算法
<strong>opensslreqxx
-[digest]Digesttosignwith(seeopenssldgst-hforlist)</strong>
查看使⽤的签名算法:
<strong>#使⽤-sha256指定算法
opensslreq-new-keyserver.key-sha256-outserver.csr</strong>
⼆、提供Nginx配置⽂件
<strong>server{
listen443;
server_namepro.server;
ssion;
ssi_silent_errorson;
ssi_typestext/shtml;
sslon;
ssl_certificate/data/server/nginx/ssl/;
ssl_certificate_key/data/server/nginx/ssl/self/server.key;
ssl_client_certificate/data/server/nginx/ssl/self/;
ssl_verify_clienton;
ssl_protocolsTLSv1TLSv1.1TLSv1.2;
ssl_ciphersECDHE-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 ssl_prefer_server_ciphersOn;
indexindex.htmlindex.htmindex.php;
root/data/www;
location~.*\.(php|php5)?$
{
#fastcgi_passunix:/tmp/php-cgi.sock;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
}
location~.*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires30d;
}
location~.*\.(js|css)?$
{
expires1h;
}
###thisistouseopenwebsitelianjielikeonapache##
location/{
if(!-e$request_filename){
rewrite^(.*)$/index.php?s=$1last;
break;
}
keepalive_timeout0;
}
location~/.svn/{
denyall;
}
###end##
include/data/server/nginx/conf/f;
access_log/log/nginx/access/access.log;
}</strong>
客户端证书格式转换
<strong>#将⽂本格式的证书转换成可以导⼊浏览器的证书
<-inkeyclient.key-outclient.p12</strong>
三、将证书导⼊浏览器,这⾥以Chrome为例
1、在浏览器窗⼝右上⾓到设置
2、在设置窗⼝中到⾼级设置
3、到管理证书
4、点击导⼊证书,然后选择证书路径就可以了
5、在导⼊证书之后就可以正常访问到服务器数据了
6、如果没有成功导⼊客户端证书就访问服务器的话,那么服务器验证客户端证书这步就会失败,然后返回如下错误
由于⽤的是⾃签证书不被公有CA信任,所以https那⾥会有红叉。
以上所述是⼩编给⼤家介绍的使⽤Nginx实现HTTPS双向验证的⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。