NGINX 使用HTTP2

部署

使用HTTP2 首先必须部署SSL,走HTTPS协议 可参考NGINX服务器网站升级HTTPS

首先查看下nginx支持不支持http2,我是使用yum 安装的默认已经安装了模块,使用下面命令查看

nginx -V

查看下是否有下面的模块

--with-http_v2_module

修改虚拟主机配置

server {
    # listen 80;
    listen  443 ssl http2;
    #....
}

重启服务器,restart 而不是reload

service nginx restart

验证

第一种方法

在谷歌浏览器上打开你使用http2的站点,在浏览器地址栏输入chrome://net-internals/#http2,看下HTTP/2 sessions 里面有没有你的主机地址

第二种方法

在谷歌浏览器上打开你使用http2的站点,打开调试工具(F12),进入Network,刷新页面,然后在右键导航栏,勾选下’Protocol’,就可以看到在那一栏,显示h2

如何启用curl命令HTTP2支持

未分类

当我们直接使用 curl 去请求一个 https 页面时,默认可以看到其默认返回的是 HTTP1.1 的 response。现在使用 HTTP2 的网站越来越多,技术也越来越成熟,如何启用 curl 命令 HTTP 2 支持就成为了一个问题。

curl -I https://nghttp2.org/

未分类

当我们试图用 http2 参数时,会返回一个未支持协议的「curl: (1) Unsupported protocol」错误:

curl --http2 -I https://nghttp2.org/

未分类

使用如下命令我们可以看到 curl 版本:

curl --version

未分类

从上图中,我们可以看到当前 curl 的版本及支持的协议以及功能特性没有支持 HTTP2。

启用curl命令HTTP2支持

编译安装nghttp2

为了让 curl 支持 HTTP2 我们需要安装 nghttp2(http2 的 C 语言库):

#安装编译工具等
sudo apt-get install git g++ make binutils autoconf automake autotools-dev libtool pkg-config 
  zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev libevent-dev libjansson-dev 
  libjemalloc-dev cython python3-dev python-setuptools

#编译安装nghttp2
git clone https://github.com/tatsuhiro-t/nghttp2.git
cd nghttp2
autoreconf -i
automake
autoconf
./configure
make
sudo make install

升级curl版本

cd ~
sudo apt-get build-dep curl

wget http://curl.haxx.se/download/curl-7.46.0.tar.bz2
tar -xvjf curl-7.46.0.tar.bz2
cd curl-7.46.0
./configure --with-nghttp2=/usr/local --with-ssl
sudo make && make install

echo '/usr/local/lib' > /etc/ld.so.conf.d/local.conf
ldconfig

升级完版本之后,我们再查看 curl 版本时会发布特性中会增加 HTTP2 功能支持。此时 –http2 参数就可以正常使用了:

未分类

curl --http2 -I https://nghttp2.org

测试curl with http2

我们再使用如下命令测试 winclient 主页看看:

curl --http2 -I https://www.winclient.cn

返回结果如下:

未分类

curl用法:获取网站的header头及状态码 http://www.linuxidc.com/Linux/2015-11/125325.htm

ubuntu14.04升级php curl,支持http2发送APNs

网上升级很多都不完整,不是这里出错就是那里出错。

遇到的问题是:

一、首先升级curl,这个比较容易,虽然支持http2,但是利用命令发送不了APNs的消息,明明支持http2,可以发送消息的头部依然是http/1.1。找了很多资料,需要升级openssl

二、升级openssl也容易,但是编译了很多次,curl -V查看版本的时候,openssl依然是老版本

总结问题,要cURL支持http2,必须满足openssl >= 1.0.2 , cURL >= 7.46.0

安装库文件

sudo apt-get install g++ make binutils autoconf automake git autotools-dev libtool pkg-config zlib1g-dev libcunit1-dev libxml2-dev libev-dev libevent-dev libssl-dev libjansson-dev libjemalloc-dev cython python3-dev python-setuptools

1、升级openssl

sudo add-apt-repository ppa:0k53d-karl-f830m/openssl

sudo apt-get update

sudo apt-get install openssl

2、安装nghttp2

git clone https://github.com/tatsuhiro-t/nghttp2.git

cd nghttp2

autoreconf -i

automake

autoconf

./configure

make

sudo make install

3、升级curl

sudo apt-get build-dep curl

wget https://curl.haxx.se/download/curl-7.55.1.tar.gz

tar zxvf curl-7.55.1.tar.gz

cd curl-7.55.1

./configure --prefix=/usr/local --with-nghttp2=/usr/local --with-ssl

make -s && sudo make install

sudo ldconfig

4、升级php5-curl

apt-get remove php5-curl

apt-get install php5-curl

php5enmod curl

service apache2 restart

UBUNTU 16.04 APACHE2开启HTTP2支持

UBUNTU 16.04默认源里的APACHE2没有HTTP2模块,如果启用HTTP2模块一般会报错找不到模块.

a2enmod http2
ERROR: Module http2 does not exist!

所以如果要启用HTTP2模块,需要从源码从头编一个APACHE2.不过编译好的HTTP2模块可以直接拷贝出来使用,所以已经安装过APACHE2了也不需要担心.
首先将源码源加入源列表之中:

vi /etc/apt/sources.list

添加以下:

deb-src http://archive.ubuntu.com/ubuntu/ xenial main universe restricted multiverse
deb-src http://security.ubuntu.com/ubuntu xenial-security main universe restricted multiverse
deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates main universe restricted multiverse

然后刷新源,如果有需要更新的包,顺便升下级:

apt update
apt upgrade

然后安装依赖:

apt install curl devscripts build-essential fakeroot libnghttp2-dev

创建一个工作的编译目录:

cd ~
mkdir apache2
cd apache2

从源里下载APACHE2的源码然后编译:

apt source apache2
apt build-dep apache2
cd apache2-2.4.18
apt install curl devscripts build-essential fakeroot
fakeroot debian/rules binary

将编译的好的HTTP2模块拷贝到APACHE2模块目录中:

cp debian/apache2-bin/usr/lib/apache2/modules/mod_http2.so /usr/lib/apache2/modules/

然后为HTTP2模块编写一个配置文件:

vim /etc/apache2/mods-available/http2.load

在其中写入以下:

LoadModule http2_module /usr/lib/apache2/modules/mod_http2.so

<IfModule http2_module>  
LogLevel http2:info  
</IfModule>

最后启用HTTP2模块:

service apache2 restart
a2enmod http2
service apache2 restart

编辑网站配置文件,加入HTTP2协议:

vim /etc/apache2/sites-enabled/default-ssl.conf

在默认配置文件的SERVERNAME下添加一行:

Protocols h2 http/1.1

如果没有默认配置文件,可参考以下配置文件:

<IfModule mod_ssl.c>  
 <VirtualHost _default_:443>
 ServerAdmin webmaster@localhost
 ServerName your-domain.com
 Protocols h2 http/1.1
 DocumentRoot /var/www/html

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined

 SSLEngine on

 SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
 SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

 <FilesMatch ".(cgi|shtml|phtml|php)$">
 SSLOptions +StdEnvVars
 </FilesMatch>
 <Directory /usr/lib/cgi-bin>
 SSLOptions +StdEnvVars
 </Directory>

 </VirtualHost>
</IfModule>

然后还需要将HTTP2协议加入APACHE2配置文件中:

vim /etc/apache2/apache2.conf

加入以下行:

Protocols h2 http/1.1

最后重启APACHE2

service apache2 restart

Centos 7系统开启nginx的HTTP/2教程

  • HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。

  • HTTP/2 协议是从 SPDY 演变而来,SPDY 已经完成了使命并很快就会退出历史舞台(例如 Chrome 将在「2016 年初结束对 SPDY 的支持」;Nginx、Apache 也已经全面支持 HTTP/2 ,并也不再支持 SPDY)。一般的大家把 HTTP2 简称为 h2,尽管有些朋友可能不怎么愿意,但是这个简称已经默认化了,特别是体现在浏览器对 HTTP2 都是这个简写的。普通的 HTTPS 网站浏览会比 HTTP 网站稍微慢一些,因为需要处理加密任务,而配置了 h2 的 HTTPS,在低延时的情况下速度会比 HTTP 更快更稳定!

未分类

从 Nginx 1.9.5 开始,http_v2_module 已经替换了 ngx_http_spdy_module,建议直接去 Nginx 官网(https://www.91linux.org/go/?url=http://nginx.org/) 下载最新源码包

  • 要开启HTTP/2需要nginx版本在1.9.5以上且需要openssl版本在1.0.2以上编译。
  • http2.0只支持开启了https的网站

OpenSSL

由于 OpenSSL 是系统基础库,大量其他软件都对它有依赖,如果直接升级系统自带的 OpenSSL,很容易引发各种问题。更为稳妥的做法是在编译 Web Server 时自己指定 OpenSSL 的位置。也就是通过 –with-openssl 指定了新版 OpenSSL 源码路径,这样编译出来的 Nginx 就会用上最新的 OpenSSL 库。

本站目前使用 OpenSSL 1.0.2l:

wget -O openssl.tar.gz -c https://github.com/openssl/openssl/archive/OpenSSL_1_0_2l.tar.gz
tar zxf openssl.tar.gz
mv openssl-OpenSSL_1_0_2l/ openssl

打上 ChaCha20/Poly1305 补丁:

git clone https://github.com/cloudflare/sslconfig.git
cd openssl
patch -p1 < ../sslconfig/patches/openssl__chacha20_poly1305_draft_and_rfc_ossl102j.patch
cd ../

编译并安装 Nginx

接着就可以获取 Nginx 源码,并打上 Dynamic TLS Records 补丁:

wget -c https://nginx.org/download/nginx-1.11.13.tar.gz
tar zxf nginx-1.11.13.tar.gz

cd nginx-1.11.13/
patch -p1 < ../sslconfig/patches/nginx__1.11.5_dynamic_tls_records.patch

cd ../

编译和安装:

cd nginx-1.11.13/
./configure --user=www --group=www --prefix=/usr/local/nginx --with-openssl=../openssl --with-http_v2_module --with-http_ssl_module  --with-http_gzip_static_module --with-http_stub_status_module --with-http_sub_module

make
sudo make install

除了 http_v2 和 http_ssl 这两个 HTTP/2 必备模块之外,我还额外启用了 http_gzip_static,需要启用哪些模块需要根据自己实际情况来决定(注:从 Nginx 1.11.5 开始,ipv6 模块已经内置,故 –with-ipv6 配置项已被移除)。

以上步骤会把 Nginx 装到 /usr/local/nginx/ 目录,如需更改路径可以在 –prefix指定。

设置nginx启动脚本

编辑 vi /lib/systemd/system/nginx.service 文件,没有创建一个 touch nginx.service 然后将如下内容根据具体情况进行修改后,添加到nginx.service文件中:

[Unit]
Description=nginx
After=network.target remote-fs.target nss-lookup.target

[Service]

Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

设置开机启动:systemctl enable nginx
立即启动:systemctl start nginx

配置HTTP/2

配置Nginx开启http 2.0特别简单,只要在Nginx配置文件中找到你要开启http2.0的域名server模块,然后将 listen 443 ssl;改成 listen 443 ssl http2; 即可。

server {
    listen 443 ssl http2 default_server;

    ssl_certificate    server.crt;
    ssl_certificate_key server.key;
    ...
}

保存配置文件之后,重启或重载Nginx即可生效:systemctl restart nginx

ubuntu16.04安装nginx-1.12.1开启http2

我的机子是ubuntu16.04,虽然说默认安装的openssl是1.0.2f.可是用apt安装的版本使用的openssl就是1.0.1f的,气死我了,所以我选择了编译安装

先看看nginx版本

$ nginx -V //注意V大写的

如果这行

nginx version: nginx/1.13.3

nginx版本不能低于1.9.0,不然无法支持HTTP/2.找个官方长期支持版本就好了

built with OpenSSL 1.1.0f 25 May 2017

openssl版本最好在1.0.2或者以上的.直接可以nginx配置下开启HTTP/2,不用瞎折腾,具体配置下面一起讲

编译安装openssl

openssl官网下载地址 https://www.openssl.org/source/

1、下载你需要的OpenSSL版本

我这儿的版本是 1.0.2j,我自己线上1.1.0f,怕太高碰到坑,还是稳定版用用好了

$ sudo wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
error_log  logs/error.log  error;
//日志 日志地址 变量(也不知道该怎么描述,反正我是这么认为)
//确保 logs文件夹存在哦

2、解压下载的OpenSSL压缩包

$ sudo tar -xzvf openssl-1.0.2l.tar.gz

3、开始编辑OpenSSL

$ cd openssl-1.0.2l
$ sudo ./config
$ sudo make install

4、建立软链

和所谓软连接,就相当于快捷方式吧,差不多可以这么理解

sudo ln -sf /usr/local/ssl/bin/openssl  openssl

5、版本验证

$ openssl version -v

如果版本是上面安装的1.0.2l,更新也会变化,这样子就对了,不然,嗯,洗洗睡吧…

编译nginx

1、下载nginx tar包

nginx官方下载地址 http://nginx.org/

$ sudo wget http://nginx.org/download/nginx-1.12.1.tar.gz
$ sudo tar -zxvf nginx-1.12.1.tar.gz
$ cd nginx-1.12.1

这儿就用官方长期维护版本好了,不然如果想用nginx amplify 就比较麻烦了.这儿插个嘴,nginx amplify是一个nginx官方搞得监控你服务器上nginx性能之类的可视化平台,有兴趣可以搞一搞

2、开始./configure

$ sudo ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-openssl=./openssl-1.0.2j  --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module

可能你的openssl这儿报错啥的,自己随机应变

3、开始编译Nginx

$ sudo make
$ sudo make install

4、开启nginx

$ sudo nginx

5、验证Nginx

$ nginx -V

看看你 built with OpenSSL 1.0.2j 26 Sep 2016这行是不是1.0.2j,是的话就ok了,可以美滋滋的上去配置了,不是的话可以看下./configure 配置这儿的地址填自己的

6、nginx配置

少年,是不是以为这样子就完成了…呵呵呵太天真了,还需在nginx.conf里配置一下

   listen       443 ssl http2 fastopen=3 reuseport;
//在listen里加入http2即可,简单随意

然后重启下nginx,同时测试下配置有没有错误

$ nginx- q&&nginx -t&&nginx -s reload

7.查看是否成功打开

可以在chrome F12里的network中查看protocol是否是h2,是的话即开启成功

注:protocol需要自己打开,默认没有显示

当然也可以通过这个网站qualys来测试,他的比较全面,我就不一一介绍了。

升级nginx启用http2并设置HSTS强制使用https

nginx 升级1.12 开启HTTP2

最近把网站升级到了HTTPS, 之后还将把当前一些应用的WebSocket 连接升级为 WSS连接,以安全地传输消息。最开始我本是为了测试 HTTP2 不限制请求并发数在切片请求中的优势。 但为了实现这一点,就顺手给网站在 Godaddy 上申请了域名和解析,并且通过Let’s Encrypt (这篇博文很清楚http://www.jianshu.com/p/edecc78719cb) 申请了SSL 证书。

ssllabs 安全评测 https://www.ssllabs.com/ssltest

未分类

关于OpenSSL 和 Nginx 新版本的本地编译安装就不多说了,我基本都是在linux 云服务器上搞,注意make 之前给Nginx configure 一下, 使得编译时导出这俩与HTTP2相关的module

.configure --prefix=/etc/nginx --with-http_ssl_module --with-http_v2_module

make 结束后,便会在objs 文件夹中生成按照刚才配置编译的 nginx,软连接一下即可,杀掉原来的nginx 服务实例。启动这个带有http2 module 的nginx,在网站配置中加入对端口的监听,并采用HTTP2 协议即可:

# ssl configuration
listen 443 ssl http2 default_server;
ssl on;
# ... 指定 证书和密钥地址

未分类

开启HSTS

这回主要记一下关于STS 的事儿。HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它通过服务器response header的形式告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式.

摘自:https://developer.mozilla.org
一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://foo.com或者直接foo.com。

这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。

网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求

现实案例

你连接到一个免费WiFi接入点,然后开始浏览网站,访问你的网上银行,查看你的支出,并且支付一些订单。很不幸,你接入的WiFi实际上是黑客的笔记本热点,他们拦截了你最初的HTTP请求,然后跳转到一个你银行网站一模一样的钓鱼网站。 现在,你的隐私数据暴露给黑客了。

Strict Transport Security解决了这个问题;只要你通过HTTPS请求访问银行网站,并且银行网站配置好Strict Transport Security,你的浏览器知道自动使用HTTPS请求,这可以阻止黑客的中间人攻击的把戏。

Nginx 设置HSTS

编辑你的Nginx具体网站配置文件,在SSL Configuration 中添加SSL key和cert 签名证书,并且配置add header,让每一个http response 都具有STS 字段。

// nginx 网站部分配置内容
# ssl configuration
listen 443 ssl http2 default_server;
ssl on;
ssl_certificate [cert 路径]
ssl_certificate_key [private key 路径]
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; "
  • max-age 表示STS 策略的过期时间,也就是浏览器在收到带有 Strict Transport Security – response header 多久后过期,就可以转为http 请求。
  • includeSubdomains 表明 STS 策略也应用到 当前域名的子域名。

如此这般,就已经开启了STS,这使得服务器每次response都告诉浏览器所有请求都强制使用https,就算用户手动输入http 地址也会在浏览器内部替换为https 请求,在根源上杜绝浏览器与服务器建立非安全连接。

未分类

写在最后

为什么我一定要对网站启用https,主要是为了测试 https 对数据传输的加密,网站性能。特别是涉及到用户个人聊天记录、支付信息等隐私数据,必须采用 SSL加密传输,才能防止数据传输过程被中间人劫持、篡改。
如今网络安全形式愈演愈烈,不论是阿里巴巴还是百度,都在几年前率先全站升级为HTTPS,GeoQ Ana这样的在线制图平台也采用HTTPS 来实现用户隐私数据(往往是商业数据)的上传,保证平台的数据安全性。

Nginx HTTP2配置教程

前言

从 2015 年 5 月 14 日 HTTP/2 协议正式版的发布到现在已经快有一年了,越来越多的网站部署了 HTTP2,HTTP2 的广泛应用带来了更好的浏览体验,只要是 Modern 浏览器都支持,所以部署 HTTP2 并不会带来太多困扰。

虽然 h2 有 h2c (HTTP/2 Cleartext) 可以通过非加密通道传输,但是支持的浏览器初期还是比较少的,所以目前部署 h2 还是需要走加密的,不过由于 Let’s Encrypt 大力推行免费证书和证书的廉价化,部署 h2 的成本并不高。

介绍

HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。

HTTP/2 协议是从 SPDY 演变而来,SPDY 已经完成了使命并很快就会退出历史舞台(例如 Chrome 将在「2016 年初结束对 SPDY 的支持」;Nginx、Apache 也已经全面支持 HTTP/2 ,并也不再支持 SPDY)。

一般的大家把 HTTP2 简称为 h2,尽管有些朋友可能不怎么愿意,但是这个简称已经默认化了,特别是体现在浏览器对 HTTP2 都是这个简写的。

配置

普通的 HTTPS 网站浏览会比 HTTP 网站稍微慢一些,因为需要处理加密任务,而配置了 h2 的 HTTPS,在低延时的情况下速度会比 HTTP 更快更稳定!

现在电信劫持事件频发,网站部署了 HTTPS 加密后可以杜绝大部分劫持,但不是完全。像电子商务行业对 HTTPS 加密可是标配啊,因此部署 h2 更是势在必行。

证书

这里是 免费和便宜 SSL 证书介绍 ,大家可以从这里购买或者申请免费的 SSL 证书,免得 Chrome 弹出红色的页面令人不悦,从而拒绝了大多数访客。

Web 服务器

说明

默认编译的 Nginx 并不包含 h2 模块,我们需要加入参数来编译,截止发文,Nginx 1.9 开发版及以上版本源码需要自己加入编译参数,从软件源仓库下载的则默认编译。 Tengine 可以同时部署 h2 和 SPDY 保证兼容性,Nginx 则是一刀切不再支持 SPDY。

安装/编译

如果你编译的 Nginx 不支持,那么在 ./configure 中加入:–with-http_v2_module ,如果没有 SSL 支持,还需要加入 –with-http_ssl_module

然后 make && make install 即可。

配置

主要是配置 Nginx 的 server 块, 。
修改相关虚拟机的 .conf 文件,一般在 /usr/local/nginx/conf/vhost/ 或者 /etc/nginx/conf/,具体参考你的环境指导,不懂请回复。

server {
listen 443 ssl http2 default_server;
server_name www.mf8.biz;

ssl_certificate /path/to/public.crt;
ssl_certificate_key /path/to/private.key;

注:将 server_name www.mf8.biz; 中的 www.mf8.biz 替换为你的域名。

然后通过 /usr/local/nginx/sbin/nginx -t 或者 nginx -t 来检测是否配置正确,然后重启 Nginx ,即可。

检验

在 Chrome 浏览器上可以通过,HTTP/2 and SPDY indicator 来检验,如果地址栏出现蓝色的闪电就是 h2

也可以在 chrome://net-internals/#http2 中检查。注意版本要新,姿势要帅!

配置进阶

大家都知道去年的心血漏洞将 SSL 推到了风口浪尖,所以单单支持了 h2 ,我们任然需要对 SSL 做一些安全的优化!

配置赫尔曼密钥

openssl dhparam -out dhparam.pem 2048 // 在 ssh 运行, openssl 生成 2048 位的密钥而不是当作参数写入 nginx.conf 文件。

ssl_dhparam /path/to/dhparam.pem; //在 .conf 中配置

禁止不安全的 SSL 协议,使用安全协议

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

禁止已经不安全的加密算法

ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4';

缓解 BEAST 攻击

ssl_prefer_server_ciphers on;```

**启用 HSTS**

此举直接跳过 301 跳转,还降低了中间人攻击的风险!配置在 .conf 中即可

`add_header Strict-Transport-Security max-age=15768000;`

**301 跳转**

80 端口跳转到 443 端口
```nginx
server {
 listen 80;
 add_header Strict-Transport-Security max-age=15768000;
 return 301 https://www.yourwebsite.com$request_uri;
}

缓存连接凭据

ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;

OCSP 缝合

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/cert/trustchain.crt;
resolver 233.5.5.5 233.6.6.6 valid=300s;

欢迎你的补充!

通过 www.ssllabs.com 即可检验 HTTPS 配置的安全性和实用性!