运维专题.Docker+Nginx服务器的SSL证书安装

运维专题 Docker+Nginx服务器的SSL证书安装



【介绍】:在宿主机上集中管理和在每个Docker容器内单独管理SSL证书,每种方法都有其优缺点,但对于大多数生产环境而言,在宿主机上集中管理SSL证书通常是更优的选择。本文针对于这种方案进行了具体草果过程的介绍。

目 录


  • [1. 概述](#1. 概述)
  • [2. 证书的获取与存放](#2. 证书的获取与存放)
  • [3. 在宿主机中安装证书](#3. 在宿主机中安装证书)
  • [4. 配置为反向代理到容器](#4. 配置为反向代理到容器)
    • [1 确保SSL证书已正确安装](#1 确保SSL证书已正确安装)
    • [2 配置Nginx作为反向代理](#2 配置Nginx作为反向代理)
    • [3 重启Nginx服务](#3 重启Nginx服务)
    • [4. 验证你的配置](#4. 验证你的配置)
  • [5. 结论](#5. 结论)

[1. 概述](#1. 概述)

在现代的网络架构中,确保通信的安全性已经成为了一个不可或缺的要求。SSL证书的安装和配置,特别是在使用 DockerNginx 的环境中,是保护数据传输,防止中间人攻击的重要手段。本文将详细介绍如何在Docker容器化的环境中,配合 Nginx 服务器,获取、存放以及配置 SSL 证书,以确保Web应用的安全通信。

首先,我们将探讨如何获取SSL证书并决定其在系统中的存放位置。随后,我们将详细说明在宿主机上安装和配置SSL证书的步骤,包括如何在Nginx配置文件中引用这些证书文件,以及如何设置 HTTPHTTPS 的自动跳转,以增强 Web 应用的安全性。

此外,我们还将讨论 SSL 证书在 Docker 容器化环境中的管理策略,包括在宿主机上集中管理 SSL 证书与在每个 Docker 容器内单独管理 SSL 证书的利弊。最后,我们将介绍如何配置 Nginx 作为反向代理,将加密的 HTTPS 流量正确地路由到后端的 Docker 容器,从而完成对Web应用安全性的全面加固。

[2. 证书的获取与存放](#2. 证书的获取与存放)

[2.1 购买和下载SSL证书](#2.1 购买和下载SSL证书)

首先你需要现在华为云、阿里云等等云服务提供商上购买一个SSL证书:

对于个人完整可以使用 **DV (Basic)**成本更低。

然后,下载到本地,比如阿里云,登录数字证书管理服务控制台。:

在左侧导航栏,单击SSL 证书。

在SSL 证书页面,定位到目标证书,在操作列,单击下载。

在服务器类型为Nginx的操作列,单击下载。

解压缩已下载的SSL证书压缩包

CSR生成方式 证书压缩包包含的文件
系统生成选择已有的CSR 证书文件(PEM格式):Nginx支持安装PEM格式的文件,PEM格式的证书文件是采用Base64编码的文本文件,且包含完整证书链。解压后,该文件以证书ID_证书绑定域名命名。私钥文件(KEY格式):默认以证书绑定域名命名。
手动填写 如果您填写的是通过数字证书管理服务控制台创建的CSR,下载后包含的证书文件与系统生成 的一致。如果您填写的不是通过数字证书管理服务控制台创建的CSR,下载后只包括证书文件(PEM格式),不包含证书密码或私钥文件。您可以通过证书工具,将证书文件和您持有的证书密码或私钥文件转换成所需格式。转换证书格式的具体操作,请参见证书格式转换

[2.2 讨论:在哪里存放证书?](#2.2 讨论:在哪里存放证书?)

Q:假设云服务器宿主机中有多个Docker容器,包含多个容器运行着不同的服务(前端和后端),并且每个容器都有自己的Nginx实例。那么证书放在哪里呢?

A:如何处理SSL证书取决于你的具体架构和安全需求。

在宿主机上的Nginx中安装证书?

如果你在宿主机上运行了一个 Nginx 实例,用作反向代理来处理来自外部的请求并将其转发到相应的容器,那么在这个 Nginx 实例上安装 SSL 证书是最合适的。这种方法的优点是:

集中管理 SSL 证书:你只需要在一个地方(宿主机上的 Nginx )配置和更新 SSL 证书。

  • 安全性 :宿主机上的 Nginx 作为入口点,可以提供额外的安全层,如SSL终端和 HTTPHTTPS 的重定向。

  • 性能SSL 终端发生在宿主机上,减轻了容器内 Nginx 的负担。

    要在宿主机上的Nginx中安装证书,你可以遵循阿里云文档中的步骤,将证书文件放在宿主机的某个目录下,并在Nginx配置文件中指向这些文件。

在每个Docker容器中安装证书?

如果你没有在宿主机上运行Nginx实例,而是让每个容器都有自己的Nginx来处理SSL,那么你需要在每个需要SSL的容器中安装证书。这种方法的优点是:

灵活性:每个服务可以独立管理自己的SSL证书,这在处理多个域名时特别有用。

隔离性:服务之间的SSL配置完全独立,增加了配置的灵活性。

要在Docker容器中安装证书,你可以:

  1. 创建一个包含证书的Docker卷,并在启动容器时将其挂载到容器内的适当位置。
  2. 在Dockerfile中添加证书,将证书文件复制到镜像中,这样每个容器实例都会包含这些证书文件。
  3. 使用Docker Secret或类似机制(如果你使用Docker Swarm或Kubernetes)来安全地管理和存储证书。

推荐做法!

对于大多数生产环境,在宿主机上的Nginx中安装证书通常是更好的选择,因为它简化了证书管理,并提供了一个集中的点来处理安全性和性能优化。你可以将宿主机上的Nginx配置为反向代理,根据请求的不同将流量路由到不同的容器

无论哪种方法,确保你的SSL证书私钥文件 安全,避免在源代码管理系统(如Git)中暴露这些敏感文件。

[3. 在宿主机中安装证书](#3. 在宿主机中安装证书)

远程服务器,登陆Docker容器。在宿主机安装Nginx服务器:

sh 复制代码
apt update
apt upgrade
apt install nginx -y

在Nginx配置目录下新建证书文件夹:

sh 复制代码
mkdir /etc/nginx/cert

然后将证书文件和私钥文件上传到Nginx服务器的证书目录(/etc/nginx/cert)。

编辑Nginx配置文件nginx.conf,修改与证书相关的配置:

sh 复制代码
vim /etc/nginx/nginx.conf

在nginx.conf中定位到server属性配置。(vim中,使用"/"输入文本可以用于定位),如果(新版)初始化没有注释掉的模板server字段也可以自己输入。

conf 复制代码
server {
     #HTTPS的默认访问端口443。
     #如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
     listen 443 ssl;
     
     #填写证书绑定的域名
     server_name <yourdomain>;
 
     #填写证书文件绝对路径
     ssl_certificate cert/<cert-file-name>.pem;
     #填写证书私钥文件绝对路径
     ssl_certificate_key cert/<cert-file-name>.key;
 
     ssl_session_cache shared:SSL:1m;
     ssl_session_timeout 5m;
	 
     #自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
     #TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
     ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

     #表示优先使用服务端加密套件。默认开启
     ssl_prefer_server_ciphers on;
 
 
    location / {
           root html;
           index index.html index.htm;
    }
}

设置HTTP请求自动跳转HTTPS(如果需要)。

conf 复制代码
server {
    listen 80;
    #填写证书绑定的域名
    server_name <yourdomain>;
    #将所有HTTP请求通过rewrite指令重定向到HTTPS。
    rewrite ^(.*)$ https://$host$1;
    location / {
        index index.html index.htm;
    }
}

重启Nginx服务。

sh 复制代码
ngixn -s stop
nginx -c /etc/nginx/nginx.conf

或者直接;

sh 复制代码
nginx -s reload

验证SSL证书是否配置成功

证书安装完成后,您可通过访问证书的绑定域名验证该证书是否安装成功。

[4. 配置为反向代理到容器](#4. 配置为反向代理到容器)

为了配置Nginx作为反向代理,并确保容器化的Web应用通过SSL证书安全地处理HTTPS请求,您需要按照以下步骤操作:

1 确保SSL证书已正确安装

首先,确保您已按照前面的步骤在宿主机的Nginx服务器上安装并配置了SSL证书。这包括证书文件(.pem)和私钥文件(.key)的正确放置,以及Nginx配置文件(nginx.conf)中对这些文件的正确引用。

2 配置Nginx作为反向代理

接下来,您需要修改Nginx的配置文件,以将HTTPS请求代理到后端的Docker容器。这通常涉及到在Nginx的配置文件中添加一个新的server块,专门用于处理加密的HTTPS流量,并将其转发到正确的容器。

打开Nginx配置文件(例如,/etc/nginx/nginx.conf),并添添加加或修改一个server块,如下所示:

conf 复制代码
server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/nginx/cert/your-cert-file.pem;
    ssl_certificate_key /etc/nginx/cert/your-cert-file.key;

    # 其他SSL配置...

    location / {
        # 假设您的Docker容器在本地端口8080上运行
        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_set_header X-Forwarded-Proto $scheme;
    }
}

3 重启Nginx服务

修改配置文件后,您需要重启Nginx服务以应用这些更改。可以使用下面的命令:

sh 复制代码
ngixn -s stop
nginx -c /etc/nginx/nginx.conf

或者如果你的Nginx已经启动,则可以直接运行命令:

sh 复制代码
nginx -s reload

4. 验证你的配置

最后,通过访问您的域名(https://yourdomain.com)来测试配置是否正确。如果一切配置正确,您的请求应该会通过HTTPS安全地被代理到后端的Docker容器,并且浏览器不会显示安全警告。

通过以上步骤,您可以确保您的Docker容器化的Web应用能够安全地处理HTTPS请求,同时利用Nginx作为反向代理来增强安全性和性能。

[5. 结论](#5. 结论)

在当今的网络环境中,确保Web应用的通信安全十分重要。通过在Docker和Nginx的环境中正确安装和配置SSL证书,我们不仅能够保护数据传输过程中的安全,防止潜在的中间人攻击,还能够提升用户对网站的信任度。本文详细介绍了获取SSL证书、决定证书存放位置、在宿主机上安装和配置SSL证书的步骤,以及如何将Nginx配置为反向代理,确保HTTPS流量能够正确路由到后端的Docker容器。

相关推荐
西贝爱学习2 分钟前
【软件】nginx-1.28.0安装包(Windows版)
运维·nginx
z2023050812 分钟前
linux之 remoteproc 内核实现源码分析
linux·运维·服务器
阿方索24 分钟前
shell脚本
linux·运维
嗨丶王哪跑35 分钟前
网络安全审计技术原理与应用
运维·网络·安全·web安全
斯普信专业组36 分钟前
Skywalking从部署集成到动态调优(上)
运维·skywalking·动态调优
斯普信专业组38 分钟前
Skywalking从部署集成到动态调优(下)
运维·skywalking·动态调优
zrande1 小时前
Nginx 负载均衡通用方案
nginx·负载均衡
西瓜er1 小时前
Docker 一键部署指南:GitLab、Nacos、Redis、MySQL 与 MinIO 全解析
redis·docker·gitlab
要站在顶端2 小时前
Jenkins 使用容器运行自动化任务详细文档
docker·自动化·jenkins