Nginx配置并兼容HTTP实现代码解析
使用OpenSSL生成SSLKey和CSR文件
配置HTTPS要用到私钥example.key文件和example.crt证书文件,申请证书文件的时候要用到example.csr文件,OpenSSL命令可以生成example.key文件和example.csr证书文件。
CSR:CerificateSigningRequest,证书签署请求文件,里面包含申请者的DN(DistinguishedName,标识名)和公钥信息,在第三方证书颁发机构签署证书的时候需要提供。证书颁发机构拿到CSR后使用其根证书私钥对证书进行加密并生成CRT证书文件,里面包含证书加密信息以及申请者的DN及公钥信息
Key:证书申请者私钥文件,和证书里面的公钥配对使用,在HTTPS『握手』通讯过程需要使用私钥去解密客戶端发來的经过证书公钥加密的随机数信息,是HTTPS加密通讯过程非常重要的文件,在配置HTTPS的時候要用到
使用OpenSSl命令可以在系统当前目录生成example.key和example.csr文件:
opensslreq-new-newkeyrsa:2048-sha256-nodes-outexample_com.csr-keyoutexample_com.key-subj"/C=CN/ST=ShenZhen/L=ShenZhen/O=ExampleInc./OU=WebSecurity/CN=example.com"
下面是上述命令相关字段含义:
- C:Country,单位所在国家,为两位数的国家缩写,如:CN就是中国
- ST字段:State/Province,单位所在州或省
- L字段:Locality,单位所在城市/或县区
- O字段:Organization,此网站的单位名称;
- OU字段:OrganizationUnit,下属部门名称;也常常用于显示其他证书相关信息,如证书类型,证书产品名称或身份验证类型或验证内容等;
- CN字段:CommonName,网站的域名;
生成csr文件后,提供给CA机构,签署成功后,就会得到一個example.crt证书文件,SSL证书文件获得后,就可以在Nginx配置文件里配置HTTPS了。
配置HTTPS
基础配置
要开启HTTPS服务,在配置文件信息块(serverblock),必须使用监听命令listen的ssl参数和定义服务器证书文件和私钥文件,如下所示:
server{ #ssl参数 listen443ssl; server_nameexample.com; #证书文件 ssl_certificateexample.com.crt; #私钥文件 ssl_certificate_keyexample.com.key; ssl_protocolsTLSv1TLSv1.1TLSv1.2; ssl_ciphersHIGH:!aNULL:!MD5; #... }
证书文件会作为公用实体發送到每台连接到服务器的客戶端,私钥文件作为安全实体,应该被存放在具有一定权限限制的目录文件,并保证Nginx主进程有存取权限。
私钥文件也有可能会和证书文件同放在一個文件中,如下面情況:
ssl_certificatewww.example.com.cert;
ssl_certificate_keywww.example.com.cert;
这种情況下,证书文件的的读取权限也应该加以限制,仅管证书和私钥存放在同一个文件里,但是只有证书会被发送到客戶端
命令ssl_protocols和ssl_ciphers可以用来限制连接只包含SSL/TLS的加強版本和算法,默认值如下:
ssl_protocolsTLSv1TLSv1.1TLSv1.2;
ssl_ciphersHIGH:!aNULL:!MD5;
由于这两个命令的默认值已经好几次发生了改变,因此不建议显性定义,除非有需要额外定义的值,如定义D-H算法:
#使用DH文件
ssl_dhparam/etc/ssl/certs/dhparam.pem;
ssl_protocolsTLSv1TLSv1.1TLSv1.2;
#定义算法
ssl_ciphers"EECDH+ECDSA+AESGCMEECDH+aRSA+AESGCMEECDH+ECDSA+SHA384EECDH+ECDSA+SHA256EECDH+aRSA+SHA384EECDH+aRSA+SHA256EECDH+aRSA+RC4EECDHEDH+aRSA!aNULL!eNULL!LOW!3DES!MD5!EXP!PSK!SRP!DSS!RC4";
#...
HTTP强制转HTTPS
另外配置一个server块,监听80端口,再加上rewrite。
server{ listen80; server_name服务器ip; rewrite^(.*)$https://$host$1permanent;#http强制转https }
server配置参考
server{ listen80; server_name服务器ip; rewrite^(.*)$https://$host$1permanent;#http强制转https } server{ charsetutf-8;#服务器编码 listen443ssl;#监听地址 server_name服务器ip;#证书绑定的网站域名 server_tokensoff;#隐藏nginx版本号 #ssl配置 ssl_certificate/etc/ssl/certs/nginx-selfsigned.crt;#证书公钥 ssl_certificate_key/etc/ssl/private/nginx-selfsigned.key;#证书私钥 ssl_session_timeout5m; ssl_ciphersSHA256: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-SHA384; ssl_protocolsTLSv1TLSv1.1TLSv1.2; ssl_prefer_server_ciphersoff; ssl_dhparam/etc/nginx/dhparams.pem; #请求头 add_headerStrict‐Transport‐Securitymax‐age=63072000; add_headerX-Frame-OptionsSAMEORIGIN; add_headerContent-Security-Policy"default-src'self'http:https:data:blob:'unsafe-inline'"always; add_headerX-Content-Type-Optionsnosniff;add_headerX-XSS-Protection"1;mode=block"; add_headerStrict-Transport-Security"max-age=31536000;includeSubdomains;"; add_headerSet-Cookie"HttpOnly"; add_headerSet-Cookie"Secure"; #请求方法限制 ##Onlyallowtheserequestmethods## if($request_method!~^(GET|POST|DELETE|PUT|PATCH)$){ return444; } #访问路径匹配 location/{ root/usr/share/nginx/html;#站点目录 indexindex.htmlindex.htm; } location/test/{ proxy_passhttp://127.0.0.1:8100/;#转发本地端口8100 } #禁止访问路径 #location/dirdeny{ #denyall; #return403; #} #错误页面配置 error_page502503504/error502.html; location=/error502.html{ root/usr/share/nginx/html; } error_page500/error.html; location=/error.html{ root/usr/share/nginx/html; } error_page404/notfind.html; location=/notfind.html{ root/usr/share/nginx/html; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。