CA:证书颁发机构。有受信任的第三方颁发机构,也有个人的。但是自己充当颁发机构的话是不受浏览器信任的。 CA证书:由CA机构颁发的证书,相当于盖公章。是由颁发机构的私钥给需要证书方的公钥加密生成。 这里需要两个密钥对,一个颁发方,一个是请求证书方。 颁发证书过程: 1.请求方假定叫a事先生成密钥对,也可以是颁发机构假定叫b代为生成。有了密钥对之后,请求方a保管好私钥,将公钥给机构b,因为需要b给它的公钥加上数字认证,也就是生成证书。 2.机构b对a的身份进行确认,自制的话不用,比如电话核实或者邮件核实是否是a提交的公钥。 3.b确认后,就用自己的私钥对a的公钥添加数字签名,就生成了ca证书。之后a就用b颁发的ca证书可以使用ssl协议进行加密传输网络数据。
加入这时c去对a进行访问,c得到a的数字证书后,就先用b的公钥对数字签名进行验证,如果核实就得到了a的公钥,c就用a的公钥加密需要发送的消息,a得到后用私钥解密即可。之后a和c协商生成对话密钥,之后就用对话密钥互相传输消息,关于对话密钥的生成可以查看ssl协议机制。
这里为啥需要是受信任的第三方的机构呢?一句话:只要机构的数字证书可信,那么里面的公钥也就可信。想象一个场景:你的报文在传输过程中被其他人截获,别人也可以制作出和你一样的数字证书出来,里面放的是他的公钥,那么他就可以再截获报文用自己的私钥解密,就可以得到你传输的消息内容。
自制ca证书
环境说明: 两台centos7,当然也可以用一台: 服务端:192.168.247.100 nginx端:192.168.247.101
服务端操作:
1.安装openssl
yum install -y openssl
openssl是ssl协议的程序 查看openssl配置文件内容,里面包含证书存放路径等信息:
vim /etc/pki/tls/openssl.cnf
dir = /etc/pki/CA --证书存放主目录
certs = $dir/certs --存储签发的数字证书
database = $dir/index.txt --记录颁发的证书信息
serial = $dir/serial --证书编号
certificate = $dir/cacert.pem --本地自签名数字证书
private_key = $dir/private/cakey.pem --用于签发的私钥
创建证书私钥:
openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
生成本地数字证书:
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
一次填写国家,省份,城市,公司到位名称,个人或组织名称,域名,邮箱。 创建两个文件:
cd /etc/pki/CA
touch index.txt
echo 01 > serial
服务端好了,nginx服务器操作: 也是先生成私钥文件,自定义文件路径:
mkdir test_ssl
cd test_ssl
openssl genrsa -out /root/test_ssl/nginx.key 2048
生成请求文件,服务器端等下用这个请求文件来生成数字证书。前面服务端其实也可以先生成请求文件再生成数字证书。
openssl req -new -key nginx.key -out nginx.csr
--填写信息中签发的机构、省份、城市要和上面CA生成的机构一样,server name是域名
将请求文件发给服务端:
scp nginx.csr 192.168.247.100:~/
服务端操作: 给这个请求文件生成签名,生成数字证书;
openssl ca -in /root/nginx.csr -out /etc/pki/CA/certs/nginx.crt -days 365
两个y即可
最后把这个数字证书发回给nginx端:
scp /etc/pki/CA/certs/nginx.crt 192.168.247.101:~/test_ssl/
数字证书两边就完成了。
nginx配置ssl
vim /usr/local/nginx/conf/vhost/default.conf
server
{
listen 443 ssl;
server_name b.com;
root /data/wwwroot/default/;
index index.php index.html index.htm;
ssl on;
ssl_certificate /root/test_ssl/nginx.crt;
ssl_certificate_key /root/test_ssl/nginx.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!eNULL;
ssl_prefer_server_ciphers on;
}
最后浏览器访问结果:
|