4、HTTPS与SSL证书:为什么需要HTTPS、Let’s Encrypt免费证书申请、在HA中配置SSL证书

4.1 为什么非要折腾HTTPS?

说实话,我见过不少朋友把Home Assistant搭好之后,直接拿IP地址加端口号就开始用了。嗯,短期内确实能用,但你要知道,这就像你家大门没上锁——所有数据都是明文传输的。

HTTPS到底解决了什么问题?说白了就三点:

  • 加密传输:你从手机端发送的密码、传感器数据、自动化指令,在公网上都是加密的。没有HTTPS,这些数据就像明信片一样,沿途每个节点都能看到内容。
  • 身份验证:你访问的HA服务器到底是不是你自己的?有了SSL证书,浏览器会帮你验证。我遇到过有人被中间人攻击,登录页面被伪造,账号密码直接泄露。
  • 功能完整性:很多HA的集成组件(比如语音助手、摄像头流、某些第三方插件)强制要求HTTPS。没有它,这些功能直接罢工。

核心结论:只要你的HA需要从外网访问,HTTPS就不是可选项,而是必选项。我自己所有生产环境的HA实例,全部强制HTTPS,没有例外。

4.2 Let’s Encrypt免费证书——够用吗?

很多人一听到SSL证书,第一反应是「要花钱吧?」。其实不然。Let’s Encrypt这个项目,就是专门给大家提供免费证书的。它由Linux基金会、Mozilla、Google等机构赞助,安全级别完全够用。

我个人习惯是:能用免费的,绝不花冤枉钱。Let’s Encrypt的证书有效期是90天,但配合自动续期脚本,你根本感觉不到它的存在。

这里有个小坑:Let’s Encrypt的证书只支持域名,不支持IP地址。所以你得先有一个域名,哪怕是个免费的二级域名也行。我在项目中遇到过有人想用纯IP配HTTPS,折腾半天发现根本行不通——这是协议层面的限制。

4.3 申请证书的两种主流方式

申请Let’s Encrypt证书,最常用的工具是certbot。但针对Home Assistant的场景,我推荐两种方式:

方式 适用场景 难度
手动申请(certbot) 你有服务器SSH权限,想自己控制流程 中等
HA插件(DuckDNS / Let’s Encrypt) 你希望全自动,省心省力

我个人更推荐第二种方式,尤其是对于HA新手。为什么呢?因为HA官方插件已经把整个流程封装好了,你只需要填几个参数,剩下的它全自动搞定,包括续期。

4.4 实战:通过HA插件申请证书

好,咱们直接上手。假设你已经有了一个域名(比如 myha.duckdns.org),并且DNS已经指向了你的公网IP。

第一步:安装插件

在HA的「配置 → 加载项 → 加载项商店」中,搜索并安装「DuckDNS」插件。注意,这个插件不仅帮你做DDNS(动态域名解析),还集成了Let’s Encrypt证书申请功能。

第二步:配置插件

安装完成后,打开插件的配置页面。你会看到类似这样的配置模板:

lets_encrypt:
  accept_terms: true
  certfile: fullchain.pem
  keyfile: privkey.pem

token: your-duckdns-token-here
domains:
  - myha.duckdns.org
seconds: 300

这里有几个关键点:

  • accept_terms: true —— 同意Let’s Encrypt的服务条款,必须填。
  • token —— 你的DuckDNS令牌,在DuckDNS网站上注册域名后就能拿到。
  • domains —— 你的完整域名,注意格式。

小技巧:如果你用的是其他DNS服务商(比如阿里云、Cloudflare),HA也有对应的插件。原理都一样,只是API配置不同。我建议新手先从DuckDNS开始,它最简单,没有那么多配置项。

第三步:启动插件

保存配置后,点击「启动」。观察日志,如果看到类似这样的输出,说明证书申请成功:

[INFO] Certificate for myha.duckdns.org obtained successfully
[INFO] Certificate will expire on 2025-06-15 12:34:56

嗯,这里要注意:如果日志报错,90%的原因是域名解析没生效。你可以先手动ping一下你的域名,确认它指向了正确的IP。

4.5 在HA中配置SSL证书

证书申请好了,接下来就是让HA用上它。这一步其实很简单,因为DuckDNS插件会自动把证书文件放到HA的/ssl/目录下。

你只需要修改HA的配置文件 configuration.yaml,加入以下内容:

http:
  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem

保存后,重启HA。然后你再用 https://myha.duckdns.org:8123 访问试试——看到那个绿色的小锁图标了吗?恭喜你,HTTPS配置成功了。

重要提醒:配置SSL后,原来的HTTP访问(端口8123)仍然可用。如果你希望强制所有流量走HTTPS,可以再加一行:

http:
  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem
  use_x_forwarded_for: true
  trusted_proxies:
    - 127.0.0.1
    - ::1

但注意,如果你用了反向代理(比如Nginx),需要额外配置trusted_proxies,否则HA会拒绝来自代理的请求。

4.6 证书自动续期——别让它过期

Let’s Encrypt证书只有90天有效期。听起来很麻烦对吧?但DuckDNS插件已经内置了自动续期功能。只要插件在运行,它会在证书到期前自动重新申请。

我曾经见过有人手动申请证书,然后忘了续期,结果某天突然发现HA访问不了了。排查了半天,才发现是证书过期了。所以我的建议是:能用自动续期,就别手动折腾

如果你用的是certbot手动方式,可以设置一个cron任务:

0 3 * * * /usr/bin/certbot renew --quiet

这个任务会在每天凌晨3点检查证书是否需要续期。嗯,凌晨3点是个好时间,没人用HA,不影响体验。

4.7 避坑指南

最后,分享几个我踩过的坑:

  • 端口冲突:如果你在HA里配置了SSL,同时又用Nginx反向代理,注意不要重复绑定443端口。我建议让Nginx处理SSL,HA只监听本地HTTP端口。
  • 证书路径错误:HA的/ssl/目录是容器内的路径。如果你用的是Docker部署,记得确认挂载卷是否正确。我遇到过有人把证书放到了宿主机路径,HA容器根本读不到。
  • 混合内容警告:配置HTTPS后,如果HA页面里引用了HTTP的资源(比如某些自定义卡片加载了HTTP图片),浏览器会报「混合内容」警告。解决办法是把所有资源链接都改成HTTPS或相对路径。

好了,HTTPS和SSL证书这部分就讲到这里。说白了,配置过程并不复杂,但理解为什么需要它,比盲目操作更重要。下一章我们会聊聊反向代理——有了HTTPS打底,反向代理才能发挥它真正的威力。