首先,客户端与服务器端进行三次握手。(因为http基于TCP/IP协议进行通信),然后他们建立SSL会话,协商要使用的加密算法,当协商完 成之后。服务器端就会将自己的证书发送给客户端,客户端验证发现没有问题之后,就会生成一个对称密钥发送给服务器端,然后客户端就发送请求给服务器端,服 务器端便会使用刚刚客户端发来的对称密钥加密将内容发送给客户端。这样ssl会话就建立起来了。
但是,客户端如何验证服务器的证书是否真实呢,那么便需要一个CA:第三方证书颁发机构给我们的服务器端颁发证书。所以客户端便可以到CA去验证服务器端的证书。
这时候的CA,应该自己有一份证书保存在客户端这边,并且这段证书是自签的。(用以客户端可以到CA去验证服务器端的证书。)
那么服务器端如何到CA让CA给自己搞一份证书呢:首先服务器端先生成一份密钥,将公钥交给CA,由CA对它签署并生成证书,保存一份并回送给服务器端。服务器对其进行配置使用,然后在通话过后就可以将证书发送给客户端,客户端询问CA在进行验证。
①前提:
要想使你的web服务器支持ssl功能,第一步得安装SSL模块
一、例如给test.imdst.com
创建自签名证书
-
创建根证书的私匙
openssl genrsa -out test.imdst.com.key 2048
-
利用私钥创建签名请求
openssl req -new -subj "/C=US/ST=GuangDong/L=GuangZhou/O=Your Company Name/OU=imdst.com/CN=test.imdst.com" -key test.imdst.com.key -out test.imdst.com.csr
说明:这里/C表示国家(Country),只能是国家字母缩写,如CN、US等;/ST表示州或者省(State/Provice);/L表示城市或者地区(Locality);/O表示组织名(Organization Name);/OU其他显示内容,一般会显示在颁发者这栏。 -
将带口令的私钥移除
mv test.imdst.com.key test.imdst.com.origin.key
openssl rsa -in test.imdst.com.origin.key -out test.imdst.com.key
-
用Key签名证书
openssl x509 -req -days 3650 -in test.imdst.com.csr -signkey test.imdst.com.key -out test.imdst.com.crt
-
为HTTPS准备的证书需要注意,创建的签名请求的CN必须与域名完全一致,否则无法通过浏览器验证
test.imdst.com.crt 自签名的证书
test.imdst.com.csr 证书的请求
test.imdst.com.key 不带口令的Key
test.imdst.com.origin.key 带口令的Key
二、nginx配置ssl验证
- 把test.imdst.com.crt发给浏览器验证,然后用test.imdst.com.key解密浏览器发送的数据
- nginx server {}配置
server
{
listen 443 ssl;
server_name test.imdst.com;
access_log /data/logs/test.access_log;
ssl on;
ssl_certificate sslkey/test.imdst.com.crt;
ssl_certificate_key sslkey/test.imdst.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
}