文章内容

2018/10/18 16:28:29,作 者: 黄兵

nginx 设置https

最近服务器出了一点问题,升级nginx失败,但是服务器cpu经常100%,检查了一下nginx的配置文件,将某个网站升级成为全站https。

server {

  listen 80;
  listen [::]:80 ssl ipv6only=on;
  listen 443 ssl;
  listen [::]:443 ssl ipv6only=on;
  server_name www.pdflibr.com;

  ssl on;
  ssl_certificate /etc/ssl/private/www.pdflibr.com/1_www.pdflibr.com_bundle.crt;
  ssl_certificate_key /etc/ssl/private/www.pdflibr.com/2_www.pdflibr.com.key;

  ssl_prefer_server_ciphers on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
  keepalive_timeout 70;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 10m;
  
  #鍏ㄧ珯https
  add_header Strict-Transport-Security max-age=63072000;
  add_header X-Frame-Options DENY;
  add_header X-Content-Type-Options nosniff;

  location / {
      try_files $uri @gunicorn_proxy;
  }

  location @gunicorn_proxy {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://0.0.0.0:5000;
      proxy_connect_timeout 500s;
      proxy_read_timeout 500s;
      uwsgi_buffers 16 16k;
      uwsgi_buffer_size 32k;
      proxy_send_timeout 500s;
  }
}

要开启 HTTPS 服务,在配置文件信息块(server block),必须使用监听命令 listen 的 ssl 参数和定义服务器证书文件和私钥文件,如下所示:

ssl on;
ssl_certificate /etc/ssl/private/www.pdflibr.com/1_www.pdflibr.com_bundle.crt;
ssl_certificate_key /etc/ssl/private/www.pdflibr.com/2_www.pdflibr.com.key;

证书文件会作为公用实体發送到每台连接到服务器的客戶端,私钥文件作为安全实体,应该被存放在具有一定权限限制的目录文件,并保证 Nginx 主进程有存取权限。

命令 ssl_protocols 和 ssl_ciphers 可以用来限制连接只包含 SSL/TLS 的加強版本和算法,默认值如下:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;


强制使用https:

HSTS – HTTP Strict Transport Security,HTTP严格传输安全。它允许一个 HTTPS 网站要求浏览器总是通过 HTTPS 来访问,这使得攻击者在用戶与服务器通讯过程中拦截、篡改信息以及冒充身份变得更为困难。


只要在 Nginx 配置文件加上以下头信息就可以了:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always;

max-age:设置单位时间内強制使用 HTTPS 连接

includeSubDomains:可选,所有子域同时生效

preload:可选,非规范值,用于定义使用『HSTS 预加载列表』

always:可选,保证所有响应都发送此响应头,包括各种內置错误响应

当用户进行 HTTPS 连接的时候,服务器会发送一个 Strict-Transport-Security 响应头:


定义D-H算法(迪菲-赫尔曼密钥交换):

#使用DH文件
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#定义算法
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
#...


参考资料:Nginx 配置 HTTPS 服务器

分享到:

发表评论

评论列表