ssl - 具有期货的启用 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();
}
我有一个自签名证书(也加载到客户端浏览器中)和准备好私钥(通过openssl
和rustls
),我只是不知道如何/在我的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;
}
使用rustls
、tokio_tls
或native_tls
(而不是hyper
)进行网络连接都给了我 HTTP 和 TLS,但只是以失去async
. 另外,我对HTTPS不太了解,但我认为hyper_rustls
只能做客户端相关的魔术。
有没有一个服务器端的、预打包的 Rust 解决方案,可以让我在这三个世界中最好的(HTTP + TLS + Future
)?如果没有,有没有办法可以实现服务器端 TLS hyper
?(即使只是一个提示也会很棒!)我更喜欢处理 HTTPS 错误而不是不透明Future
类型的噩梦。
解决方案
推荐阅读
- python-3.x - Python Selenium 无法使用 xpath 收集元素
- mysql - Spring Boot Kotlin + Hibernate 不断抛出 SQLSyntaxErrorException
- python - 匹配模式后,如何根据另一个列表中的预定义顺序对文件名列表进行排序?
- machine-learning - 在激活函数的反向传播过程中,为什么我们应该将 delta 乘以梯度而不是除法?
- javascript - 如何在 JS 中禁用按钮单击页面加载?
- qt - 如何将小部件添加到 QListModel
- ffmpeg - 如何使用ffmpeg将文件名添加到视频中的drawtext?
- javascript - 如何自动生成包含一些 js 图表库的 pdf?
- html - 将自己的 ui-component 提取到一个地方
- c++ - 避免在 C++ 循环中的每一步都检查相同的条件