ssl原理,生成ssl密钥对,Nginx配置ssl
温馨提示:这篇文章已超过866天没有更新,请注意相关的内容是否还可用!
通信过程大致如下
浏览器发送一个https的请求给服务器;
服务器要有一套数字证书,可以自己制作(后面的操作就是自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出>提示页面,这套证书其实就是一对公钥和私钥;
服务器会把公钥传输给客户端;
客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
客户端把加密后的随机字符串传输给服务器;
服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
服务器把加密后的数据传输给客户端;
客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
生产ssl密钥对
生产ssl密钥,首先得要有openssl组件,如果没有需要安装下#yum install -y openssl安装
# openssl genrsa -des3 -out tmp.key 2048//key文件为私钥
Generating RSA private key, 2048 bit long modulus
...............................................+++
..............................+++
e is 65537 (0x10001)
Enter pass phrase for tmp.key:
Verifying - Enter pass phrase for tmp.key:
# openssl rsa -in tmp.key -out ahao.key //转换key,取消密码
Enter pass phrase for tmp.key:
writing RSA key
-in 指定哪个私钥要被转换,-out转换后的
删除带有密码的# rm -f tmp.key
# openssl req -new -key ahao.key -out ahao.csr //生成证书请求文件,需要拿这个文件和私钥一起生产公钥文件
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
A challenge password []:123456
An optional company name []:
其中 ahao.key为私钥, ahao.csr为公钥
# openssl x509 -req -days 365 -in ahao.csr -signkey ahao.key -out ahao.crt
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd
Getting Private key
以上操作视为了最终生成ahao.key和ahao.crt两个文件
Nginx配置ssl
server{ listen 443; server_name ahao.com; index index.html index.php; root /data/wwwroot/test.com; #开启ssl ssl on; ssl_certificate ahao.crt; ssl_certificate_key ahao.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; }
保存配置文件后,检查下配置是否有问题,,检查后发现如下问题
# /usr/local/nginx/sbin/nginx -t
nginx: [emerg] unknown directive "ssl" in /usr/local/nginx/conf/vhost/ssl.conf:7
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
这说明当前nginx并不支持ssl,因为在先前我们编译nginx的时候并没有而外配置支持ssl参数,要解决只能从新编译下nginx操作如下
# cd /usr/local/src/nginx-1.12.1
# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
./configure --prefix=/xmisp/server/tengine --with-http_ssl_module --with-http_sub_module=shared --with-http_concat_module=shared --with-http_limit_req_module=shared
#make && make install
# /usr/local/nginx/sbin/nginx -t 在验证下
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# /etc/init.d/nginxd restart 重启服务
创建下文件存放目录/data/wwwroot/test.com
写入一下内容# echo "这个是https加密网站" >>/data/wwwroot/test.com/1.html
编辑hosts,增加192.168.5.16 ahao.com
如下图
会提示不安全,这个是因为证书是我们自己制作的,并没有得到浏览器认可,如果想继续放访问,可以点添加例外,,此时浏览器地址栏会出现一个灰色的小锁,并且带有黄色三角号,这意味着改链接不安全,,不是不安全而是该证书不被浏览器认可,如下,我自己在阿里云申请的免费证书就可以认可,如下图
认可的证书是变成一个绿色锁的