
在生产与开发环境中,HTTPS 映射(把外网 HTTPS 请求映射到内部服务)是非常常见的需求:将域名/端口/路径映射到不同后端、在边界做 TLS 终止、或把外部证书分发到内网服务。正确的映射设计既要保证安全(证书链、SNI、ALPN),又要兼顾可运维性(自动续期、路由规则、健康检查)。下面从实战角度讲清常见方案、配置要点、容易踩的坑以及如何在 iOS 真机上验证这些映射。
NGINX(TLS 终止 + SNI)
# 默认server用于HTTP->HTTPS重定向
server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}
# HTTPS 使用 SNI 匹配不同域名
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
location / { proxy_pass http://10.0.0.10:8080; proxy_set_header Host $host; }
}
server {
listen 443 ssl http2;
server_name admin.example.com;
ssl_certificate /etc/letsencrypt/live/admin.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/admin.example.com/privkey.pem;
location / { proxy_pass http://10.0.0.11:8080; }
}
HAProxy(TLS Passthrough + SNI 路由)
frontend ft_https
bind :443
mode tcp
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend bk_api if { req_ssl_sni -i api.example.com }
use_backend bk_admin if { req_ssl_sni -i admin.example.com }
backend bk_api
mode tcp
server s1 10.0.0.10:443
backend bk_admin
mode tcp
server s2 10.0.0.11:443
选择 TLS 终止还是透传要看是否需要**后端认证客户端证书(mTLS)**或后端做 Pinning 验证。
openssl s_client -connect host:443 -servername host 检查返回证书。ssl_protocols、ssl_ciphers。proxy_set_header Host $host),否则路由/签名会失败。HTTPS 映射既包括网络层的端口/路由映射,也强关联 TLS 层(SNI、证书、ALPN)。设计映射策略时应先明确是否需要终止 TLS、是否要保留端到端加密,以及如何集中管理证书。遇到 iOS 真机或高安全性 App 抓包难题时,Sniffmaster(抓包大师) 能作为工程化的补充工具,帮助你在不修改 App 的前提下验证映射是否生效并排查握手层问题。把映射、证书管理与验证流程标准化,会显著降低线上故障排查成本。
