Как сделать запрос с сертификатом клиента в Rust
У меня есть проект с микросервисами, развернутыми в Bluemix с контейнерами Docker. Все микросервисы написаны на Java, а для общения используются файлы JKS.
Я также разработал микросервис в Node.js с Express.js. Чтобы использовать другие микросервисы, я использовал модуль запроса с option.agentOptions
особенность и pfx file
, как это:
var options = {
uri: config.get("https://www.example.com/ms/service"),
method: 'POST',
body: data,
json: true,
headers: {
'Content-Type': 'application/json; charset=UTF-8'
},
agentOptions: {
pfx: fs.readFileSync(config.get("/path/to/file.pfx")),
passphrase: config.get("passphraseText"),
servername: config.get("serverName")
}
};
request(options, function (error, response, data) {
//handing response
});
Я попытался использовать ящик для сбора платежей с примером по умолчанию для HTTPS, но он не работает с:
4 | use solicit::http::client::tls::TlsConnector;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Could not find `tls` in `client`
Я не смог найти другой ящик, библиотеку или фреймворк для этого, как я могу сделать эти запросы?
РЕДАКТИРОВАТЬ
Судя по всему, Solicit не является альтернативой из-за отсутствия обслуживания, поэтому он больше не является альтернативным решением этого вопроса. Вот причина.
1 ответ
На данный момент вы должны предпочесть hyper
клиент более solicit
, Последний не обновлялся с 2015 года, и hyper
дается лучшее обслуживание. добавлять hyper = "0.10.10"
, а также hyper-native-tls = "0.2.2"
к вашим зависимостям. Для указания сертификата клиента для использования мы можем использовать функции native_tls
, Особенно, TlsConnectorBuilder
а также Pkcs12
это то, что вы ищете.
use std::fs::File;
use std::io::Read;
use hyper::client::Client;
use hyper::net::HttpsConnector;
use hyper_native_tls::NativeTlsClient;
use hyper_native_tls::native_tls::{TlsConnector, Pkcs12};
// fetch the PKCS12 client certificate
let cert = {
let cert_file = File::open("/path/to/cert.pfx")?;
let mut cert_raw = Vec::new();
cert_file.read_to_end(&mut cert_raw)?;
Pkcs12::from_der(&cert_raw, "mypassword")?
};
// specify the TLS connection with the builder pattern
let tls_conn = TlsConnector::builder()
.identity(cert)?
.build()?;
let ssl = NativeTlsClient::from(tls_conn)?;
let https_conn = HttpsConnector::new(ssl);
// proceed as usual
let client = Client::with_connector(https_conn);
let endpoint = "https://www.example.com/ms/service");
let resp = client.get(endpoint).send()?;
В solicit
документация утверждает, что tls
субмодуль был доступен, только если для этой зависимости включена функция "tls". Тем не менее, это приведет к дальнейшим конфликтам зависимостей (см. Почему запрашивающая версия 0.4.4 пытается использовать openssl 0.9.12, даже если у меня есть openssl 0.7.14 в моем Cargo.toml?). Придерживаться hyper
вместо solicit
это гораздо более безопасный выбор.