首页 > 解决方案 > 具有期货的启用 TLS 的服务器?

问题描述

我找不到一个启用 TLS 的服务器框架,它不需要我使用线程化的TcpStream, std::io::Read/ std::io::Write-model 来处理 HTTP 请求和响应(而不是面向Future模型)。我想我找到了所有分散的部分来单独实现 TLS、HTTP 和 Async,我只是不知道如何将它们组合起来。

我的服务器将 HTTP 请求代理到其目的地并返回响应,但它无法处理 HTTPS:

#[macro_use] lazy_static;
use hyper::{Body, Server, Client, Error};
use hyper::{
    client::HttpConnector,
    service::service_fn,
    service::make_service_fn,
};
use std::net::SocketAddr;
 
lazy_static! {
    static ref CLIENT: Client<HttpConnector> = Client::new();
}

async run() {
    let addr = SocketAddr::from(([127, 0, 0, 1], 8080));

    let svc = make_service_fn(|_| async {    
        Ok::<_, Error>(service_fn(|req| async move {    
            CLIENT.request(req).await
        }))
    });

    Server::bind(&addr).serve(svc).await.unwrap();
}

我有一个自签名证书(也加载到客户端浏览器中)和准备好私钥(通过opensslrustls),我只是不知道如何/在我的hyper代码中使用它们:

use openssl::{    
    x509::X509,    
    rsa::Rsa,    
}; 

fn tls_config() -> rustls::ServerConfig {
    let cert = X509::from_pem(/* CertAuth file as bytes */)
        .unwrap()
        .to_der()
        .unwrap()
    let cert = rustls::Certificate(cert);

    let key = Rsa::private_key_from_pem(/* PrivKey file as bytes */)
        .unwrap()
        .private_key_to_der()
        .unwrap()
    let key = rustls::PrivateKey(key);
    
    let mut result = rustls::ServerConfig::new(
        rustls::NoClientAuth::new()
    );
    result.set_single_cert(vec![cert; 1], key).unwrap();

    return result;
}

使用rustlstokio_tlsnative_tls(而不是hyper)进行网络连接都给了我 HTTP 和 TLS,但只是以失去async. 另外,我对HTTPS不太了解,但我认为hyper_rustls只能做客户端相关的魔术。

有没有一个服务器端的、预打包的 Rust 解决方案,可以让我在这三个世界中最好的(HTTP + TLS + Future)?如果没有,有没有办法可以实现服务器端 TLS hyper?(即使只是一个提示也会很棒!)我更喜欢处理 HTTPS 错误而不是不透明Future类型的噩梦。

标签: sslhttpsrustfuturehyper

解决方案


推荐阅读