Nginx配置HTTPS并兼容HTTP(强制转发)
使⽤ OpenSSL ⽣成 SSL Key 和 CSR ⽂件
配置 HTTPS 要⽤到私钥 example.key ⽂件和 证书⽂件,申请证书⽂件的时候要⽤到 example.csr ⽂件,OpenSSL命令可以⽣成 example.key ⽂件和 example.csr 证
书⽂件。
CSR:Cerificate Signing Request,证书签署请求⽂件,⾥⾯包含申请者的 DN(Distinguished Name,标识名)和公钥信息,在第三⽅证书颁发机构签署证书的时候需要
提供。证书颁发机构拿到 CSR 后使⽤其根证书私钥对证书进⾏加密并⽣成 CRT 证书⽂件,⾥⾯包含证书加密信息以及申请者的 DN 及公钥信息
Key:证书申请者私钥⽂件,和证书⾥⾯的公钥配对使⽤,在 HTTPS 『握⼿』通讯过程需要使⽤私钥去解密客⼾端发來的经过证书公钥加密的随机数信息,是 HTTPS 加
密通讯过程⾮常重要的⽂件,在配置 HTTPS 的時候要⽤到
使⽤OpenSSl命令可以在系统当前⽬录⽣成 example.key 和 example.csr ⽂件:
1openssl req -new -newkey rsa:2048 -sha256 -nodes -out example_com.csr -keyout example_com.key -subj "/C=CN/ST=ShenZhen/L=ShenZhen/O=Example Inc./OU=Web Security/CN=example"
下⾯是上述命令相关字段含义:
C:Country ,单位所在国家,为两位数的国家缩写,如: CN 就是中国
ST 字段: State/Province ,单位所在州或省
L 字段: Locality ,单位所在城市 / 或县区
O 字段: Organization ,此⽹站的单位名称;
OU 字段: Organization Unit,下属部门名称;也常常⽤于显⽰其他证书相关信息,如证书类型,证书产品名称或⾝份验证类型或验证内容等;
CN 字段: Common Name ,⽹站的域名;
⽣成 csr ⽂件后,提供给 CA 机构,签署成功后,就会得到⼀個 证书⽂件,SSL 证书⽂件获得后,就可以在 Nginx 配置⽂件⾥配置 HTTPS 了。
配置 HTTPS
基础配置
要开启 HTTPS 服务,在配置⽂件信息块(server block),必须使⽤监听命令listen的 ssl 参数和定义服务器证书⽂件和私钥⽂件,如下所⽰:
server {
nginx 配置文件#ssl参数
listen              443 ssl;
server_name        example;
#证书⽂件
ssl_certificate    ;
#私钥⽂件
ssl_certificate_key example.key;
ssl_protocols      TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers        HIGH:!aNULL:!MD5;
#...
}
证书⽂件会作为公⽤实体發送到每台连接到服务器的客⼾端,私钥⽂件作为安全实体,应该被存放在具有⼀定权限限制的⽬录⽂件,并保证 Nginx 主进程有存取权限。
私钥⽂件也有可能会和证书⽂件同放在⼀個⽂件中,如下⾯情況:
ssl_certificate    ;
ssl_certificate_;
这种情況下,证书⽂件的的读取权限也应该加以限制,仅管证书和私钥存放在同⼀个⽂件⾥,但是只有证书会被发送到客⼾端
命令ssl_protocols和ssl_ciphers可以⽤来限制连接只包含 SSL/TLS 的加強版本和算法,默认值如下:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
由于这两个命令的默认值已经好⼏次发⽣了改变,因此不建议显性定义,除⾮有需要额外定义的值,如定义 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 !3D #...
HTTP强制转HTTPS
另外配置⼀个server块,监听80端⼝,再加上rewrite。
server {
listen  80;
server_name 服务器ip;
rewrite ^(.*)$  $host$1 permanent; #http强制转https
}
server配置参考
server {
listen  80;
server_name 服务器ip;
rewrite ^(.*)$  $host$1 permanent; #http强制转https
}
server {
charset utf-8;              #服务器编码
listen 443 ssl;            #监听地址
server_name 服务器ip;  #证书绑定的⽹站域名
server_tokens off;          #隐藏nginx版本号
#ssl配置
ssl_certificate  /etc/ssl/;  #证书公钥
ssl_certificate_key  /etc/ssl/private/nginx-selfsigned.key;    #证书私钥
ssl_session_timeout 5m;
ssl_ciphers  SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SH    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers off;
ssl_dhparam /etc/nginx/dhparams.pem;
#请求头
add_header Strict‐Transport‐Security max‐age=63072000;
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;    add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
add_header Set-Cookie "HttpOnly";
add_header Set-Cookie "Secure";
#请求⽅法限制
## Only allow these request methods ##
if ($request_method !~ ^(GET|POST|DELETE|PUT|PATCH)$ ) {
return 444;
}
#访问路径匹配
location / {
root /usr/share/nginx/html; #站点⽬录
index index.html index.htm;
}
location /test/ {
proxy_pass 127.0.0.1:8100/; #转发本地端⼝8100
}
#禁⽌访问路径
# location /dirdeny {
#    deny all;
#    return 403;
#}
#错误页⾯配置
error_page    502 503 504  /error502.html;
location = /error502.html{
root /usr/share/nginx/html;
}
error_page    500 /error.html;
location = /error.html{
root /usr/share/nginx/html;
}
error_page    404 /notfind.html;
location = /notfind.html{
root /usr/share/nginx/html;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。