首先,先了解一下https的验证过程。
1、首先客户端向服务器发送一个SSL的请求包,要求进行安全的会话,请证明你的身份,并且我们双方来协商一下一会将用对对称加密算法,数字签名算法。。。。。。
----------------->
2、HTTPS server收到请求后,响应client,把S证书传给client
<----------------
3、Client需要验证S证书,client会有CA的证书,可以对S证书进行验证(看是否可以解密,再看标识[服务器域名/主机名]是否对得上)。
Client需要产生一把对称加密的KEY,通过S公钥把KEY加密,然后传给Server
------------------->
4、HTTPS Server用自己的私钥解密得到KEY。随机产生一些信息,用KEY加密,传给Client。
<--------------------
接下来,双方通过KEY加密页面数据,安全传输
<--------------------->
我们对应上面的过程一步步进行。第一点HTTPS server应该要有自己的S证书:
openssl genrsa -des3 -out server.key 2048 #生成server的密钥
openssl req -new -key server.key -out server.csr -days 3650 #根据上面的密钥生成一个请求生成证书文件的请求文件,这里仅仅是一个请求文件而起。 Enter pass phrase for server.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:cn State or Province Name (full name) [Berkshire]:gd Locality Name (eg, city) [Newbury]:gz Organization Name (eg, company) [My Company Ltd]:me Organizational Unit Name (eg, section) []:me Common Name (eg, your name or your server's hostname) []:lvs.xxx.com Email Address []:liuyonglong@120.net Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:123456 An optional company name []:
第二点:为了能够生成HTTPS server的证书,需要建立CA
openssl req -new -x509 -keyout ca.key -out ca.crt -days 3650 #生成CA Generating a 1024 bit RSA private key .............++++++ ...........++++++ writing new private key to 'sfnca.key' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:cn State or Province Name (full name) [Berkshire]:gd Locality Name (eg, city) [Newbury]:gz Organization Name (eg, company) [My Company Ltd]:ca Organizational Unit Name (eg, section) []:ca Common Name (eg, your name or your server's hostname) []:mail.ca.cn Email Address []:admin@ca.cn
第三步,在为HTTPS Server生成证书之前,应该先进行一些准备工作
[root@mail ssl]# vim /etc/pki/tls/openssl.cnf #dir = ../../CA //修改如下 dir = /etc/pki/CA [root@mail ssl]# touch /etc/pki/CA/{index.txt,serial} //根据openssl.cnf生成配置文件 [root@mail ssl]#echo 01 > /etc/pki/CA/serial [root@mail ssl]#mkdir /etc/pki/CA/newcerts
第三步就可以为HTTPS Server生成证书了
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
这样客户端访问HTTPS Sever就可以用HTTPS进行访问了。
同时,HTTPS Server也可以接受来自客户端的证书,从而实现双向的验证。
第四步生成Client端证书
openssl genrsa -des3 -out client.key 2048 openssl req -new -key client.key -out client.csr -days 3650 openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key
另外,这个certificate是BASE64形式的,要转成PKCS12才能装到IE,/NETSCAPE上.转换如下:
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
最后,我们要配置一下我们HTTPS server端的nginx使其支持ssl的双向验证
ssl on; ssl_certificate ssl/server.crt; ssl_certificate_key ssl/server.key; ssl_client_certificate ssl/ca.crt ; //CA证书 ssl_verify_client on; //开启客户端双向认证
这样,如果我们只是要求单向验证的话,就不需要安装client.p12到浏览器。如果我们开启了双向认证的话,就需要在浏览器中加载我们的client.p12,这样子就可以验证来自HTTPS server的请求了。
转载于:https://blog.51cto.com/4155621/1424748