我有一个使用hyper
和tokio-rustls
构建的Web服务器。在使用自签名证书时,我已确认https请求已被Chrome等Web浏览器成功处理。
但是,当我尝试为测试创建一个hyper
客户端并尝试发出请求时,输出以下错误。
hyper::Error(Connect, Custom { kind: Other, error: Custom { kind: InvalidData, error: InvalidCertificateData("invalid peer certificate: UnknownIssuer") } })', tests/server.rs:80:42
甚至当我检查自我签名证书的curl请求时,我得到了200个响应。使用hyper-rustls
的客户端不接受自签名证书吗?或者浏览器和测试客户端显示不同结果的原因是什么?
是否有一个单独的选项不检查客户端上的服务器证书(不安全)?
我使用hyper_rustls
来发出https请求。
let url = ("https://localhost:5582").parse().unwrap();
let https = hyper_rustls::HttpsConnectorBuilder::new()
.with_native_roots()
.https_only()
.enable_http1()
.build();
let client: Client<_, hyper::Body> = Client::builder().build(https);
let response = client.get(url).await.unwrap();
2条答案
按热度按时间w6mmgewl1#
所有环境都应该拒绝自签名证书 ,直到明确指示接受它。 例如,对于
curl
,您可以使用-k
或--insecure
来告诉curl不要验证证书。同样,您的浏览器显示了一个可怕的“证书错误”页面,您绕过了该页面,指示浏览器接受证书。如果一个环境默认不拒绝这样的证书,那么它很容易受到中间人攻击,这将是一个安全漏洞。
您可以在构建hyper_rustls连接器时通过添加
.with_tls_config()
调用来禁用证书验证。您需要访问ClientConfig
的危险部分,并将certificate verifier设置为不执行任何检查。或者,您可以将证书作为受信任的主机证书安装在系统的证书存储中,这样可能更简单也更安全。
xnifntxz2#
要在answer by cdhowie上构建,这里有一个更完整的示例: