2023-1-13
Posted by
今回はactix-webでopensslを使ってhttps化をする
TL;DR
TL;DRの人はどうぞ、分からない場合は下に書いています
cargo.toml
actix-web = { version = "4", features = ["openssl"]}
openssl = { version = "0.10", features = ["vendored"] }
main.rs
use actix_web::{App, HttpServer, Responder, HttpResponse, get};
use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};
#[get("/")]
async fn hello() -> impl Responder {
HttpResponse::Ok().body("Hello, Https!")
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap();
builder
.set_private_key_file("./src/ssl/key.pem", SslFiletype::PEM)
.unwrap();
builder.set_certificate_chain_file("./src/ssl/cert.pem").unwrap();
HttpServer::new(|| {
App::new()
.service(hello)
})
.bind(("127.0.0.1", 8080))?.run().await
}
create key and cart
$ openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365 -subj /CN=localhost
directory
actix-test
.git
src
ssl
cert.pem
key.pem
main.rs
.gitignore
Cargo.toml
openssl
今回はopensslをインストールしている前提で進めるがもしまだインストールしていない場合は各自インストールしてほしい
info
既にcert.pemとkey.pemがあり尚且つvendoredを指定する方法を使う場合はインストールする必要がないかもしれない
openssl
for windows
( 僕は下のサイトで一番上にあるWin64 OpenSSL v3.0.7 Light
を使っている
因みに今回使用したバージョンは下記であるがあまり関係ないと思われる
$ openssl version
OpenSSL 3.0.7 1 Nov 2022 (Library: OpenSSL 3.0.7 1 Nov 2022)
keyとcartを生成
$ openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365 -subj /CN=localhost
..+....続く
生成したkey.pem
とcert.pem
はactix
が読める適当なフォルダーにおいておく、例ではファイルを移動するのがめんどくさいので置いておきたい場所で生成している(actix-test\src\ssl
https化
ライブラリのインポート
ここから下は人によって方法が少し変わる、一度二つとも見てから各自判断してほしい
vendoredを指定する方法
この方法ではrustのopensslはopenSSLをcloneしコンパイルします
この際C
コンパイラ、Perl
、Make
が必要です
actix-web = { version = "4", features = ["openssl"]}
openssl = { version = "0.10", features = ["vendored"] }
vendoredを使わない方法
この方法では自動的にopenSSLのインストール場所を自動的に検出して使います
actix-web = { version = "4", features = ["openssl"] }
openssl = "0.10"
この方法は面倒ですがエラーメッセージが詳細に表示されるのでC
コンパイラ、Perl
、Make
をインストールしていない場合は試してみても良いと思います、僕は既に三つともインストールしていたので使っていません
因みにこの方法ではvcpkg
が必要なようです、詳しくは公式ドキュメントを参照してください
ライブラリを使う
ここまで来たら後は簡単です
.bind
の代わりに.bind_openssl
を使うだけです、注意として.bind_openssl
を使うにはactix-webにfeatures = ["openssl"]
を追加する必要があります
actix-web = { version = "4", features = ["openssl"] }
use actix_web::{App, HttpServer, Responder, HttpResponse, get};
use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};
#[get("/")]
async fn hello() -> impl Responder {
HttpResponse::Ok().body("Hello, Https!")
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let mut builder = SslAcceptor::mozilla_intermediate_v5(SslMethod::tls()).unwrap();
builder
.set_private_key_file("./src/ssl/key.pem", SslFiletype::PEM)
.unwrap();
builder.set_certificate_chain_file("./src/ssl/cert.pem").unwrap();
HttpServer::new(|| {
App::new()
.service(hello)
})
.bind_openssl("127.0.0.1:8080", builder)?.run().await
}
また今回はオレオレ証明を使用しているのでchromeなどでは危険な証明書とされます
それが嫌な場合はchromeなどを騙すか信頼させるかオレオレではない証明書を用いてください
このドキュメントどう?