Home Assistant 开启HTTPS访问

前言

为了使用小爱同学控制我的移动空调前段时间安装了一个Home Assistant ,只是简单用用的话这样到此为止也可以,不过为了随处访问我给它绑定域名做了DDNS,比较可惜的是这么一搞问题就出现了,我的其它二级域名都加了SSL证书,可以进行https访问,这个没有加SSL证书的Home Assistant因为缓存的问题就只能在浏览器的无痕模式中打开。在捣鼓的过程中参考了下边两篇文章,但都不太符合我的情况,我最终选择了使用Nginx反向代理来实现,因为前段时间搭建PhotoPrism的时候我也是这么做的,可谓驾轻就熟。

Home Assistant配置https访问 - 哔哩哔哩 (bilibili.com)

为Home Assistant 开启HTTPS访问 - 天雨的博客 - Masterain (irain.in)

在看下边的内容之前需要明确一些需要注意的点:

  • Home Assistant是Docker搭建的
  • 服务器环境内有Nginx,最好有个宝塔
  • 提前申请了SSL证书并上传到服务器中
  • Home Assistant搭建完成可以使用DDNS正常访问

上传 SSL 证书

下边两个就是上传好的SSL证书,我这边使用的是宝塔免费申请的Let's Encrypt通配符证书,文件中内容是我自己新建文本文件从其它地方复制过来的,需要注意后缀名为crt和key,之后记好两个文件的绝对路径就可以。

图片[1] - Home Assistant 开启HTTPS访问 - 登山亦有道
图片[2] - Home Assistant 开启HTTPS访问 - 登山亦有道

配置NGINX反向代理

如果只是PhotoPrism下边的配置加到NGINX的配置文件中并重启就可以了,可惜今天搞的是Home Assistant,这个过程已经经过验证,并不怎么顺畅,简单来说会有两个坑。尤其是第二个,很少有人提到。

    server {
        listen 80;
        server_name 你的域名;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        server_name 你的域名;
        client_max_body_size 500M;

        ssl_certificate /root/data/photo/photoprism.crt; #SSL证书路径
        ssl_certificate_key /root/data/photo/photoprism.key; #SSL证书路径

        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://127.0.0.1:8123;# 确保指向 Home Assistant
            proxy_redirect off;
            client_max_body_size 500M;
        }
    }
图片[3] - Home Assistant 开启HTTPS访问 - 登山亦有道

配置HA反向代理白名单

第一个比较坑的点是HA的反向代理有白名单设置,需要将NGINX反向代理服务的网段添加到白名单配置中,不然会出现 400 bad request 的错误,页面无法访问。 全部配置完毕之后需要重启HA使其生效。配置文件的路径在你容器的根目录,名为:configuration.yaml

图片[4] - Home Assistant 开启HTTPS访问 - 登山亦有道

# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:

# Text to speech
tts:
  - platform: google_translate

group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

#从此处开始添加,上边的是默认存在的
http:
  use_x_forwarded_for: True
  trusted_proxies:
    - 127.0.0.1
    - 172.17.0.1  
    - 192.168.2.1 #根据容器日志中被屏蔽的 IP 添加

到了这一步反向代理的配置就初步成功了,可以通过https访问Home Assistant的登录界面,不过别急着高兴,还有一个坑在等着呢。输入用户名和密码之后点击登录你会发现页面上提示Unable to connect to Home Assistant.Retrying in 59 seconds...

最终的NGINX配置文件

使用http登录会发现有这样Login attempt or request with invalid authentication from 49.64.212.241 (49.64.212.241). See the log for details.或这样的提示:Login attempt or request with invalid authentication from 192.168.2.1 (192.168.2.1). See the log for details.~~~这个错误信息表明从 IP 地址 49.64.212.241/192.168.2.1 发起的登录尝试或请求存在无效的认证。为了安全起见,我们需要确保没有未经授权的访问,并且正确配置了 Home Assistant 的反向代理和认证设置。和Chatgpt缠斗了几个小时始终都是那么几句话,让我确认Home Assistant 配置和Nginx 配置,而这些我已经确认了很多次,可以完全保证没有问题,关于这些我也和Chatgpt说过,最后很明确的告诉它证书没问题,完全复制上边提供的配置问题依旧,这次情况发生了一些扭转,它提供了一份稍微有些不一样的NGINX配置文件:

server {
    listen 80;
    server_name 你的域名;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name 你的域名;

    ssl_certificate /root/data/photo/photoprism.crt;#SSL证书路径
    ssl_certificate_key /root/data/photo/photoprism.key;#SSL证书路径

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://127.0.0.1:8123;  # 确保指向 Home Assistant
        proxy_redirect off;

        # 添加以下行以增强调试
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Connection '';
    }

    # 可选:为 WebSocket 连接配置
    location /api/websocket {
        proxy_pass http://127.0.0.1:8123/api/websocket;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

复制粘贴重启然后它就好了,经过实验起关键作用的正是它在配置文件中注释了#可选:为 WebSocket 连接配置下边的那段代码,我注释解注释尝试了几次才最终确定。神奇的是这段配置的生效无需重启NGINX服务。

图片[7] - Home Assistant 开启HTTPS访问 - 登山亦有道

最后的最后我又问了它一个问题:为什么我之前提问了那么多次都没加这个配置?
Chatgpt:可能是因为在讨论中没有专门提到 WebSocket 配置的重要性,或者在问题分析时没有明确指出需要处理的具体内容。WebSocket 在 Home Assistant 中用于处理实时事件和状态更新,漏掉这个配置确实会导致连接问题。

© 版权声明
THE END
喜欢就支持一下吧
点赞2001赞赏 分享
评论 晨岩, 粽叶加米, 秋风于渭水, 天一生水, 网友小宋, 叶小明的博客, wmbk等人在此发表了11条热情洋溢的评论
匿名的头像 - 登山亦有道
提交
匿名的头像 - 登山亦有道

昵称

在 WordPress 上使用 Sticker Heo 增添互动时的乐趣吧 !

取消
昵称表情代码图片
    • 粽叶加米的头像 - 登山亦有道
      粽叶加米 Windows Chrome 127.0.0.0
      • 晨岩的头像 - 登山亦有道
        晨岩 Windows Edge 127.0.0.0
    • 网友小宋的头像 - 登山亦有道
      网友小宋 Windows Edge 127.0.0.0
    • 叶小明的博客的头像 - 登山亦有道
      叶小明的博客 Windows Chrome 122.0.6261.95
      • 天一生水的头像 - 登山亦有道
        天一生水 Windows Chrome 109.0.0.0
        • 晨岩的头像 - 登山亦有道
          晨岩 Windows Edge 127.0.0.0
      • 晨岩的头像 - 登山亦有道
        晨岩 Windows Edge 127.0.0.0
    • wmbk的头像 - 登山亦有道
      wmbk Windows Chrome 126.0.0.0
      • 秋风于渭水的头像 - 登山亦有道
        秋风于渭水 Windows Chrome 126.0.0.0
      • 晨岩的头像 - 登山亦有道
        晨岩 Windows Edge 127.0.0.0