使用 Let's Encrypt 证书的 Nickel 服务器在使用 rustls 访问时出现握手错误
Nickel server using Let's Encrypt certificate has a handshake error when accessed with rustls
我正在尝试创建一个类似 REST 的小型 API,它应该使用 HTTPS 进行保护。我想为服务器使用 nickel crate,为客户端使用 hyper_rustls 和 hyper。
只要我使用浏览器、curl 或 REST 客户端访问它,服务器就运行很棒,但是当我开始使用hyper_rustls时,我总是得到握手错误:
TLS error: AlertReceived(HandshakeFailure)
Connection closed
为了定位错误,我设置了一个最小的服务器:
#[macro_use]
extern crate nickel;
extern crate hyper;
use hyper::net::Openssl;
use nickel::Nickel;
fn main() {
let mut server = Nickel::new();
server.utilize(router! {
get "**" => |_req, _res| {
"Hello world!"
}
});
// FIXME: Add Match Error and OK instead of unwreap and add a propper error handling
let ssl = Openssl::with_cert_and_key("/etc/letsencrypt/live/www.example.de/fullchain.\
pem",
"/etc/letsencrypt/live/www.example.de/privkey.pem")
.unwrap();
server.listen_https("0.0.0.0:6767", ssl).expect("Failed to launch server");
}
Chrome中的有效证书:
- The complete output of tlsclient when accessing the nickel server
- The complete output of tlsclient when accessing badssl.com
为了避免hyper_rustls中的错误,我使用了rustls tlsclient example,但错误仍然出现。
Let's Encrypt 证书不是问题,因为我可以使用 tlsclient 使用这些证书连接到 Apache2 服务器。
我是不是对它的工作原理有误解?
看起来 hyper 的 Openssl::with_cert_and_key
告诉 openssl 使用 DEFAULT
密码套件列表,这非常糟糕。在这种情况下,rustls 无法握手,原因与 chrome 所说的 "obsolete key exchange (RSA)" 相同。如果您 运行 您的服务器并指向 ssllabs.com 它,您应该获得更多信息。
我认为最近的 hyper 版本已经删除了这段代码,以支持从其他 crate 获得 TLS 支持。你能试试吗?
我正在尝试创建一个类似 REST 的小型 API,它应该使用 HTTPS 进行保护。我想为服务器使用 nickel crate,为客户端使用 hyper_rustls 和 hyper。
只要我使用浏览器、curl 或 REST 客户端访问它,服务器就运行很棒,但是当我开始使用hyper_rustls时,我总是得到握手错误:
TLS error: AlertReceived(HandshakeFailure)
Connection closed
为了定位错误,我设置了一个最小的服务器:
#[macro_use]
extern crate nickel;
extern crate hyper;
use hyper::net::Openssl;
use nickel::Nickel;
fn main() {
let mut server = Nickel::new();
server.utilize(router! {
get "**" => |_req, _res| {
"Hello world!"
}
});
// FIXME: Add Match Error and OK instead of unwreap and add a propper error handling
let ssl = Openssl::with_cert_and_key("/etc/letsencrypt/live/www.example.de/fullchain.\
pem",
"/etc/letsencrypt/live/www.example.de/privkey.pem")
.unwrap();
server.listen_https("0.0.0.0:6767", ssl).expect("Failed to launch server");
}
Chrome中的有效证书:
- The complete output of tlsclient when accessing the nickel server
- The complete output of tlsclient when accessing badssl.com
为了避免hyper_rustls中的错误,我使用了rustls tlsclient example,但错误仍然出现。
Let's Encrypt 证书不是问题,因为我可以使用 tlsclient 使用这些证书连接到 Apache2 服务器。
我是不是对它的工作原理有误解?
看起来 hyper 的 Openssl::with_cert_and_key
告诉 openssl 使用 DEFAULT
密码套件列表,这非常糟糕。在这种情况下,rustls 无法握手,原因与 chrome 所说的 "obsolete key exchange (RSA)" 相同。如果您 运行 您的服务器并指向 ssllabs.com 它,您应该获得更多信息。
我认为最近的 hyper 版本已经删除了这段代码,以支持从其他 crate 获得 TLS 支持。你能试试吗?