具有期货功能的启用TLS的服务器?

问题描述

我找不到启用TLS的服务器框架,该服务器框架不需要我使用线程化的TcpStreamstd::io::Read / std::io::Write模型来处理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,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,但代价是失去{{ 1}}。另外,我对HTTPS不太了解,但是我认为async只能做与客户端相关的魔术。

是否有一个服务器端的,预先打包的Rust解决方案,可以为我提供三个世界中最好的东西(HTTP + TLS + hyper_rustls)?如果没有,是否可以使用Future实现服务器端TLS? (甚至只是一个提示都将是惊人的!)我更喜欢处理HTTPS错误,而不是不透明的hyper类型的噩梦。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...