`

nginx配置ssl加密(单双向认证、部分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来代替,效果是一样的,达到免密码重启的效果:

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 $scheme,在jsp页面使用request.getScheme()得到的是https 。如果不把请求的$scheme协议设置在header里,后端jsp页面会一直认为是http,将导致响应异常。

  • ssl配置块还有个与不加密的80端口类似的location /,它的作用是当用户直接通过https访问首页时,自动跳转到不加密端口,你可以去掉它允许用户这样做。

 

3. 实现双向ssl认证


上面的两种配置都是去认证被访问的站点域名是否真实可信,并对传输过程加密,但服务器端并没有认证客户端是否可信。(实际上除非特别重要的场景,也没必要去认证访问者,除非像银行U盾这样的情况)

要实现双向认证HTTPS,nginx服务器上必须导入CA证书(根证书/中间级证书),因为现在是由服务器端通过CA去验证客户端的信息。还有必须在申请服务器证书的同时,用同样的方法生成客户证书。取得客户证书后,还要将它转换成浏览器识别的格式(大部分浏览器都认识PKCS12格式):

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 [$address] $variable { … },位于http段,默认地址是$reoute_addr,假设 conf/geo.conf 内容:

127.0.0.1/32    LOCAL;  # 本地
172.29.73.23/32 SEAN;   # 某个IP
172.29.73.0/24  1;      # IP段,可以按国家或地域定义后面的不同的值

 

需要配置另外一个虚拟主机server{ssl 445},里面使用上面双向认证的写法,然后在80或443里使用变量$duplexing_user去判断,如果为1就rewrite到445,否则rewrite到443。具体用法可以参考nginx geo使用方法。

 

分享到:
评论

相关推荐

    详解Nginx SSL快速双向认证配置(脚本)

    **Nginx SSL双向认证配置详解** 在网络安全日益重要的今天,服务器与客户端之间的通信安全成为了一个不可忽视的问题。本文将详细介绍如何在Nginx服务器上配置SSL双向认证,以提高服务器的安全性,允许只有经过验证...

    nginx环境下配置ssl加密(单双向认证、部分https)

    在Nginx环境下配置SSL加密主要涉及单向认证、双向认证以及部分HTTPS页面加密。SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)是用于在网络上提供加密和数据完整性校验的...

    linux nginx双向认证服务搭建

    本文将详细介绍如何在Linux环境下搭建基于Nginx的双向认证服务,并结合Tomcat实现SSL加密,旨在为Web应用提供更高级别的安全保障。 #### 二、准备工作 在正式开始之前,我们需要准备以下几项工作: 1. **系统环境...

    nginx配置ssl双向验证的方法

    在Nginx服务器中配置SSL双向验证,也称为Mutual TLS(Transport Layer Security),意味着不仅服务器需要验证客户端的身份,客户端也需要验证服务器的身份。这种方式提供了更高的安全性,特别是在处理敏感数据时。...

    nginx实现http双向验证.docx

    总之,Nginx 实现 HTTP 双向验证是通过配置 SSL/TLS 扩展,使用自签名或受信任的 CA 签名的服务器和客户端证书来增强安全性的。此过程涉及证书的生成、验证和配置,以及客户端的信任设置,对于保护敏感数据传输和...

    使用Nginx实现HTTPS双向验证的方法

    在Nginx中开启SSL/TLS支持并设置双向验证,需要在配置文件中指定服务器端证书和私钥的路径,同时启用SSL/TLS的客户端证书验证功能,配置服务器信任的CA证书文件,以验证客户端证书的合法性。 关于HTTPS握手过程,...

    nginx config reverse proxy for windows.pdf

    Nginx 配置反向代理实现 WebSocket + SSL 访问 Nginx 是一个流行的开源 Web 服务器软件,可以用于反向代理、负载均衡、静态文件服务等多种应用场景。反向代理(Reverse Proxy)是一种常用的网络架构模式,通过使用...

    nginx-1.17.3.rar

    9. **SSL/TLS增强**:可能包含了对最新加密标准的支持,如TLS 1.3,以提供更强大的数据传输保护。 10. **日志和监控**:Nginx的访问日志和错误日志功能可以帮助管理员监控服务器状态和性能,新版本可能优化了日志...

    国密SSL的wireshark解析脚本gmssl-wireshark-main.zip

    例如,它能解析出SM2非对称加密算法用于密钥交换,SM3用于消息认证码(MAC)的生成,以及SM4用于数据块的对称加密。 2. 显示过滤器:通过定制的显示过滤器,用户可以快速筛选出国密SSL的特定类型流量,如查找所有...

    NGINX 宣布支持 gRPC,可在下个版本 1.13.10 中使用1

    若要在内部网络中也加密gRPC通信,服务器应用需要配置为监听加密(grpcs)连接,而NGINX配置中的`proxy_protocol`应相应调整。 7. **路由gRPC流量**: 当有多个gRPC服务时,NGINX可以基于服务名和方法名进行路由...

    nginx教程.doc

    10. **HTTPS支持**:介绍如何配置Nginx以支持SSL/TLS,实现HTTPS加密通信。 11. **安全配置**:讲解如何配置Nginx以增强服务器的安全性,包括抵御DDoS攻击、限制请求速率等。 ### 第五部分:高级应用 12. **...

    nginx-1.6.2

    - **SSL卸载**:Nginx可以在反向代理层处理SSL/TLS加密,减轻后端服务器的计算负担。 **2. 负载均衡** Nginx的负载均衡功能使得它能够智能地分发流量到不同的服务器,确保系统高可用性和性能。负载均衡策略包括: ...

    opesnssl证书配置和使用1

    4. **SSL双向/单向认证**:双向认证要求客户端和服务器都需验证对方的身份,而单向认证只需服务器验证客户端。openssl可以通过不同的命令行选项来实现这两种认证模式。 5. **导入证书**:生成的证书需要导入到...

    Nginx教程从入门到精通

    6. **SSL/TLS安全**:Nginx支持HTTPS协议,可以配置SSL证书,实现网站的加密通信,保障数据传输的安全性。 7. **URL重写**:Nginx的rewrite模块可以对URL进行重写,实现友好的URL设计,提升用户体验和SEO效果。 8....

    nginx-1.17.7.zip

    这可能包括SSL/TLS协议的更新,以支持更安全的加密套件和防止中间人攻击。 4. **配置语法增强**:Nginx的配置文件语法可能有所改进,提供更灵活的配置选项,比如新的指令或者现有指令的扩展。 5. **反向代理和负载...

    一种基于Python+Nginx架构的双向CA系统设计与实现.pdf

    机顶盒与前端系统之间的通信采用SSL协议进行加密认证,确保数据在传输过程中不被窃听或篡改。 系统中的数据库采用主从架构,由Master服务器和Slave从服务器组成,以提高数据库服务器的吞吐量和安全性能。机顶盒只能...

    实战Nginx:取代Apache的高性能Web服务器

    8. 高度的定制性:Nginx通过其配置文件提供了极高的定制性,包括控制文件描述符的数量、内存使用、缓存设置、负载均衡策略和SSL/TLS加密等。 9. 安全性:Nginx提供了多样的安全措施,如限制IP访问、HTTP基本认证、...

    Gmssl两种证书demo

    GMSSL(Great Wall Secure Sockets Layer)是中国自主研发的加密套接层协议,旨在提供与SSL/TLS类似的网络安全服务,但更符合中国的加密法规和标准。本教程将详细讲解GMSSL的两种证书类型及其生成流程。 一、GMSSL...

Global site tag (gtag.js) - Google Analytics