- ドメインの取得と httpsのサポート
- まず OCI用に ドメインをfree/有料でゲットし OCIの public IP を設定し引けることを確認する
- SSL については Let's Encrypt を使うこととした
OCIの oracle linux 8.4 on aarch64 は snapが使えないので
sudo dnf install python3 augeas-libs
sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip
sudo /opt/certbot/bin/pip install certbot
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
これで certbot がインストールできたので 証明書を作る
sudo certbot certonly --standalone
Enter email address:
hogehoge@gmail.com (メールアドレス)Please read the Terms of Service:
Y (同意しますか)Would you be willing:
N (キャンペーンメールはいらない)Please enter the domain name:
hogehoge.com
- こうするとcertbotがサーバとなって自分で port 80 にアクセスして、
Successfully received certificate
と出る- (port 80にはアクセス可能としておき、一方apacheやnginxは走らせないように)
Certificate is saved at: /etc/letsencrypt/live/.../fullchain.pem
Key is saved at: /etc/letsencrypt/live/.../privkey.pem
/etc/letsencrypt/live/..
は rootしか読めないが、そもそも httpsポートへのbindが rootしかできないので、必然的にwebアプリは rootで動かす必要がある
とりあえずこれで pem はできた
actix webアプリを HTTPSに対応させる
Cargo.toml
を編集し、
actix-web = { version = "3", features = ["openssl"] } openssl = "0.10"
serverのソースを編集
- builder に
let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap(); builder .set_private_key_file("key.pem", SslFiletype::PEM) .unwrap(); builder.set_certificate_chain_file("cert.pem").unwrap();
- こんな感じでbuilder を作り、
HttpServer::new(...).bind
のかわりにHttpServer::new(...).bind_openssl(,builder)
とする - portは http 80ではなく https 443 に変更
- builder に
ビルド環境のdockerにopenssl-devを追加
sudo dnf install -y openssl-devel
- ビルド後 OCI環境に static, templatesとともに転送
OCIインスタンスの https ポートを、イングレスルールの変更で開け、firewall-cmdでも開ける
sudo firewall-cmd --add-service=https --permanent --zone=public
- 確認
sudo firewall-cmd --list-all
ビルド後、OCI内でroot権限でアプリを動かし、
https://hogehoge.com/
にアクセス、うまく動いていることを確認。- rootで走らせると環境変数がちょっと変わったりする (NLS_LANG=) ので注意
- rootで走らせるのいやだな: https://matope.hatenablog.com/entry/2014/09/28/031155