如何解决具有期货功能的启用TLS的服务器?
我找不到启用TLS的服务器框架,该服务器框架不需要我使用线程化的TcpStream
,std::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();
}
我有一个自签名证书(也已加载到客户端浏览器中)和私钥可以使用(通过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,但代价是失去{{ 1}}。另外,我对HTTPS不太了解,但是我认为async
只能做与客户端相关的魔术。
是否有一个服务器端的,预先打包的Rust解决方案,可以为我提供三个世界中最好的东西(HTTP + TLS + hyper_rustls
)?如果没有,是否可以使用Future
实现服务器端TLS? (甚至只是一个提示都将是惊人的!)我更喜欢处理HTTPS错误,而不是不透明的hyper
类型的噩梦。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。