Nginx 配置 SSL(HTTPS)详解

2024-06-04 6417阅读

Nginx作为一款高性能的HTTP和反向代理服务器,自然支持SSL/TLS加密通信。本文将详细介绍如何在Nginx中配置SSL,实现HTTPS的访问。

随着互联网安全性的日益重要,HTTPS协议逐渐成为网站加密通信的标配。Nginx作为一款高性能的HTTP和反向代理服务器,自然支持SSL/TLS加密通信。本文将详细介绍如何在Nginx中配置SSL,实现HTTPS的访问。

Nginx 配置 SSL(HTTPS)详解 第1张

使用Nginx进行反向代理的时候,对于正常的http;流量使用 location 块并且配置 proxy_pass 转发即可,但是如果是https的流量,使用Nginx进行反向代理的时候,直接使用 proxy_pass 会出现各种报错的情况,包括不限于:

  • 502 Bad Getway
  • ERR_SSL_PROTOCOL_ERROR
  • ERR_CONNECTION_RESET

    我本身遇到的ERR_SSL_PROTOCOL_ERROR错误比较多,这是因为在配置Nginx的时候,对于443端口本身的侦听没有带上 ssl 关键字,所以会报SSL协议错误,但是如果加上ssl,没有给证书位置,也是不行

    对于转发到8080端口,如果配置不对(比如后端服务是http,结果配置了https),会出现502 Bad Getway

    • proxy_pass后边的要写IP地址,不能写域名,否则还要解决域名解析的问题,有据称如果写localhost的,访问速度会变慢,是因为需要访问host文件解析localhost
    • 响应8080端口的server块,也要注意,也要写成侦听ssl,配置好证书位置
      upstream  plan-uat {
              server 10.202.159.74:8080 max_fails=3 fail_timeout=10 weight=1;
      }
      server {
              server_name   plan-uat.ztoky.cn;
              listen 443 ssl ;
              ssl_certificate ssl/ztoky.cn.crt;
              ssl_certificate_key ssl/ztoky.cn.key;
              access_log logs/plan-uat.ztoky.cn.access.log json;
              location /plan/ {
                 proxy_pass      http://plan-uat/;
                 include         proxy.conf;
              }
      }

      检查 linux 服务器上的 nginx 是否安装 ssl 模块

      nginx 安装目录,下面有个 sbin 文件夹,来到 sbin 目录下执行 ./nginx -V命令,注意是大写的 V,小写的 v 只会展示 nginx 的版本号信息。执行完出现下图圈红的这些信息说明 ssl 模块已经安装过了。可以忽略下文的 ssl 模块安装的相关内容,直接看 nginx 配置的内容。

      cd /usr/local/nginx/sbin
      ./nginx -V

      为 nginx 安装 ssl 模块

      如果没有安装 ssl 模块,即使你成功的配置好 https 的相关配置,网站也依旧不能使用 https,会提示诸如:无法提供安全连接、TLS协议不支持等问题。ssl 模块的安装是为了能让后端接口得以使用 https 的方式调用。找到我们的 nginx 安装解压包,我这里是放在 /usr/local/software 目录下,然后执行如下命令进入到 nginx-1.18.0 目录下。

      cd /usr/local/nginx-1.18.0

      来到 ngixn-1.18.0 目录 然后依次执行如下这命令,配置了 ssl 模块,使用 make 命令重新编译

      ./configure --with-http_ssl_module
      make

      Nginx 配置 SSL(HTTPS)详解 第2张

      进入 objs 目录,会看到 nginx 的可执行文件

      Nginx 配置 SSL(HTTPS)详解 第3张

      注意,不能使用 make install 命令,这样会导致重新安装 nginx,此时当前目录就会出现 objs 目录

      替换 nginx 可执行文件,我们使用这个新的 nginx 可执行文件 替换 sbin 目录下的 nginx 可执行文件

      cp ./nginx /usr/local/nginx/sbin/

      系统会询问你是否覆盖,输入 y 即可,如果覆盖失败,多半是因为你的 nginx 还在启动中,先将 nginx 关闭即可,再次检验是否安装 ssl 模块,进入 nginx 目录

      cd /usr/local/nginx/sbin/

      执行命令

      ./nginx -V

      此时就能看到 ssl 模块已经安装成功了

      Nginx 配置 SSL(HTTPS)详解 第4张

       准备SSL证书


      首先,我们需要准备SSL证书。你可以选择从证书颁发机构(CA)购买商业证书,也可以自己生成自签名证书。自签名证书虽然免费,但不会被浏览器信任,仅适用于测试环境。

      如果你选择购买商业证书,通常会获得以下文件:

      • 证书文件(例如:example.com.crt)
      • 私钥文件(例如:example.com.key)
      • 中间证书文件(如果有的话)

        配置Nginx SSL  启用443端口


        (1) 打开Nginx配置文件,通常位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf。

        (2) 在http块中,配置SSL相关参数。示例如下:

        http {
            ...
            
            server {
                listen 443 ssl;
                server_name example.com;
                
                ssl_certificate /path/to/example.com.crt;  # 证书文件路径
                ssl_certificate_key /path/to/example.com.key;  # 私钥文件路径
                
                # 如果有中间证书,也需要配置
                ssl_trusted_certificate /path/to/intermediate.crt;
                
                # 其他SSL配置参数
                ssl_session_cache    shared:SSL:1m;
                ssl_session_timeout  5m;
                ssl_protocols TLSv1.2 TLSv1.3;  # 支持的协议版本
                ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL;  # 使用此加密套件
                ssl_prefer_server_ciphers on;  # 优先使用服务器端的加密套件
                
                # 其他server配置...
            }
            
            ...
        }
        测试HTTPS访问

        现在,你的Nginx服务器已经配置了SSL,可以通过HTTPS协议访问了。在浏览器中输入https://example.com,检查是否能够成功访问并显示安全的连接标识(如绿色锁头)。

        此外,你还可以使用命令行工具(如openssl或curl)来测试HTTPS连接和证书的有效性。

        配置代理


        使用proxy_pass指令来配置代理。以下是一个示例配置,将HTTPS请求代理到另一个HTTPS服务器:(注意这里的后端是HTTPS的服务)

        后端服务是https类型的  proxy_pass https://your.backend.server;

        后端服务是http类型的    proxy_pass http://your.backend.server;

        server {
          # 监听443端口,处理所有HTTPS请求
          listen 443 ssl;
          server_name your.domain.com;
          # SSL配置 
          ssl_certificate /path/to/your/cert.pem;
          ssl_certificate_key /path/to/your/private.key;
          ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
          ssl_ciphers HIGH:!aNULL:!MD5;
          # 代理配置,将HTTPS请求代理到另一个HTTPS服务器
          location / {
            proxy_pass https://your.backend.server;
          }
        }

        以上配置假设您的域名是your.domain.com,代理目标是您的后端HTTPS服务器(例如https://your.backend.server)。请记住将路径和参数适当地配置为您的特定场景。 


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]