如何为GCP虚拟机实例的TCP端口配置HTTPS域名
解决GCP VM端口的HTTPS访问与SSL证书配置问题
核心问题梳理
- DNS仅负责解析域名到IP,不处理端口映射,
mydomain.com:26657无法访问并非DNS问题,而是服务未在对应端口提供HTTPS服务,或者浏览器的跨协议拦截机制触发了错误。 - HTTPS网站中调用HTTP接口会触发混合内容拦截(
net::ERR_SSL_PROTOCOL_ERROR本质是浏览器期望HTTPS响应,但实际收到HTTP内容),必须将接口转为HTTPS访问。
步骤1:配置域名解析到VM外部IP
确保你的域名(如mydomain.com或子域名api.mydomain.com)已通过DNS提供商解析到GCP VM的外部静态IP,DNS记录仅需填写IP,无需携带端口。
步骤2:获取免费SSL证书(Let's Encrypt)
无需从DNS提供商获取证书,使用Let's Encrypt即可免费生成,在GCP VM上执行以下操作:
- 安装Certbot工具:
sudo apt update && sudo apt install certbot -y # Debian/Ubuntu系统 # CentOS/RHEL系统执行:sudo dnf install certbot -y - 生成证书(需临时开放80端口,用于Let's Encrypt的HTTP-01验证):
按提示输入邮箱、同意条款,完成后证书会存储在sudo certbot certonly --standalone -d mydomain.com -d api.mydomain.com/etc/letsencrypt/live/mydomain.com/目录下。
步骤3:用Nginx做反向代理(端口映射+SSL终止)
由于你的服务仅在26657、1317端口提供HTTP服务,通过Nginx将标准HTTPS端口(443)转发至这两个端口,同时处理SSL加密:
- 安装Nginx:
sudo apt install nginx -y # Debian/Ubuntu系统 # CentOS/RHEL系统执行:sudo dnf install nginx -y - 创建Nginx配置文件
/etc/nginx/sites-available/mydomain.conf:server { listen 443 ssl; server_name mydomain.com; ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; # 将26657端口服务映射到/tendermint路径 location /tendermint/ { proxy_pass http://localhost:26657/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 将1317端口服务映射到/rest路径 location /rest/ { proxy_pass http://localhost:1317/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } # 自动将HTTP请求重定向到HTTPS server { listen 80; server_name mydomain.com; return 301 https://$host$request_uri; } - 启用配置并重启Nginx:
sudo ln -s /etc/nginx/sites-available/mydomain.conf /etc/nginx/sites-enabled/ sudo nginx -t # 检查配置语法是否正确 sudo systemctl restart nginx - 在GCP控制台开放80、443端口:
找到对应VM的防火墙规则,添加允许TCP 80、443端口的入站规则,来源设置为0.0.0.0/0。
步骤4:访问测试
现在可通过以下HTTPS地址访问对应服务:
https://mydomain.com/tendermint/对应原http://external_ip:26657https://mydomain.com/rest/对应原http://external_ip:1317
在你的HTTPS网站中调用这些接口,不会再触发混合内容错误。
可选:证书自动续期
设置Certbot自动续期证书,避免手动操作:
sudo systemctl enable --now certbot.timer
内容的提问来源于stack exchange,提问作者Logesh R
相关产品推荐
相关产品推荐

