欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

详解Nginx服务器中配置全站HTTPS安全连接的方法

程序员文章站 2022-05-12 12:08:32
https就等于http加上tls(ssl),https协议的目标主要有三个:     数据保密性。保证内容在传输过程中不会被第三方查看到。...

https就等于http加上tls(ssl),https协议的目标主要有三个:

    数据保密性。保证内容在传输过程中不会被第三方查看到。就像快递员传递包裹时都进行了封装,别人无法知道里面装了什么东西。
    数据完整性。及时发现被第三方篡改的传输内容。就像快递员虽然不知道包裹里装了什么东西,但他有可能中途掉包,数据完整性就是指如果被掉包,我们能轻松发现并拒收。
    身份校验。保证数据到达用户期望的目的地。就像我们邮寄包裹时,虽然是一个封装好的未掉包的包裹,但必须确定这个包裹不会送错地方。

启用https之前需要有证书,而证书需要首先在自己服务器上创建csr,对应的公钥和私钥。这里我全部都拿nginx服务器举例,apache也不会差太多,都是基于openssl的。因为我只有一个主机域名www.jb51.net,所以证书方便选择了comodo的positivessl,每年9刀。需要注意comodo要求证书至少是2048位,见下面的命令。激活证书的时候需要注意common name那里要填写自己的域名地址,我因为并不使用jb51.net,所以这里写的就是www.jb51.net,需要注意这两个主机地址是不同的。其他的组织名公司名什么的如果没有就写na,不要留空。下面简单说一下步骤


1、以root登录,升级服务器。这里是为了解决openssl的一个大漏洞cve-2014-0224,因为changecipherspec消息的问题可能导致中间人攻击,解密并修改被攻击的服务器和客户端之间的通信,从而获得加密的数据。

查看openssl版本,确认至少在1.0.1h以上,

openssl version -a

如果没有,升级服务器,以debian为例

apt-get update
apt-get upgrade

2、创建csr和私钥

openssl req -new -newkey rsa:2048 -nodes -keyout www.jb51.net.key -out www.jb51.net.csr

得到2个文件,私钥www.jb51.net.key,csr文件www.jb51.net.csr,其中csr里面的内容在激活证书的时候需要提交

3、购买证书,完成激活,下载证书文件

下载的证书文件通常是一个压缩包,有些是2个文件,有些是4个文件

如果是2个文件,是这样的:

  • www_jb51_net.ca-bundle
  • www_jb51_net.crt

如果是4个文件,通常都是这样的:

  • www_jb51_net.crt
  • comodorsadomainvalidationsecureserverca.crt
  • comodorsaaddtrustca.crt
  • addtrustexternalcaroot.crt

其中www_slyar_com.ca-bundle就是自动合并了其他3个文件的产物,一个道理

4、合并证书,顺序一定不能错

cat www_jb51_net.crt www_slyar_com.ca-bundle > www.jb51.net.crt

或者

cat www_slyar_com.crt www_slyar_com.ca-bundle > www.jb51.net.crt

最后产生的www.jb51.net.crt是4个文件的合并,此文件与之前产生的www.jb51.net.key一起组成了nginx需要使用的证书

5、把www.jb51.net.crt和www.jb51.net.key复制到nginx的conf目录下,比如/usr/local/nginx/conf/

cp www.jb51.net.crt www.jb51.net.key /usr/local/nginx/conf/

6、修改nginx配置文件或者vhost/下的虚拟主机配置文件,启用https,配置加密方式等

#合并80和443配置文件也可以,一起配置,最后强制转移80到443就可以了
listen 80;
listen 443;

#指定证书文件
ssl_certificate www.jb51.net.crt;
ssl_certificate_key www.jb51.net.key;

#禁用不安全的sslv1 2 3,只使用tls
ssl_protocols tlsv1 tlsv1.1 tlsv1.2;

ssl_prefer_server_ciphers on;

#rc4也是不安全的了,只能去掉
ssl_ciphers eecdh+chacha20:eecdh+aes128:rsa+aes128:eecdh+aes256:rsa+aes256:eecdh+3des:rsa+3des:!md5;

#301转移
if ($server_port = 80) {
return 301 https://$server_name$request_uri;
}

7、测试nginx配置文件并重新reload配置文件

nginx -t
service nginx reload

这样服务器的https就配置完了。

既然https非常安全,数字证书费用也不高,那为什么互联网公司不全部使用https呢?原因主要有两点:

https对速度的影响非常明显。每个https连接一般会增加1-3个rtt,加上加解密对性能的消耗,延时还有可能再增加几十毫秒。
https对cpu计算能力的消耗很严重,完全握手时,web server的处理能力会降低至http的10%甚至以下。

https为什么会严重降低性能?主要是握手阶段时的大数运算。其中最消耗性能的又是密钥交换时的私钥解密阶段(函数是rsa_private_decryption)。这个阶段的性能消耗占整个ssl握手性能消耗的95%。

然而随着各大网站的相继跟进与硬件的摩尔定律下,为了安全而做这点性能牺牲还是值得的。