如何在 Rust 中使用客户端证书进行请求

3

我有一个使用Docker容器在Bluemix中部署的微服务项目。所有的微服务都是用Java编写的,并且通信是使用JKS文件。

我还开发了一个使用Express.js的Node.js微服务。为了消费其他的微服务,我使用了Request模块option.agentOptions功能以及pfx文件,就像这样:

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
});

我尝试使用Solicit crate默认示例进行HTTPS通信,但出现错误:

4 | use solicit::http::client::tls::TlsConnector;
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Could not find `tls` in `client`

我找不到其他的板条箱、库或框架来完成它,我该如何进行这些请求?


编辑

显然,Solicit由于缺乏维护已经不再是这个问题的替代方案,原因在这里

1个回答

6

目前,您应该更喜欢hyper客户端而不是solicit。后者自2015年以来没有更新,而hyper正在得到更好的维护。将hyper = "0.10.10"hyper-native-tls = "0.2.2"添加到您的依赖项中。要指定要使用的客户端证书,我们可以利用native_tls的功能。特别是TlsConnectorBuilderPkcs12是您要寻找的内容。

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 子模块。然而,这会导致进一步的依赖冲突(参见 为什么 solicit 0.4.4 尝试使用 openssl 0.9.12,即使我在 Cargo.toml 中有 openssl 0.7.14?)。相比之下,坚持使用 hyper 是更安全的选择。

谢谢@E_net4,我加上了但现在错误是:error: Package openssl 'v0.9.12' does not have these features: 'tlsv1_2, npn', 我还添加了 openssl = { version = "0.9.12", features = ["v101", "v102", "v110"] } 但第二个错误仍然存在。 - Deoxyseia
@Deoxyseia 我已经更新了答案,提供了另一种选择。 - E net4
我认为修复Solicit并不是解决安全问题的最佳方案,尤其是需要将openssl修复到0.9版本。关于hyper并不能解决原始问题,即在服务器要求时如何使用客户端证书进行请求。更多信息 - Deoxyseia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接