证书获取
可以从阿里云免费获取证书,登录之后找到SSL购买界面,进行购买,然后绑定域名,之后下载证书相关的文件。
证书相关的文件有以下三种:
- .crt文件:是证书文件,crt是pem文件的扩展名(有时候没有crt只有pem的,所以不要惊讶)
- .key文件:证书的私钥文件(申请证书时如果没有选择自动创建CSR,则没有该文件)
- .pem扩展名的证书文件采用Base64-encoded的PEM格式文本文件,可根据需要修改扩展名。
配置证书
- 进入nginx配置目录,为了方便管理,在etc/nginx目录中创建一个cert目录,然后把下载下来的证书copy到/etc/nginx/cert目录中。
对443端口和80端口进行监听,443端口要启用ssl ``` server { listen 443; server_name your_domain; # 配置为你的域名 ssl on; root /var/www/html; index index.html index.htm; ssl_certificate cert/your_domain.pem; ssl_certificate_key cert/your_domain.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on;
location / {
index index.html index.htm;
}
} server { listen 80; server_name your_domain; # 你的域名 rewrite ^(.*)$ https://$host$1 permanent; # 把http的域名请求转成https }
**注意:**<br />server_name 需要配置为你自己的域名;<br />root /var/www/html; 这个是你网站的所在的目录;<br />ssl_certificate cert/your_domain.pem; pem文件的路径;<br />ssl_certificate_key cert/your_domain.key; key文件的路径;
为了在使用http访问站点时,能自动跳转到https访问,设置重定向
rewrite ^(.*)$ https://$host$1 permanent; # 把http的域名请求转成https
<a name="EqrQA"></a>
#### Https服务器优化
SSL 的运行计算需要消耗额外的 CPU 资源,一般多核处理器系统会运行多个工作进程([worker processes](http://nginx.org/en/docs/ngx_core_module.html#worker_processes)),进程的数量不会少于可用的 CPU 核数。SSL 通讯过程中『握手』阶段的运算最占用 CPU 资源,有两个方法可以减少每台客户端的运算量:
- **激活**[keepalive](http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout)**长连接,一个连接发送更多个请求**
- **复用 SSL 会话参数,在并行并发的连接数中避免进行多次 SSL『握手』**
这些会话会存储在一个 SSL 会话缓存里面,通过命令[ssl_session_cache](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_cache)配置,可以使缓存在机器间共享,然后利用客戶端在『握手』阶段使用的seesion id去查询服务端的 session cathe(如果服务端设置有的话),简化『握手』阶段。<br />1M 的会话缓存大概包含 4000 个会话,默认的缓存超时时间为 5 分钟,可以通过使用[ssl_session_timeout](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_timeout)命令设置缓存超时时间。下面是一个拥有 10M 共享会话缓存的多核系统优化配置例子:
http {
#配置共享会话缓存大小
ssl_session_cache shared:SSL:10m;
#配置会话超时时间
ssl_session_timeout 10m;
server {
#...
#设置长连接
keepalive_timeout 70;
#...
<a name="CRR1K"></a>
#### 加强 HTTPS 安全性
HTTPS 基础配置采取的默认加密算法是 SHA-1,这个算法非常脆弱,安全性在逐年降低,在 2014 年的时候,**Google 官方博客就宣布在 Chrome 浏览器中逐渐降低 SHA-1 证书的安全指示,会从 2015 年起使用 SHA-2 签名的证书**,可参阅[Rabbit_Run](http://www.freebuf.com/author/rabbit_run)在 2014 年发表的文章:[《为什么Google急着杀死加密算法SHA-1》](http://www.freebuf.com/news/topnews/44288.html)<br />为此,主流的 HTTPS 配置方案应该避免 SHA-1,可以使用[迪菲-赫尔曼密钥交换(D-H,Diffie–Hellman key exchange)](https://zh.wikipedia.org/wiki/%E8%BF%AA%E8%8F%B2-%E8%B5%AB%E7%88%BE%E6%9B%BC%E5%AF%86%E9%91%B0%E4%BA%A4%E6%8F%9B)方案。<br />首先在目录/etc/ssl/certs运行以下代码生成dhparam.pem文件:
openssl dhparam -out dhparam.pem 2048
然后加入 Nginx 配置:
优先采取服务器算法
ssl_prefer_server_ciphers on;
使用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”;
减少点击劫持
add_header X-Frame-Options DENY;
禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;
防XSS攻击
add_header X-Xss-Protection 1;
```