You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在nginx:alpine镜像中配置ACM私有证书?解决HTTPS不安全问题

使用ACM私有证书配置Nginx容器后浏览器显示「不安全」的排查方案

我用启用SSL的nginx:alpine Docker镜像部署React应用,采用AWS Certificate Manager(ACM)私有证书。已经从ACM导出了私钥、证书、证书链和根CA文件,网站能通过HTTPS加载,但浏览器始终显示「不安全」,不确定是Nginx证书配置还是证书处理环节出了问题。

已执行的操作:

  • 使用aws acm export-certificate命令从ACM导出域名证书、私钥和证书链;
  • 按需合并证书并复制到Docker镜像中;
  • 将ACM的根CA证书添加到受信任CA列表;
  • 配置Nginx通过这些证书以HTTPS提供站点服务。

当前使用的Dockerfile

# Use an official Nginx image to serve the React app
FROM nginx:alpine

# Copy the build folder contents into the Nginx server's root directory
COPY build/ /usr/share/nginx/html/

# Copy AWS private certs - SSL certificate, private key, and chain to the container
COPY cert/certificate.crt /etc/nginx/ssl/certificate.crt
COPY cert/decrypted-key.pem /etc/nginx/ssl/private-key.pem
COPY cert/certificate-chain.crt /etc/nginx/ssl/certificate-chain.crt

# Copy the AWS private CA root certificate into the image
COPY cert/root-ca.crt /usr/local/share/ca-certificates/root-ca.crt
# Update CA certificates in the image
RUN update-ca-certificates

# Set the correct permissions for SSL certificates and private key
RUN chmod 600 /etc/nginx/ssl/private-key.pem \
    && chmod 644 /etc/nginx/ssl/certificate.crt \
    && chmod 644 /etc/nginx/ssl/certificate-chain.crt \
    && chmod 600 /usr/local/share/ca-certificates/root-ca.crt

# Copy the custom nginx.conf to the correct location
COPY nginx.conf /etc/nginx/nginx.conf

# Expose both HTTP and HTTPS ports
EXPOSE 80
EXPOSE 443

# Start Nginx
CMD ["nginx", "-g", "daemon off;"]

排查方向及解决方案

1. 证书链配置错误

Nginx的ssl_certificate需要使用域名证书+完整证书链的合并文件,单独的域名证书无法让浏览器完成完整的信任链验证。

操作步骤:

  1. 本地合并证书:
cat cert/certificate.crt cert/certificate-chain.crt > cert/full-chain.crt
  1. 修改Dockerfile中的复制命令:
COPY cert/full-chain.crt /etc/nginx/ssl/full-chain.crt
  1. 在nginx.conf的HTTPS server块中更新配置:
ssl_certificate /etc/nginx/ssl/full-chain.crt;
ssl_certificate_key /etc/nginx/ssl/private-key.pem;

2. 客户端浏览器未信任私有CA根证书

容器内更新CA证书仅影响容器自身的信任列表,浏览器的信任体系是独立的。必须手动将ACM私有CA的根证书添加到浏览器的受信任根CA存储区,否则浏览器会因无法验证证书来源而标记为不安全。

操作:

  • 导出root-ca.crt文件;
  • 打开浏览器的证书管理界面,将该证书导入到「受信任的根证书颁发机构」分类下。

3. 证书域名不匹配

检查证书的Subject Alternative Name(SAN)是否包含你实际访问的域名:

openssl x509 -in cert/certificate.crt -text -noout | grep -A 10 "Subject Alternative Name"

如果访问域名不在SAN列表中,浏览器会直接判定证书无效。

4. Nginx SSL配置不完整

确保nginx.conf中包含安全的SSL协议和加密套件配置,避免因弱加密导致的浏览器警告:

server {
    listen 443 ssl;
    server_name your-domain.com;

    ssl_certificate /etc/nginx/ssl/full-chain.crt;
    ssl_certificate_key /etc/nginx/ssl/private-key.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # 其他站点相关配置
    location / {
        root /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
    }
}

5. 证书链有效性验证

用OpenSSL工具验证本地证书链是否完整:

openssl verify -CAfile cert/root-ca.crt -untrusted cert/certificate-chain.crt cert/certificate.crt

返回OK则说明证书链有效;若报错,检查证书文件是否导出完整,或中间证书是否缺失。

内容的提问来源于stack exchange,提问作者Fezekile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:12:36