我有一个项目,在Bluemix中使用Docker容器部署微服务。所有微服务都是用Java编写的,通信使用的是JKS文件。
我还使用Express.js在Node.js中开发了一个微服务。为了使用其他微服务,我使用了the Request module 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
});
我尝试将the Solicit crate与default example用于HTTPS,但它失败了:
4 | use solicit::http::client::tls::TlsConnector;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Could not find `tls` in `client`
我找不到另一个箱子,库或框架,我怎么能提出这个要求呢?
修改
显然,Solicit不是缺乏维护的替代方案,因此它不再是这个问题的替代解决方案,Here's the reason。
答案 0 :(得分:3)
目前,您应该更喜欢hyper
客户端而不是solicit
。后者自2015年以来一直没有更新,hyper
正在得到更好的维护。将hyper = "0.10.10"
和hyper-native-tls = "0.2.2"
添加到您的依赖项中。要指定要使用的客户端证书,我们可以利用native_tls
的功能。特别是,TlsConnectorBuilder
和Pkcs12
是您正在寻找的。 p>
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
中,documentation表示tls
子模块仅在为此依赖项启用“tls”功能时才可用。然而,这会导致进一步的依赖冲突(见Why does solicit 0.4.4 attempt to use openssl 0.9.12 even though I have openssl 0.7.14 in my Cargo.toml?)。坚持hyper
代替solicit
是一个更安全的选择。