Heroku启用自动证书管理仍无法使用HTTPS且报SSL错误求助
从你给出的heroku certs:auto输出能明显看出问题:自动生成的SSL证书只覆盖了www.xxxxxxxx.com,但你大概率是直接访问不带www的裸域(比如xxxxxxxxx.com),或者你的域名解析没把两个域名都正确绑定到Heroku,导致浏览器检测到证书域名和访问域名不匹配,才抛出SSL_ERROR_BAD_CERT_DOMAIN错误。下面是分步解决的方法:
1. 先确认访问域名与证书的匹配性
直接在浏览器输入https://www.xxxxxxxx.com试试,如果能正常访问HTTPS,那说明问题就是裸域没被证书覆盖,接下来按后续步骤配置即可。
2. 让Heroku同时为裸域和www子域生成证书
Heroku的自动SSL(ACM)支持同时覆盖两个域名,但需要先把两个域名都添加到你的应用:
- 打开终端执行:
heroku domains:add xxxxxx.com # 替换成你的裸域 heroku domains:add www.xxxxxx.com # 如果还没添加过的话 - 然后刷新证书:
heroku certs:auto:refresh
等待5-10分钟,让Let's Encrypt重新颁发包含两个域名的证书,之后再执行heroku certs:auto,查看通用名称(Common Name(s))是否同时显示两个域名。
3. 修正GoDaddy的DNS解析配置
这一步是关键,GoDaddy的DNS设置容易踩坑:
- www子域:添加/修改CNAME记录,记录值指向你的Heroku应用域名(格式类似
yourappname.herokuapp.com) - 裸域:GoDaddy不支持裸域的CNAME记录,你有两个选择:
- 若GoDaddy支持ALIAS记录(部分账户有这个选项),直接设置ALIAS指向你的Heroku应用域名
- 否则添加A记录,值填Heroku的官方IP:
50.16.241.37、50.16.241.38、50.16.241.39、50.16.241.40(可以通过dig yourappname.herokuapp.com获取最新IP)
注意:用A记录的话,Heroku的IP可能会变动,所以更推荐用ALIAS或者直接把裸域301重定向到www子域
4. 验证DNS生效
修改DNS后,可能需要等待1-24小时生效(快的话几分钟),可以用终端执行nslookup xxxxxx.com或者dig xxxxxx.com,确认解析结果指向Heroku的IP或域名。
5. 完善Rails的HTTPS跳转配置
除了config.force_ssl = true,还可以在config/environments/production.rb里添加规则,强制所有请求跳转到正确的HTTPS域名:
# 示例:把裸域请求跳转到www子域 config.middleware.insert_before 0, Rack::Rewrite do r301 %r{.*}, 'https://www.xxxxxx.com$&', if: Proc.new { |rack_env| rack_env['SERVER_NAME'] == 'xxxxxx.com' && rack_env['HTTP_X_FORWARDED_PROTO'] == 'https' } end
这样配置后,不管用户访问裸域还是www子域,都会被引导到有有效SSL证书的地址,就不会再出现证书域名不匹配的错误了。
内容的提问来源于stack exchange,提问作者Ulas

