具有自签名PEM证书的HTTPS请求

时间:2020-08-30 13:25:18

标签: rust

免责声明:JS / TS即将推出,而Rust则已经花了几个月的时间了。

我正在为一个非常简单的后端制作原型,并且我将actix-web用于服务器端TLS,在这里我通过ServerConfig中的rustls使用'server.pem'和'server_key.pem' 1}}。我认为一切正常。问题是,我需要从服务向使用相同证书设置的另一个服务执行HTTPS请求。我已经研究了一些SSL / TLS方法和一些HTTP库,但是没有找到我可以使用的任何东西。

尝试使用reqwest,看起来像这样:

注意以下是证书类型:

  • root_fileResult<Vec<u8>, AppError>
  • client_fileResult<String, AppError>
  • client_key_fileResult<String, AppError>
let CertificateContents {
    root_file,
    client_file,
    client_key_file,
    ..
} = get_cert_contents(None);
let root_cert =
    Certificate::from_pem(&root_file?).map_err(|e| AppError::FileRead(e.to_string()))?;

// Identity represents the client cert and client key
let client_file = client_file?;
let client_key_file = client_key_file?;
let combined = format!("{}{}", client_key_file, client_file);
let identity = Identity::from_pem(combined.as_bytes()).unwrap();

// https://docs.rs/reqwest/0.10.6/reqwest/struct.ClientBuilder.html
let client = reqwest::Client::builder()
    .add_root_certificate(root_cert)
    .identity(identity) // client + client key
    .default_headers(headers)
    .build()
    .unwrap();

let http_res = client
    .get(&uri)
    .send()
    .await
    .map_err(|e| AppError::Internal(format!("Request error: {}", e.to_string())))?;

此请求未通过,导致403禁止访问。我怀疑Identity部分是超错误的,因为我在阅读reqwest文档时有点将它砍在一起。

虽然我将使用类似Node.js的方法:

注意:rootclientclientKey的类型为(node.js)Buffer

const { root, client, clientKey } = getCertificates();
const res = await requestPromise.get(uri, {
  ca: [root],
  cert: client,
  key: clientKey,
  agentOptions: {
    secureOptions: getConfig().ssl,
  },
});

是否有一个现有的板条箱可以帮助我实现{。{1}}版本的node.js?

任何指导表示赞赏!

0 个答案:

没有答案