如何通过Nginx在HTTPS下运行Streamlit应用并解决证书错误?
解决Nginx反向代理Streamlit子域名证书错误问题
问题原因
你遇到的net::ERR_CERT_COMMON_NAME_INVALID错误,核心是当前使用的domain.crt证书没有包含streamlit.domain.com这个子域名。浏览器验证证书时,会检查证书的通用名称(CN)或主题备用名称(SAN)是否匹配访问的域名,不匹配就会判定证书无效。
解决方案
1. 先确认当前证书的覆盖范围
执行以下命令查看证书详情:
openssl x509 -in /etc/nginx/sites-available/domain.crt -text -noout
重点看两个部分:
Subject字段里的CN=值,是否是streamlit.domain.com或通配符*.domain.comX509v3 Subject Alternative Name里,是否列出了streamlit.domain.com
如果这两个地方都没有这个子域名,必须重新申请包含该子域名的证书。
2. 重新申请适配子域名的证书
以常用的Let's Encrypt免费证书为例,用certbot工具申请:
- 如果只需要给
streamlit.domain.com单独申请证书:
certbot certonly --nginx -d streamlit.domain.com
- 如果想让一个证书同时覆盖主域名和子域名:
certbot certonly --nginx -d domain.com -d streamlit.domain.com
执行命令后,certbot会自动验证域名所有权,并生成对应证书,默认存储路径是/etc/letsencrypt/live/[你的域名]/。
3. 更新Nginx配置并重启服务
修改Nginx配置里的证书路径,替换成新生成的证书:
server { listen 443 ssl http2; server_name streamlit.domain.com; # 替换成新证书的路径 ssl_certificate /etc/letsencrypt/live/streamlit.domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/streamlit.domain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:8501/; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; } }
保存配置后,重启Nginx生效:
systemctl restart nginx
4. 额外检查项
- 确认
streamlit.domain.com的DNS解析已经指向服务器公网IP,且TTL已生效(可以用nslookup streamlit.domain.com验证) - 检查Nginx配置里的
server_name是否拼写正确,和子域名完全一致
内容的提问来源于stack exchange,提问作者Danessely
相关产品推荐
相关产品推荐

