nginx 配置ssl 实现https
来源:互联网 发布:knn算法 matlab 编辑:程序博客网 时间:2024/05/16 07:19
转载:http://seanlook.com/2015/05/28/nginx-ssl/
背景
项目组突然出现一起事故 ,所有的页面无法访问,崩溃了。。
经排查是证书问题
排查方法:
查看线上配置-证书所在文件
root@:/opt/nginx# cd ssl_certificate/root@bq1:/opt/nginx/ssl_certificate# lsatlasyun.net.crt pubu.im.key qiniu.com.key qiniu.io.keyatlasyun.net.key qiniu.com.crt qiniu.com.key.bak staticfile.org.crtpubu.im.crt qiniu.com.crt.bak qiniu.io.crt staticfile.org.keyroot@bq1:/opt/nginx/ssl_certificate#
root@bq1:/opt/nginx/conf# pwd/opt/nginx/confroot@bq1:/opt/nginx/conf# lsfastcgi.conf init.sh mime.types scgi_params win-utffastcgi.conf.default koi-utf mime.types.default scgi_params.defaultfastcgi_params koi-win nginx.conf uwsgi_paramsfastcgi_params.default _md5 nginx.conf.default uwsgi_params.defaultroot@bq1:/opt/nginx/conf# cat nginx.confuser nobody nogroup;error_log logs/error.log;pid logs/nginx.pid;worker_processes auto;worker_rlimit_nofile 10240;events { use epoll; worker_connections 10240;}http { include mime.types; default_type application/octet-stream; # builtin server server { listen 127.0.0.1:80; server_name localhost; location /nginxstatus { access_log off; stub_status on; allow 127.0.0.1; deny all; } } # default http log configs log_format main '$remote_addr\t$remote_user\t[$time_local]\t"$request"\t' '$request_length\t$status\t$bytes_sent\t$body_bytes_sent\t' '"$http_referer"\t"$http_user_agent"\t"$http_x_forwarded_for"\t' '$upstream_addr\t$host\t$upstream_http_x_reqid\t$upstream_response_time\t' '$request_time\t$http_x_from_cdn\t$upstream_cache_status\t' '$upstream_http_x_k_appid\t$upstream_http_x_from_pod\t$upstream_http_x_qiniu_root_cause'; access_log logs/access.log main; # default http limit conn configs limit_conn_zone $http_host zone=servicelimit:10m; limit_conn_zone $http_host zone=limitspeed:50m; limit_conn_log_level error; limit_req_zone $binary_remote_addr zone=one:50m rate=2r/s; # default http ssl configs ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; ssl_prefer_server_ciphers on; # default http gzip configs gzip on; gzip_types text/plain text/css text/javascript text/xml application/x-javascript application/json application/xml application/xml+rss application/javascript; # default http core configs # See http://nginx.org/en/docs/http/ngx_http_core_module.html. client_max_body_size 1024m; client_body_buffer_size 512K; client_body_temp_path /disk1/nginx 3 2; sendfile on; tcp_nopush off; keepalive_timeout 65s; # default http proxy configs # See http://nginx.org/en/docs/http/ngx_http_proxy_module.html. proxy_buffers 64 4k; proxy_buffer_size 32k; # include extra configs (relative to prefix/conf/nginx.conf) include /opt/nginx/sites-enabled/qbox.me/*.conf; include /opt/nginx/sites-enabled/qcos.net/*.conf;}root@bq1:/opt/nginx/conf#
于是乎,打算学习一番,找到了这篇文章,很赞 ��
“nginx配置ssl加密(单双向认证、部分https)“
nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番。一开始采用的是全站加密,所有访问http:80的请求强制转换(rewrite)到https,后来自动化测试结果说响应速度太慢,https比http慢慢30倍,心想怎么可能,鬼知道他们怎么测的。所以就试了一下部分页面https(不能只针对某类动态请求才加密)和双向认证。下面分节介绍。
默认nginx是没有安装ssl模块的,需要编译安装nginx时加入–with-http_ssl_module选项。
关于SSL/TLS原理请参考 这里,如果你只是想测试或者自签发ssl证书,参考 这里 。
提示:nignx到后端服务器由于一般是内网,所以不加密。
1. 全站ssl
全站做ssl是最常见的一个使用场景,默认端口443,而且一般是单向认证。
server { listen 443; server_name example.com; root /apps/www; index index.html index.htm; ssl on; ssl_certificate ../SSL/ittest.pem; ssl_certificate_key ../SSL/ittest.key;# ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;# ssl_prefer_server_ciphers on;}
如果想把http的请求强制转到https的话:
server { listen 80; server_name example.me; rewrite ^ https://$server_name$request_uri? permanent;### 使用return的效率会更高 # return 301 https://$server_name$request_uri;}
ssl_certificate证书其实是个公钥,它会被发送到连接服务器的每个客户端,ssl_certificate_key私钥是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。当然私钥和证书可以放在一个证书文件中,这种方式也只有公钥证书才发送到client。
ssl_protocols指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。
ssl_ciphers选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher ‘RC4:HIGH:!aNULL:!MD5’(后面是你所指定的套件加密算法) 来看所支持算法。
ssl_prefer_server_ciphers on设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
https优化参数
ssl_session_cache shared:SSL:10m; : 设置ssl/tls会话缓存的类型和大小。如果设置了这个参数一般是shared,buildin可能会参数内存碎片,默认是none,和off差不多,停用缓存。如shared:SSL:10m表示我所有的nginx工作进程共享ssl会话缓存,官网介绍说1M可以存放约4000个sessions。 详细参考serverfault上的问答ssl_session_cache。
ssl_session_timeout : 客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h。
设置较长的keepalive_timeout也可以减少请求ssl会话协商的开销,但同时得考虑线程的并发数了。
提示:在生成证书请求csr文件时,如果输入了密码,nginx每次启动时都会提示输入这个密码,可以使用私钥来生成解密后的key来代替,效果是一样的,达到免密码重启的效果:
1
openssl rsa -in ittest.key -out ittest_unsecure.key
导入证书
如果你是找一个知名的ssl证书颁发机构如VeriSign、Wosign、StartSSL签发的证书,浏览器已经内置并信任了这些根证书,如果你是自建C或获得二级CA授权,都需要将CA证书添加到浏览器,这样在访问站点时才不会显示不安全连接。各个浏览的添加方法不在本文探讨范围内。
2. 部分页面ssl
一个站点并不是所有信息都是非常机密的,如网上商城,一般的商品浏览可以不通过https,而用户登录以及支付的时候就强制经过https传输,这样用户访问速度和安全性都得到兼顾。
但是请注意不要理解错了,是对页面加密而不能针对某个请求加密,一个页面或地址栏的URL一般会发起许多请求的,包括css/png/js等静态文件和动态的java或php请求,所以要加密的内容包含页面内的其它资源文件,否则就会出现http与https内容混合的问题。在http页面混有https内容时,页面排版不会发生乱排现象;在https页面中包含以http方式引入的图片、js等资源时,浏览器为了安全起见会阻止加载。
下面是只对example.com/account/login登录页面进行加密的栗子:
root /apps/www;index index.html index.htm;server { listen 80; server_name example.com; location ^~ /account/login { rewrite ^ https://$server_name:443$request_uri? permanent; } location / { proxy_pass http://localhost:8080; ### Set headers #### proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; }}server { listen 443 ssl; server_name example.com; ssl on; ssl_certificate ../SSL/ittest.pem; ssl_certificate_key ../SSL/ittest.key; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; location ^~ /account/login { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; ### Most PHP, Python, Rails, Java App can use this header -> https ### proxy_set_header X-Forwarded-Proto $scheme; } location / { rewrite ^ http://$server_name$request_uri? permanent; }}
关于rewrite与location的写法参考这里。当浏览器访问http://example.com/account/login.xx时,被301到https://example.com/account/login.xx,在这个ssl加密的虚拟主机里也匹配到/account/login,反向代理到后端服务器,后面的传输过程是没有https的。这个login.xx页面下的其它资源也是经过https请求nginx的,登录成功后跳转到首页时的链接使用http,这个可能需要开发代码里面控制。
上面配置中使用了proxy_set_header X-Forwarded-Proto
ssl配置块还有个与不加密的80端口类似的location /,它的作用是当用户直接通过https访问首页时,自动跳转到不加密端口,你可以去掉它允许用户这样做。
3. 实现双向ssl认证
上面的两种配置都是去认证被访问的站点域名是否真实可信,并对传输过程加密,但服务器端并没有认证客户端是否可信。(实际上除非特别重要的场景,也没必要去认证访问者,除非像银行U盾这样的情况)
要实现双向认证HTTPS,nginx服务器上必须导入CA证书(根证书/中间级证书),因为现在是由服务器端通过CA去验证客户端的信息。还有必须在申请服务器证书的同时,用同样的方法生成客户证书。取得客户证书后,还要将它转换成浏览器识别的格式(大部分浏览器都认识PKCS12格式):
1
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
然后把这个client.p12发给你相信的人,让它导入到浏览器中,访问站点建立连接的时候nginx会要求客户端把这个证书发给自己验证,如果没有这个证书就拒绝访问。
同时别忘了在 nginx.conf 里配置信任的CA:(如果是二级CA,请把根CA放在后面,形成CA证书链)
proxy_ignore_client_abort on; ssl on; ... ssl_verify_client on; ssl_verify_depth 2; ssl_client_certificate ../SSL/ca-chain.pem;# 在双向location下加入: proxy_set_header X-SSL-Client-Cert $ssl_client_cert;
拓展:使用geo模块
nginx默认安装了一个ngx_http_geo_module,这个geo模块可以根据客户端IP来创建变量的值,用在如来自172.29.73.0/24段的IP访问login时使用双向认证,其它段使用一般的单向认证。
geo $duplexing_user { default 1; include geo.conf; # 注意在0.6.7版本以后,include是相对于nginx.conf所在目录而言的}
语法 geo [
127.0.0.1/32 LOCAL; # 本地172.29.73.23/32 SEAN; # 某个IP172.29.73.0/24 1; # IP段,可以按国家或地域定义后面的不同的值
需要配置另外一个虚拟主机server{ssl 445},里面使用上面双向认证的写法,然后在80或443里使用变量$duplexing_user去判断,如果为1就rewrite到445,否则rewrite到443。具体用法可以参考nginx geo使用方法。
- nginx 配置ssl 实现https
- Nginx配置SSL实现Https访问
- nginx配置SSL(https)
- nginx配置SSL启用HTTPS
- Nginx配置SSL证书实现访问HTTPS网站
- nginx配置ssl证书实现https和http共存访问
- Nginx下配置网站ssl实现https访问
- 自签SSL证书实现Nginx配置https双向认证
- Nginx下配置网站ssl实现https访问
- 腾讯云服务器申请SSL证书, 配置Nginx, 实现HTTPS
- nginx配置ssl双向验证 nginx https ssl证书配
- nginx配置实现https
- ssl/https配置与实现
- Linux 下Nginx SSL/HTTPS 配置
- Nginx 配置 SSL 证书 + HTTPS 站点小记
- Nginx + https + 免费SSL证书配置指南
- Nginx 配置 SSL 证书 + HTTPS 站点
- nginx使用ssl模块配置HTTPS支持
- 教你如何恢复iPhone上删除的数据及iCloud和iTunes备份
- Jeesite单点登录集成Cas另加自定义登录验证
- Project rule not found--C++ Builder上位机
- 3种web会话管理方式
- 【数据结构】单链表插入算法
- nginx 配置ssl 实现https
- 单品种的对应表
- Sublime text3中配置Github
- 前端性能优化(JavaScript篇)
- Flume(ng) 自定义sink实现和属性注入
- Java中加载配置文件
- 216. Combination Sum III
- adb使用之查看手机内部文件
- vm2