Как сделать запрос с сертификатом клиента в 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 это гораздо более безопасный выбор.

Другие вопросы по тегам