Nginx 下部署 HTTPS 与安全调优

说明

此文章是 PHPhub 部署 HTTPs 的笔记, 有很多外链, 这些外链大多是基本知识, 请认真阅读.

什么是 HTTPS?

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。

更多基本介绍请查阅:

  • 数字签名是什么?(图文并茂, 清晰易懂, 重点推荐)
  • HTTPS on WIKI
  • 密码学笔记
  • SSL 与数字证书
  • 另一个图文并茂的笔记, 供参考 --> 泛域名ssl证书搭建全攻略

需要弄清楚的几个问题:

  • HTTPS 和 SSL 的关系与基本技术实现;
  • SSL 证书的类型;
  • 什么是证书颁发机构, 为什么会存在;
  • 证书认证等级, DV, OV 和 EV 各自的意思;
  • 什么是泛域名 SSL 证书 (Wildcard Domain SSL Certificates)

操作步骤

一个大概流程如下:

  1. 购买前准备 - 服务器生成 csr 和 key 文件;
  2. 购买证书 - 利用上面生成的 csr 文件去购买证书;
  3. 购买成功后的证书有两个, 一个是域名证书, 一个是链证书, 把他们俩按照顺序合并为 crt 文件;
  4. Nginx 下配置 key 和 crt 文件, 并做安全调优.

购买证书前的准备

1. 生成证书 CSR 和 KEY

mkdir -p /etc/nginx/ssl/phphub cd /etc/nginx/ssl/PHPhub

2. 生成 orig 文件

openssl genrsa -out PHPhub.orig 2048

3. 生成 csr 文件

运行

openssl req -new -key phphub.orig -out PHPhub.csr

输出, 需要填写内容:

You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:BeiJing Locality Name (eg, city) []:BeiJing Organization Name (eg, company) [Internet Widgits Pty Ltd]:The EST Group Organizational Unit Name (eg, section) []:Dev Common Name (e.g. server FQDN or YOUR name) []:*.PHPhub.org // ----------注意这个地方要认真填写 Email Address []: emailaddress @ gmail.com  Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:  ----------注意不填写---------- An optional company name []:  ----------注意不填写----------

4. 生成 private key 文件

openssl rsa -in phphub.orig -out PHPhub.key

至此文件夹里面有 三个文件:

root@localhost:/etc/nginx/ssl/phphub# tree . ├── ikbcity.csr ├── phphub.key └── PHPhub.orig

购买证书

购买细节这里省去, 需要注意的是要认准比较权威的认证机构购买...

购买成功后会给你发两个证书 server.crt 和 server.intermediate.crt, 生成最终的 server.chained.crt

cat server.crt server.intermediate.crt > PHPhub.crt

此文件就可以和上面生成的 key 文件一起用来配置 nginx 了:

ssl_certificate     /etc/nginx/ssl/phphub/phphub.crt; ssl_certificate_key /etc/nginx/ssl/phphub/PHPhub.key;

配置安全的 Ngxin

链接:

  • Best nginx configuration for security
  • Nginx config on Gits
  • Top 20 Nginx WebServer Best Security Practices
  • SSL Server Test -- 安全测试工具

强制使用 HTTPS

server {     listen 80;     listen 443 ssl;     server_name example.com;      if ($scheme = http) {         return 301 HTTPs://$server_name$request_uri;     }      .... }    

去除 Nginx 的X-Powered-Byheader

fastcgi_hide_header X-Powered-By;

去除 nginx 版本

server_tokens off;

不允许被 iframe 加载

add_header X-Frame-Options SAMEORIGIN;

其他参照此 Gits:Nginx config on Gits

静态内容

一般都会出现 cdn 服务器无法访问 HTTPs 源服务器的问题, 可以使用专门的域名static.PHPhub.org来解决, 此域名专门用来输送静态内容:

server {     listen 80;     server_name static.phphub.org;     root /var/www/PHPhub/public;     location ~* .(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {             add_header        Cache-Control public;             add_header        Cache-Control must-revalidate;             expires           7d;     }     location  / {             deny all;     } }

结语

可以利用SSL Server Test -- 安全测试工具去测试下你的 HTTPS 是否够安全.

附上PHPhub 的 test




转载请注明:http://www.guyukameng.com/jspt/jspt/14.html