2023-1-13

rust

Posted by

applemango

今回は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.pemcert.pemactixが読める適当なフォルダーにおいておく、例ではファイルを移動するのがめんどくさいので置いておきたい場所で生成している(actix-test\src\ssl

https化

ライブラリのインポート

ここから下は人によって方法が少し変わる、一度二つとも見てから各自判断してほしい

vendoredを指定する方法

この方法ではrustのopensslはopenSSLをcloneしコンパイルします

この際Cコンパイラ、PerlMakeが必要です

actix-web = { version = "4", features = ["openssl"]}
openssl = { version = "0.10", features = ["vendored"] }

vendoredを使わない方法

この方法では自動的にopenSSLのインストール場所を自動的に検出して使います

actix-web = { version = "4", features = ["openssl"] }
openssl = "0.10"

この方法は面倒ですがエラーメッセージが詳細に表示されるのでCコンパイラ、PerlMakeをインストールしていない場合は試してみても良いと思います、僕は既に三つともインストールしていたので使っていません

因みにこの方法では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などを騙すか信頼させるかオレオレではない証明書を用いてください

このドキュメントどう?

emoji
emoji
emoji
emoji