nginx配置https

HTTPS,超文本传输安全协议,是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。以下将介绍如何设置https。

一、配置文件设置

这里我使用的是虚拟主机设置https

nginx.conf文件,在http中加入

include /usr/local/nginx/vhost/*.conf;

mkdir /usr/local/nginx/vhost

vim /usr/local/nginx/default.conf

server {
     listen 80;
     server_name _;
          #这里的rewrite,访问80端口强制跳转到https
     rewrite ^ https://$host$request_uri? permanent;
  }
  
server {
#    listen 443;  1.15版本后 ssl on; 这条被废弃了,开启443方式如下
    listen 443 ssl;
    server_name localhost;
    #浏览器直接重定向到https,避免中途的302重定向URL被篡改。进一步提高通信的安全性。 HSTS  max-age=31536000是指接下来一年
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    #证书存放位置
    ssl_certificate /opt/system/nginx/ssl/server.crt;
    #免密key存放位置
    ssl_certificate_key /opt/system/nginx/ssl/server.key
    #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
    ssl_prefer_server_ciphers On;
    #指定密码为openssl支持的格式
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #密码加密方式
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS;

    location / {
    #主配置文件中有upstream模块,代理后台的两个tomcat。
    proxy_pass http://backend;
        gzip on;
        gzip_min_length 40000;
        gzip_types application/javascript application/json text/css text/plain;
        client_max_body_size 5000M;
        proxy_connect_timeout 60;
        proxy_send_timeout 1000;
        proxy_read_timeout 200;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header SERVER_ADDR $server_addr;
        proxy_set_header SERVER_PORT $server_port;
        proxy_set_header REMOTE_ADDR $remote_addr;
        proxy_set_header REMOTE_PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        error_page 500 501 502 503 504 404 400 /error.html;
        location = /error.html {
        root /usr/local/nginx/html/;
}
}


二、创建ca证书

1、生成服务器私钥:

openssl genrsa -des3 -out server.key 1024

#des3是算法, -out [filename] 1024是长度,默认  会让你输入密码,不小于4个字符

2、创建签名请求的证书(CSR):

openssl req -new -key server.key -out server.csr

-new 创建一个新的证书请求文件 -key filename 指定私钥的输入文件,创建证书请求时需要 -out filename.csr 输出指定的文件名

3、在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:

cp server.key server.key.org

openssl rsa -in server.key.org -out server.key

4、最后标记证书使用上述私钥和CSR

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

5、最后会有4个文件,有用的是server.crt和server.key,放到配置文件中指定的位置即可

server.crt  server.csr  server.key  server.key.org


最后启动nginx,访问http://ip/ 会强制跳转https,这里我是代理的两个tomcat节点,所以配置文件中使用的是proxy_pass


扩展:nginx中内置变量

$args                         请求中的参数,如www.abc.com/test/hello?a=1&b=2的$args就是a=1&b=2

$document_root        Nginx虚拟主机配置文件中的root参数对应的值

$document_uri          当前请求中不包含指令的URI,如www.test.com/test/ok?a=1&b=2的document_uri就是/test/hello,不包含后面的参数

$host                        主机头,也就是域名

$http_user_agent      客户端的详细信息,也就是浏览器的标识,用curl -A可以指定

$http_cookie             客户端的cookie信息

$limit_rate                 如果Nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置,则显示0

$remote_addr           客户端的公网IP

$remote_port            客户端的端口

$request_method      请求资源的方式,GET/PUT/DELETE等

$request_filename     当前请求的资源文件的路径名称,相当于是$document_root/$document_uri的组合

$request_uri              请求的链接,包括$document_uri和$args

$scheme                   请求的协议,如ftp、http、https

$server_protocol       客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等

$server_addr             服务器IP地址

$server_name           服务器的主机名

$server_port             服务器的端口号

$uri                          和$document_uri相同

$http_referer            客户端请求时的referer,通俗讲就是该请求是通过哪个链接跳过来的