nginx配置https

nginx配置https

什么是https

https 是安全超文本传输协议。就是 HTTP协议 + SSL/TLS协议。TLS 是 SSL 的升级版协议。SSL 又是什么呢?SSL 是一个安全协议,SSL 协议处在 TCP/IP 协议和应用层协议之间。想要配置 https 就需要先了解一下 SSL 协议。

SSL

SSL 协议主要干两件事:一个是认证,一个加密。认证就是确认访问的服务和请求的客户端是正确的。客户端的认证是可选的,在一些银行的服务中是需要客户端认证的。身份确认完之后就是数据的加密了。通过加密客户端到服务端之间的通信数据来保证数据中间不会被篡改,来达到通信的安全和数据的完整。认证的方式是使用证书,比如服务端的认证,服务端发送证书给客户端,客户端再去第三方认证机构去确认服务端证书是否正确。数据的加密是通过非对称加密和对称加密的方式完成的。SSL 协议又分成两层:底下一层是记录协议,提供数据封装,压缩,加密等基本功能。上面一层是握手协议,提供身份认证,协商加密算法,交换秘钥等功能。

一个基本的流程

  1. 客户端发送请求,告诉服务器,自己支持的协议版本,加密方法,压缩方法,以及一个随机数。
  2. 服务端收到请求,确定协议版本,确定使用的加密方法,也生成一个随机数发送给客户端,还有自己的证书。
  3. 客户端收到响应,通过证书验证服务端,通过之后使用证书里的公钥加密一个随机数,发送给服务端,并告知握手结束。
  4. 服务端使用私钥解密客户端发送的随机数,通知客户端随后的信息都将用双方商定的加密方法和密钥发送。

在整个过程中,客户端和服务端都获取到了3个随机数,前两个随机数分别是客户端和服务端生成的,都是明文传送,最后一个随机数是客户端生成,并通过公钥加密传给服务端。客户端和服务端分别使用3个随机数和协商的加密算法算出对称加密的密钥。后面的通信都是用这个对称密钥来加密信息。

准备工作

通过 SSL 协议知道,服务端需要一个证书来证明自己的身份,还需要一对公私钥来加解密随机数。公钥需要放在证书里发送给客户端,私钥自己留着解密。证书需要去第三方机构获取,一般是收费的,也可以使用自签证书,使用自签证书意味着认证是没有什么效果的。这里需要用到 openssl 工具, openssl是一个开源软件,提供了通用加密库,TLS/SSL 的实现,命令行工具。

  1. 生成私钥
openssl genrsa -des3 -out yourdomain.com.key 1024
  1. 根据私钥域名生成证书请求
openssl req -new -subj /C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=yourdomain.com -key yourdomain.com.key -out yourdomain.com.csr
  1. 自签名证书
mv yourdomain.com.key yourdomain.com.origin.key
openssl rsa -in yourdomain.com.origin.key -out yourdomain.com.key
openssl x509 -req -days 3650 -in yourdomain.com.csr -signkey yourdomain.com.key -out yourdomain.com.crt

yourdomain.com 换成自己的域名

配置

  • 把签名之后的证书和私钥移动到一个目录存放
cp yourdomain.com.crt /etc/nginx/ssl/yourdomain.com.crt
cp yourdomain.com.key /etc/nginx/ssl/yourdomain.com.key
  • 配置nginx
 server {
            listen       443 ssl;
            server_name yourdomain.com;
            
            ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
            ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
            
            location / {
                root   /home/www/;
                index  index.html index.htm index.php;
            }
            location ~ /\. {
                 deny all;
            }
        }

发表评论

电子邮件地址不会被公开。 必填项已用*标注