Nginx配置开启Https、HSTS、Http2、TLS1.3零基础教程

NGINX是一个免费开源的高性能HTTP服务器和反向代理,以及IMAP/POP3代理服务器。NGINX以其高性能,稳定性,丰富的模块,简单的配置和低资源消耗而闻名。

Nginx配置开启Https、HSTS、Http2、TLS1.3零基础教程
安装nginx
有可能你当前已经通过apt-get、yum等命令安装了,但是可能不支持https http2 ipv6 TLS1.3 HSTS等功能。(以上功能面板一般是配置好的)

查看当前版本配置

我们可以通过nginx -V命令来查看版本以及支持的配置。
Nginx配置开启Https、HSTS、Http2、TLS1.3零基础教程
下面以ubuntu为例,卸载安装nginx

卸载

# 移除 nginx
$ apt-get --purge remove nginx

# 查询 nginx 依赖的包,会列出来
$ dpkg --get-selections|grep nginx

# 移除上面列出的包,例如 nginx-common
$ apt-get --purge remove nginx-common

# 也可以执行 autoremove,会自动删除不需要的包
$ apt-get autoremove

# 查询 nginx 相关的文件,删掉就可以了
$ sudo find / -name nginx*

安装依赖库

# gcc g++
apt-get install build-essential
apt-get install libtool

# pcre
sudo apt-get install libpcre3 libpcre3-dev

# zlib
apt-get install zlib1g-dev

# ssl
apt-get install openssl
apt-get install libssl-dev

安装 nginx

到nginx download上找到最新的nginx版本

# 下载
$ wget https://nginx.org/download/nginx-1.17.8.tar.gz

# 解压
$ tar -zxvf nginx-1.17.8.tar.gz

# 进入目录
$ cd nginx-1.17.8

# 配置,这里可能会报错,缺少啥就去安装啥
$ ./configure --prefix=/usr/local/nginx \
--with-http_gzip_static_module \
--with-http_v2_module \
--with-pcre \
--with-http_ssl_module

# 编译安装,这里可能会报错,缺少啥就去安装啥

$ make
$ make install

# 通过软连接,这样就可以直接使用nginx执行

sudo ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

SSL证书

SSL证书通常需要购买,也有免费的,通过第三方SSL证书机构颁发。你也可以在国内的云服务商上免费申请,(面板支持自动申请)但是一般免费的ssl证书只能支持单个域名。

这里推荐Let’s Encrypt机构,然后使用acme.sh从letsencrypt生成免费的证书,且可以生成泛域名证书。

PS:

建议使用DNS验证

–dns dns_ali是根据不同服务商来的,dns_ali就是指阿里云。其他服务商的参考How to use DNS API。

证书生成后,默认在~/.acme.sh/目录下,这里的文件是内部使用的,需要使用–installcert命令指定到目标位置

这里将证书放到了nginx的conf目录下。…/conf/ssl/…

配置http https

http https的配置很简单,完整配置如下

server {
    listen  80;
    server_name  youyifans.com  www.youyifans.com;
    return  301  https://$server_name$request_uri;
}
server {
    listen  443  ssl;
    server_name  youyifans.com  www.youyifans.com;
    ssl_certificate  ssl/fullchain.cer;
    ssl_certificate_key  ssl/youyifans.com.key;

    location / {
        root  /var/www/main;
        index  index.html;
    }
}

PS:

上面的return为301重定向(强制https),网上也有许多使用rewrite来重定向,但是return指令简单高效,建议尽量使用return

混合配置(一般面板配置)

server {
    listen  80;
    listen  443  ssl;
    server_name  youyifans.com  www.youyifans.com;
    ssl_certificate  ssl/fullchain.cer;
    ssl_certificate_key  ssl/youyifans.com.key;

    location / {
        root /var/www/main;
        index index.html;
  }
}

https 安全加密套件

https默认采用SHA-1算法,非常脆弱。我们可以使用迪菲-赫尔曼密钥交换。

我们在/conf/ssl目录下生成dhparam.pem文件

# ssh终端直接输入命令,自动生成
openssl dhparam -out dhparam.pem 2048

下面的指令ssl_protocols和ssl_ciphers是用来限制连接只包含SSL/TLS的加強版本和算法,优化提高服务器性能。

# 优先采取服务器算法
ssl_prefer_server_ciphers  on;

# 使用DH文件
ssl_dhparam  ssl/dhparam.pem;(路径不一 自己为准)

# 协议版本
ssl_protocols  TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

# 定义算法
ssl_ciphers  EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

# 启用HSTS 要求浏览器总是通过https来访问
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always;

# 减少点击劫持
add_header X-Frame-Options DENY;

# 禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;

# 防XSS攻击
add_header X-Xss-Protection 1;

# 配置共享会话缓存大小
ssl_session_cache   shared:SSL:10m;

# 配置会话超时时间
ssl_session_timeout 10m;
http2配置,只要后面增加http2。
下面[::]:表示ipv6的配置,不需要可以不加那一行
listen  80;
listen  [::]:80;
listen  443 ssl http2;
listen  [::]:443 ssl http2;

最后完整配置

server {
    listen  80;
    listen  [::]:80;
    listen  443 ssl http2;
    listen  [::]:443 ssl http2;
    server_name  youyifans.com www.youyifans.com;

    ssl_certificate  ssl/fullchain.cer;
    ssl_certificate_key  ssl/youyifans.com.key;

    ssl_session_cache  shared:SSL:10m;
    ssl_session_timeout  10m;

    ssl_prefer_server_ciphers  on;
    ssl_dhparam  ssl/dhparam.pem;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers  EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-Xss-Protection 1;

    location / {
        root /var/www/main;
        index index.html;
    }
}

配置文件优化

为了让二级域名或其他服务器的网站支持上面的功能,每个server都这么写太过于繁琐。

可以将listen 443 、ssl、add_header相关的单独写在一个conf文件上,然后使用inculde指令。

如下:其他的配置都放在conf.d/https-base.conf中

server {
    listen  8099;
    listen  [::]:8099;
    server_name  test.youyifans.com;

    include  conf.d/https-base.conf;

    location / {
        root /var/www/test;
        index index.html;
    }
}

发表评论