Nginx加密与上游服务器的TCP网络通信

本文介绍了如何保护NGINX和TCP上游服务器或TCP服务器上游组之间的TCP通信。

先决条件

  • NGINX Plus R6和更高版本或使用--with-streamwith-stream_ssl_module配置参数编译的最新NGINX开源
  • 代理TCP服务器或TCP服务器的上游组
  • SSL证书和私钥

获取SSL服务器证书

首先,您将需要获取服务器证书和私钥,并将它们放在上游服务器或上游组中的每台服务器上。可以从可信证书颁发机构(CA)获得证书,也可以使用SSL库(例如OpenSSL)生成证书。

当需要加密NGINX与上游服务器之间的连接时,将使用自签名服务器证书。但是,这些连接很容易受到中间人攻击:冒名顶替者可以冒充上游服务器,而NGINX不会知道它正在与假服务器通信。如果获得了由可信CA签名的服务器证书(可以使用OpenSSL创建自己的内部CA),则可以将NGINX配置为仅信任由该CA签名的证书。这使攻击者更难模仿上游服务器。

获取SSL客户端证书

NGINX可以使用SSL客户端证书向上游服务器标识自己。此客户端证书必须由受信任的CA签名,并与相应的私钥一起存储在NGINX上。

您将需要配置上游服务器,以要求所有传入的SSL连接都需要客户端证书,并信任将客户端证书颁发给NGINX的CA。然后,当NGINX连接到上游时,它将提供其客户端证书,而上游服务器将接受它。

配置NGINX

在NGINX配置文件中,将该proxy_ssl指令包括server在该stream级别的块中:

stream {server {...proxy_pass backend;proxy_ssl  on;}
}

然后指定上游服务器所需的SSL客户端证书的路径以及证书的私钥:

server {...proxy_ssl_certificate     /etc/ssl/certs/backend.crt;proxy_ssl_certificate_key /etc/ssl/certs/backend.key;
}

(可选)您可以指定使用哪些SSL协议和密码:

server {...proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;proxy_ssl_ciphers   HIGH:!aNULL:!MD5;
}

如果您使用由CA颁发的证书,则还应包含该proxy_ssl_trusted_certificate指令,以将该文件命名为包含用于验证上游安全证书的受信任CA证书的文件。该文件必须为PEM格式。(可选)包括proxy_ssl_verifyproxy_ssl_verfiy_depth指令,以使NGINX检查安全证书的有效性:

server {...proxy_ssl_trusted_certificate /etc/ssl/certs/trusted_ca_cert.crt;proxy_ssl_verify       on;proxy_ssl_verify_depth 2;
}

每个新的SSL连接都需要在客户端和服务器之间进行完整的SSL握手,这会占用大量CPU。要让NGINX代理先前协商过连接参数并使用所谓的缩写握手,请包含以下proxy_ssl_session_reuse指令:

proxy_ssl_session_reuse on;

完整的例子

stream {upstream backend {server backend1.example.com:12345;server backend2.example.com:12345;server backend3.example.com:12345;}server {listen     12345;proxy_pass backend;proxy_ssl  on;proxy_ssl_certificate         /etc/ssl/certs/backend.crt;proxy_ssl_certificate_key     /etc/ssl/certs/backend.key;proxy_ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;proxy_ssl_ciphers             HIGH:!aNULL:!MD5;proxy_ssl_trusted_certificate /etc/ssl/certs/trusted_ca_cert.crt;proxy_ssl_verify        on;proxy_ssl_verify_depth  2;proxy_ssl_session_reuse on;}
}

在此示例中,proxy_ssl伪指令指定了NGINX转发到上游服务器的TCP通信的安全。

当安全的TCP连接第一次从NGINX传递到上游服务器时,将执行完整的握手过程。上游服务器要求NGINX出示proxy_ssl_certificate指令中指定的安全证书。的proxy_ssl_protocolsproxy_ssl_ciphers,其协议和密码被用于指令控制。

下次NGINX将连接传递到上游时,由于该proxy_ssl_session_reuse指令,会话参数将被重用,并且安全的TCP连接建立得更快。

proxy_ssl_trusted_certificate指令命名的文件中的受信任CA证书用于在上游服务器上验证证书。该proxy_ssl_verify_depth伪指令指定检查证书链中的两个证书,并且该proxy_ssl_verify伪指令验证证书的有效性。

要了解有关NGINX Plus的更多信息,请参阅我们的商业订阅。

Nginx加密与上游服务器的TCP网络通信相关推荐

  1. Nginx配置与上游服务器的长链接

    可以通过keep-alive指令配置长链接数量 upstream backend{server 192.168.61.1:9080 weight=1;server 192.168.61.1:9090 ...

  2. Linux:Nginx高并发之服务器最大TCP连接数及调优汇总(转载)

    Linux TCP连接数优化及调优 启动线程数: 启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU内核数 最佳启动线程数和CPU内核数量成正比,和IO阻塞时间成反比.如果任务都是C ...

  3. Nginx使用HTTPS建立与上游服务器的网络通信

    Nginx使用HTTPS建立与上游服务器的网络通信 本文介绍了如何加密NGINX与上游组或代理服务器之间的HTTP通信. 先决条件 NGINX开源或NGINX Plus 甲代理服务器或服务器的上游组 ...

  4. 基于TCP网络通信的自动升级程序源码分析-客户端接收文件

    升级程序客户端接收文件 /// <summary>/// 文件数据缓存 索引是 ConnectionInfo对象 数据包的顺序号 值是数据/// </summary>Dicti ...

  5. Nginx设置TCP上游服务器的SSL配置

    Nginx设置TCP上游服务器的SSL配置 本文介绍了如何为NGINX Plus和接受TCP连接的负载均衡的服务器组设置SSL 什么是SSL终端 SSL终端意味着NGINX Plus充当与客户端连接的 ...

  6. Nginx:12---反向代理之(代理模块,代理单个上游服务器)

    一.反向代理介绍 反向代理应该是 Nginx 做的最多的一件事了,什么是反向代理呢,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网 ...

  7. 上游服务器响应无效怎么办,Nginx 当上游服务器返回失败时的处理办法

    95 Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 |ht ...

  8. Nginx网络配置当中的备份上游服务器以及不可用上游服务器

    备份上游服务器 upstream backend{server 192.168.61.1:9080 weight=1;server 192.168.61.1:9090 weight=2 backup; ...

  9. NGINX怎样隐藏上游错误?

    原文作者:陶辉 原文链接: NGINX怎样隐藏上游错误? 转载来源:NGINX开源社区 当上游出错时,作为负载均衡的NGINX可以实时更换Server,在客户端无感知的情况下重新转发HTTP请求.这一 ...

最新文章

  1. Linux01-基本操作与Shell
  2. winform 界面 xml化_FlinkSQL 1.11 on Zeppelin平台化实践
  3. oracle 常用sql
  4. s5pv210启动debian出错提示bash: cannot set terminal process group (-1): Inappropriate ioctl for device...
  5. 使用阿里云CentOS安装LAMP时,安装PHP扩展需要注意的事情
  6. 从小白到大神程序员必读15本经典电子书免费送第三季(先到先得)
  7. 智能路由器-OpenWRT 系列五 (NAS-SMB家庭共享)
  8. JMM和底层实现原理
  9. leetcode647. 回文子串(动态规划)
  10. Python天天美味(21) - httplib,smtplib
  11. .NET BackgroundWorker的一般使用方式
  12. 一元三次方程重根判别式_一元四次方程的常规解法
  13. main在c语言中的作用,main函数在C语言中是怎么定义的?有什么作用?
  14. 云之讯-》返回码105147
  15. ESlint 配置从0到1 (二)
  16. Chrome 的人都需要知道的「神器」扩展:「油猴」使用详解
  17. 自定义控件属性英文类别
  18. 【5G手机漏接电话问题解决方式】
  19. DBeaver 连接 人大金仓以及其他国产数据库
  20. 怎么把磁盘合并成一个?两个硬盘分区合并,如何硬盘分区合并

热门文章

  1. 你们的2016年前端学习计划是什么?
  2. Linux Shell脚本入门教程系列之(十)Shell for循环
  3. HTML5 Geolocation API : 实时跟踪应用
  4. Swift中文教程(十八) 类型检查
  5. 各平台安装Node.js
  6. HTML 5 canvas 基本语法
  7. php 读取或导出到Excel / CSV (附utf8、gbk 编码转换)
  8. NOSL redis安装部署 lnmp+redis
  9. 【CVPR2019】论文完整列表一
  10. sqlserver无法连接到服务器的常见原因和解决办法