Никель-сервер, использующий сертификат Let's Encrypt, имеет ошибку квитирования при обращении с помощью Rustls
Я пытаюсь создать небольшой REST-подобный API, который должен быть защищен с помощью HTTPS. Я хочу использовать никелевый ящик для сервера и 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:
- Полный вывод tlsclient при доступе к никелевому серверу
- Полный вывод tlsclient при доступе к badssl.com
Чтобы избежать ошибок в hyper_rustls, я использовал пример rustls tlsclient, но ошибка все еще появляется.
Сертификат Let's Encrypt не проблема, так как я могу подключиться к серверу Apache2 с этими сертификатами, используя tlsclient.
Я ошибся, подумав, как это работает?
1 ответ
Похоже, гипер Openssl::with_cert_and_key
говорит openssl использовать DEFAULT
список шифров, который довольно ужасен. В этом случае шуршит не удается рукопожатие по той же причине, что Chrome говорит "устаревший обмен ключами (RSA)". Если вы запускаете свой сервер и указываете на него ssllabs.com, вы должны получить больше информации.
Я думаю, что более поздние гипер-релизы убрали этот код в пользу получения поддержки TLS от других ящиков. Не могли бы вы попробовать это?