【问题标题】:Running Nginx Docker with SSL self signed certificate使用 SSL 自签名证书运行 Nginx Docker
【发布时间】:2021-12-13 14:40:01
【问题描述】:

我正在尝试使用 nginx 映像通过 Docker 运行 UI 应用程序,我可以毫无问题地访问端口 80 上的服务,但是每当我尝试通过 443 端口上的 https 访问它时,我都无法访问应用程序站点不断加载并最终导致无法访问我已更新 default.conf 中的 nginx.conf 文件以允许通过端口 443 进行访问

下面是我的 nginx.conf

charset utf-8;

server {
    listen 80;
    server_name localhost;
    root /usr/nginx/html;
}

server {
    listen 443;
    server_name localhost;
    root /usr/nginx/html; 
}

我在 /usr/nginx 文件夹中添加了 SSL 自签名证书,并通过 Dockerfile 暴露了 443 端口

以下是我的 Dockerfile

FROM nginx

COPY dist /usr/nginx/html
RUN chmod -R 777 /usr/nginx/html/*

COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY domain.crt /usr/nginx

EXPOSE 80:443
ENTRYPOINT nginx -g 'daemon off;'

谁能解释一下443端口不允许任何访问

【问题讨论】:

    标签: docker nginx ssl


    【解决方案1】:

    为了让 nginx 服务器允许 SSL 加密,您需要在 nginx.conf 中监听时提供 ssl 标志 并且只有 ssl 证书是不够的,您还需要 ssl 证书密钥和密码,并且必须配置它们

    charset utf-8;
    
    server {
        listen 80;
        server_name localhost;
        root /usr/share/nginx/html;
    }
    
    server {
        listen 443 ssl;
        ssl_certificate /usr/nginx/ssl.crt;
        ssl_certificate_key /usr/nginx/ssl.key;
        ssl_password_file /usr/nginx/ssl.pass;
        server_name localhost;
        root /usr/nginx/html;
    }
    

    如果您在 kubernetes 集群上运行容器,则需要通过卷或嵌入到 docker 容器中放置 ssl 证书、密钥和密码,通过 kubernetes 机密添加它们将是更好的选择 对于 Dockerfile,您可以添加类似

    FROM nginx
    
    COPY dist /usr/nginx/html
    RUN chmod -R 777 /usr/nginx/html/*
    
    COPY nginx.conf /etc/nginx/conf.d/default.conf
    COPY ssl.crt /usr/nginx/
    COPY ssl.pass /usr/nginx/
    COPY ssl.key /usr/nginx/
    
    EXPOSE 80:443
    ENTRYPOINT nginx -g 'daemon off;'
    

    更多信息可以参考 Nginx Docker 文章https://medium.com/@agusnavce/nginx-server-with-ssl-certificates-with-lets-encrypt-in-docker-670caefc2e31

    【讨论】:

    • 如果是通过 openssl 创建的 SSL 证书,我们是否需要提供所有三个证书、密钥和密码,因为证书和密钥将从密码生成
    • 实际上这可能是只使用密码但我之前没有做过类似的事情
    • @codeViking93:openssl 从不从密码生成密钥;它从随机数据生成密钥,并且通常使用密码加密该密钥。没有任何东西(包括 openssl)可以从密码生成证书。但是,openssl 可以将密钥和证书放在一个 nginx 可以使用的文件中(指定 ssl_certificate 并省略 ssl_certificate_key),并且 openssl 可以不加密密钥,因此您不需要任何密码文件。
    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2020-10-25
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2014-03-24
    • 2014-01-26
    相关资源
    最近更新 更多