Home Assistant(Hass.io)をSSL対応にする

2017年12月13日Home AssistantLinux, Home Assistant, Apache, SSL, Duck DNS

Home Assistantは、デフォルトでは8123ポートで動作をする。しかし、これではGoogle Assistant(Google Home)など連携することが出来ないため、443ポート/httpsで動作をするように設定を変更しなくてはならない。

hass.ioを導入しているなら、アドオンの設定だけでhttpsへの対応を行うことが可能だ。今回はその方法と、hass.ioのアドオンを使用しない方法のふたつを説明していこう。

なお、どちらの手順を踏むにせよ、はじめにルーターの443ポートがHome Assistantをインストールしたサーバーに向いているよう設定しておくことが必要。

Hass.ioを用いる場合

Hass.ioを使う方法は、あえて簡単に書く。というのも、「Hass.io」を使っている場合、ほとんどの人は既存のサーバーにDockerイメージを走らせて運用しており、Hass.ioで設定するよりもベースのサーバーで設定をしたほうが簡単だからだ。

「DuckDNS」を有効にする

「DuckDNS」は、フリーで提供されているDDNSサービスである。DDNSサービスとは、簡単に言えば静的IPアドレスであっても自動的にそれをドメインと紐付けてくれることを指していて、IPアドレスが変化しても「****.duckdns.org」で自サイトにアクセス出来るようにしてくれる。

まず、公式のサイトに行く。

Duck DNS
Duck DNS free dynamic DNS hosted on Amazon VPC

すると、右上に「ログイン」があるので、ここからログインしよう。

add-domain

その後、上記のように中央に「add domain」という部分があるので、好きなサブドメイン(****の部分)を入力し、「add domain」をクリックする。

token

ドメインを作成したあと、上の部分に「token」というものが表示されている。今後これが重要となってくるので、控えておこう。

Hass.io(Home Assistant)で設定する

まず、「Hass.io」から右上の買い物ボタンをクリックし、「Duck DNS」アドオンを有効にする。
すると、「Options」という部分があるので、ここに次の通り入力をする。

{
  "lets_encrypt": {
    "accept_terms": true,
    "certfile": "fullchain.pem",
    "keyfile": "privkey.pem"
  },
  "token": "先ほどのトークン",
  "domains": ["設定したドメイン"],
  "seconds": 300
}

これで「START」をクリックすると、Duck DNSが有効となる。

ためしに、取得したアドレスでアクセスをしてほしい。すると、次のような画面になると思う。

not-private

これは、Duck DNSでのアクセスは成功しているものの、正式な証明書がインストールされていないために表示される。
そこで、Let’s Encryptを使用して正式な証明書をインストールする。

Home AssistantにLet’s Encryptアドオンを入れる

ふたたびHome Assistantに戻り、「Hass.io」から右上の買い物ボタンをクリック、「Let’s Encrypt」へと進もう。
そして、「Install」をクリックする。

Optionsには、次のように記載をしよう。

{
  "challenge": "https",
  "email": "メールアドレス",
  "domains": [
    "先ほどduck DNSで取得したドメイン"
  ],
  "certfile": "fullchain.pem",
  "keyfile": "privkey.pem"
}

Let’s Encryptをスタートし、その後でDuck DNSを再起動すれば、https://[取得したDuck DNSのアドレス]にアクセスするとHome Assistantへつながるようになる。

サーバーで直接設定をする

ここからは、Dockerコンテナ上のHass.ioを操作するのではなく、ベースのサーバーを操作して実施する方法を紹介する。

Apacheのリバースプロキシを利用する

iptablesで設定したり何なりをする必要はなく、ApacheをインストールしているのであればApacheのリバースプロキシでサブドメインを設定するのが早い。
設定するサブドメインに来たアクセスを、Home Assistantの8123ポートに転送するだけ。

<VirtualHost *:443>
        ServerAdmin メールアドレス
        ServerName HomeAssistantのサブドメイン
        ProxyPreserveHost On
        ProxyRequests off
        ProxyPass / http://ドメイン:8123/
        ProxyPassReverse / http://ドメイン:8123/
        ProxyPass /api/websocket ws://localhost:8123/api/websocket
        ProxyPassReverse /api/websocket ws://localhost:8123/api/websocket
        RewriteEngine on
        RewriteCond %{HTTP:Upgrade} =websocket [NC]
        RewriteRule /(.*)  ws://localhost:8123/$1 [P,L]
        RewriteCond %{HTTP:Upgrade} !=websocket [NC]
        RewriteRule /(.*)  http://localhost:8123/$1 [P,L]

</VirtualHost>

上記を実施したのち、Let’s encrypt等でApache全体にSSLを設定すれば、そのままHome Assistantもhttps/443で暗号化される。

まとめ

Google Homeとの連携を行うためには、この「https/443での公開」が不可欠だ。この手順に従って実施をしておけば、すぐにGoogle Homeとの連携を行うことが出来る。

なお、以前に記載しているとおり、上記を行わなくともSiri/HomeKitとの連携は可能である。その方法は下記を参照いただきたい。

【スマートホーム】HomeBridgeでHomeKit(iOS「ホーム」アプリ/Siri)から家電を操作
Home Assistant(Hass.io)は、アドオンを入れることによってHomeKitやGoogle Home、Alexa(Amazon Echo)など様々なスマートホームプ

※Home Assistant特集はこちらから。