はじめに
デフォルトでは、OpenClaw ゲートウェイは HTTP プロトコルで動作しています。パブリックネットワーク経由でダッシュボードにアクセスする必要がある場合や、HTTPS を要求する一部のチャットプラットフォーム(Telegram Webhook など)との連携には、HTTPS の設定が必須です。本チュートリアルでは、Let's Encrypt 無料証明書、Cloudflare SSL、Nginx リバースプロキシの3つの主要な方式を解説します。
プランの比較
| プラン | 難易度 | 費用 | 適用シーン |
|---|---|---|---|
| Let's Encrypt + Certbot | 中程度 | 無料 | 自前のサーバー、カスタムドメイン |
| Cloudflare SSL | 簡単 | 無料 | ドメインを Cloudflare で管理 |
| Nginx リバースプロキシ + SSL | 中程度 | 無料 | 高度なプロキシ機能が必要な場合 |
前提条件
- グローバル IP を持つサーバー
- 登録済みのドメイン(例:
ai.example.com) - ドメインの DNS がサーバーの IP を指している
- OpenClaw がインストール済みで、ポート 18789 で正常に動作している
OpenClaw が動作していることを確認します:
openclaw doctor
curl http://localhost:18789/health
プラン1:Let's Encrypt + Certbot
1.1 Certbot のインストール
# Ubuntu/Debian
sudo apt update
sudo apt install certbot
# CentOS/RHEL
sudo dnf install certbot
# macOS
brew install certbot
1.2 証明書の取得
ポート 80 が使用されていないことを確認してください(Certbot が一時的に使用します):
# ポート 80 を確認
sudo lsof -i :80
# 使用中の場合、一時的に停止(例:nginx)
sudo systemctl stop nginx
証明書を申請します:
sudo certbot certonly --standalone \
-d ai.example.com \
--email [email protected] \
--agree-tos \
--no-eff-email
成功すると、証明書ファイルは以下に配置されます:
/etc/letsencrypt/live/ai.example.com/fullchain.pem # 証明書チェーン
/etc/letsencrypt/live/ai.example.com/privkey.pem # 秘密鍵
1.3 OpenClaw で証明書を使用する設定
OpenClaw の設定ファイルを編集します:
{
server: {
port: 18789,
host: "0.0.0.0",
ssl: {
enabled: true,
cert: "/etc/letsencrypt/live/ai.example.com/fullchain.pem",
key: "/etc/letsencrypt/live/ai.example.com/privkey.pem",
}
}
}
OpenClaw を再起動します:
openclaw restart
HTTPS が有効であることを確認します:
curl https://ai.example.com:18789/health
1.4 自動更新の設定
Let's Encrypt の証明書は有効期間が90日のため、自動更新が必要です:
# 更新が正常に動作するかテスト
sudo certbot renew --dry-run
# cron タスクで自動更新を設定
sudo crontab -e
以下を追加します:
# 毎日午前3時に証明書を確認・更新
0 3 * * * certbot renew --quiet --post-hook "openclaw restart"
--post-hook により、更新後に OpenClaw が自動的に再起動され、新しい証明書が読み込まれます。
プラン2:Cloudflare SSL
ドメインを Cloudflare で管理している場合、これが最も簡単な方式です。
2.1 DNS の設定
Cloudflare ダッシュボードで DNS レコードを追加します:
タイプ:A
名前:ai(ai.example.com に対応)
内容:サーバーの IP
プロキシ状態:プロキシ済み(オレンジの雲アイコン)
2.2 SSL モードの設定
Cloudflare ダッシュボード → SSL/TLS で:
SSL/TLS 暗号化モード:Full(厳格)
各モードの説明:
| モード | 説明 | 推奨 |
|---|---|---|
| Off | 暗号化なし | 非推奨 |
| Flexible | ブラウザ→Cloudflare は暗号化、Cloudflare→サーバーは非暗号化 | 非推奨 |
| Full | 全経路暗号化、サーバー証明書は検証しない | 一般的 |
| Full (Strict) | 全経路暗号化、サーバー証明書を検証 | 推奨 |
2.3 Cloudflare Origin 証明書の取得
Full (Strict) モードの場合、サーバーに Origin 証明書をインストールする必要があります:
- Cloudflare ダッシュボード → SSL/TLS → Origin Server に移動
- Create Certificate をクリック
- デフォルト設定のまま Create をクリック
- 証明書と秘密鍵をコピー
サーバーに保存します:
# 証明書を保存
sudo mkdir -p /etc/cloudflare
sudo nano /etc/cloudflare/origin-cert.pem
# 証明書の内容を貼り付け
sudo nano /etc/cloudflare/origin-key.pem
# 秘密鍵の内容を貼り付け
# パーミッションの設定
sudo chmod 600 /etc/cloudflare/origin-key.pem
2.4 OpenClaw の設定
{
server: {
port: 18789,
host: "0.0.0.0",
ssl: {
enabled: true,
cert: "/etc/cloudflare/origin-cert.pem",
key: "/etc/cloudflare/origin-key.pem",
}
}
}
openclaw restart
Cloudflare Origin 証明書は最長15年の有効期限があり、頻繁な更新は不要です。
2.5 Cloudflare セキュリティオプションの設定
Cloudflare ダッシュボードで以下を有効にすることを推奨します:
- Always Use HTTPS:HTTP を自動的に HTTPS にリダイレクト
- HSTS:HTTP Strict Transport Security を有効化
- Minimum TLS Version:TLS 1.2 に設定
- Automatic HTTPS Rewrites:混合コンテンツを自動修正
プラン3:Nginx リバースプロキシ
最も柔軟な方式で、ロードバランシングやキャッシュなどの高度な機能が必要な場合に適しています。
3.1 Nginx のインストール
# Ubuntu/Debian
sudo apt update
sudo apt install nginx
# CentOS/RHEL
sudo dnf install nginx
3.2 SSL 証明書の取得
Certbot の Nginx プラグインでワンクリック取得:
sudo apt install python3-certbot-nginx
sudo certbot --nginx -d ai.example.com
または手動で証明書を取得(プラン1のステップ1.2と同じ)。
3.3 Nginx の設定
Nginx 設定ファイルを作成します:
sudo nano /etc/nginx/sites-available/openclaw
以下の内容を記述します:
# HTTP から HTTPS へのリダイレクト
server {
listen 80;
server_name ai.example.com;
return 301 https://$server_name$request_uri;
}
# HTTPS メイン設定
server {
listen 443 ssl http2;
server_name ai.example.com;
# SSL 証明書
ssl_certificate /etc/letsencrypt/live/ai.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ai.example.com/privkey.pem;
# SSL セキュリティ設定
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# その他のセキュリティヘッダー
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
# OpenClaw へのリバースプロキシ
location / {
proxy_pass http://127.0.0.1:18789;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
# タイムアウト設定(AI の応答に時間がかかる場合がある)
proxy_read_timeout 120s;
proxy_send_timeout 120s;
}
# ダッシュボード静的リソースのキャッシュ
location /dashboard/assets/ {
proxy_pass http://127.0.0.1:18789;
expires 7d;
add_header Cache-Control "public, immutable";
}
}
3.4 設定の有効化
# シンボリックリンクの作成
sudo ln -s /etc/nginx/sites-available/openclaw /etc/nginx/sites-enabled/
# 設定構文のテスト
sudo nginx -t
# Nginx のリロード
sudo systemctl reload nginx
3.5 OpenClaw のプロキシ信頼設定
Nginx リバースプロキシを使用する場合、OpenClaw 自体で SSL を処理する必要はありません:
{
server: {
port: 18789,
host: "127.0.0.1", // ローカルのみリッスン、Nginx がプロキシ
trustProxy: true, // プロキシから転送される X-Forwarded-For を信頼
ssl: {
enabled: false, // Nginx が SSL を処理するため、OpenClaw では不要
}
}
}
3.6 自動更新(Nginx プラン)
sudo crontab -e
0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
カスタムドメインの設定
DNS 設定例
| レコードタイプ | 名前 | 値 | 説明 |
|---|---|---|---|
| A | ai | 203.0.113.1 | サーバー IP を指定 |
| AAAA | ai | 2001:db8::1 | IPv6 アドレス(任意) |
| CNAME | www.ai | ai.example.com | www リダイレクト(任意) |
複数ドメインのサポート
複数のドメインを同じ OpenClaw インスタンスに向ける場合:
server {
listen 443 ssl http2;
server_name ai.example.com bot.example.com assistant.example.com;
# 証明書はすべてのドメインをカバーする必要がある
ssl_certificate /etc/letsencrypt/live/ai.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ai.example.com/privkey.pem;
# ... 残りの設定は上記と同じ
}
マルチドメイン証明書の申請:
sudo certbot certonly --standalone \
-d ai.example.com \
-d bot.example.com \
-d assistant.example.com
検証とテスト
HTTPS 接続のテスト
# 基本的な接続テスト
curl -I https://ai.example.com
# 証明書情報の確認
openssl s_client -connect ai.example.com:443 -servername ai.example.com </dev/null 2>/dev/null | openssl x509 -noout -dates
# SSL Labs でのオンライン診断(ブラウザでアクセス)
# https://www.ssllabs.com/ssltest/analyze.html?d=ai.example.com
HSTS の確認
curl -I https://ai.example.com | grep -i strict
# 以下が表示されるはず: Strict-Transport-Security: max-age=31536000; includeSubDomains
よくある質問
証明書の更新に失敗する
# Certbot のログを確認
sudo cat /var/log/letsencrypt/letsencrypt.log
# 手動更新で詳細を確認
sudo certbot renew --verbose
よくある原因:ポート 80 が使用中、DNS 解決の問題、ファイアウォールによるブロック。
混合コンテンツの警告
ブラウザが「一部のコンテンツが安全でない」と表示する場合、通常はページ内で HTTP リソースを参照しています。Cloudflare の Automatic HTTPS Rewrites を有効にすることで自動修正できます。
WebSocket 接続の失敗
Nginx の設定に WebSocket サポートが含まれていることを確認してください:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
まとめ
OpenClaw に HTTPS を設定することは、本番環境では欠かせないステップです。ほとんどのユーザーには、Cloudflare SSL(最も簡単)または Nginx + Let's Encrypt(最も柔軟)を推奨します。どのプランを選択する場合でも、HSTS の有効化、HTTP から HTTPS へのリダイレクト設定、証明書の自動更新を必ず行ってください。セキュリティに妥協はありません。HTTPS は、あなたとユーザーのデータを保護する最初の防御線です。