【问题标题】:Why does a TLS connection using rustls return no response?为什么使用 rustls 的 TLS 连接没有返回响应?
【发布时间】:2020-07-05 02:13:37
【问题描述】:

我正在使用来自How do I make a TLS connection using the rustls library? 的代码创建一个带有 TLS 的套接字并向 Google 发送一个 GET 请求。

当我运行cargo run 时,程序不会在屏幕上打印任何内容。

use rustls;
use rustls::{ClientConfig, ClientSession, Session, TLSError};
use std::env;
use std::error::Error;
use std::fmt;
use std::fs::File;
use std::io;
use std::io::prelude::*;
use std::net::TcpStream;
use std::process;
use std::str;
use std::sync::Arc;
use webpki;
use webpki_roots;

fn main() {
    let mut socket = std::net::TcpStream::connect("www.google.com:443").unwrap();
    let mut config = rustls::ClientConfig::new();
    config
        .root_store
        .add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS);
    let arc = std::sync::Arc::new(config);
    let dns_name = webpki::DNSNameRef::try_from_ascii_str("www.google.com").unwrap();
    let mut client = rustls::ClientSession::new(&arc, dns_name);
    let mut stream = rustls::Stream::new(&mut client, &mut socket); // Create stream
                                                                    // Instead of writing to the client, you write to the stream
    stream
        .write(b"GET / HTTP/1.1\r\nConnection: close\r\n\r\n")
        .unwrap();
    let mut plaintext = Vec::new();
    stream.read_to_end(&mut plaintext).unwrap();
    io::stdout().write_all(&plaintext).unwrap();
}

在我的Cargo.toml 文件中:

[package]
name = "X"
version = "0.1.0"
authors = ["Behdad"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rustls = "0.17.0"
webpki = "0.21.2"
webpki-roots = "0.19.0"
serde_derive = "1.0.105"
serde = "1.0.105"

【问题讨论】:

  • 很难在一篇文章中回答多个问题。请将它们分成多个问题,以便我们可以更好地帮助您,并且您的问题将在未来帮助其他与您有相同问题的人! I've removed 单独的问题。
  • 很难回答您的问题,因为它不包含minimal reproducible example。我们无法分辨代码中存在哪些 crate(及其版本)、类型、特征、字段等。如果您尝试在Rust Playground 上重现您的错误,如果可能的话,这将使我们更容易为您提供帮助,否则在全新的 Cargo 项目中,然后在edit 您的问题中包含附加信息。您可以使用Rust-specific MRE tips 来减少您在此处发布的原始代码。谢谢!
  • 看来Why is a raw HTTP request extremely slow?的答案可能会回答您的问题; Get Request to a Website with vanilla Rust。如果没有,请edit您的问题解释差异。否则,我们可以将此问题标记为已回答。
  • minimal reproducible example 示例的一个重要部分是它最小。您包含了似乎没有使用过的板条箱,这是一个很好的迹象,表明您还没有完全减少问题。您甚至可以删除 TLS 方面并看到同样的问题。
  • @Shepmaster 您删除的第二个问题不是单独的问题,只需要非常快速地更改代码即可。这是我在 Stackoverflow 上找到的代码,它被标记为答案(问题也与我的相同),但它不起作用。无论如何,我也包含了Cargo.toml 文件。对于您的第三条评论,我应该说这与您提到的问题不同,因为我在这里使用的是 TLS 库,而持久连接在这里不是一个交易。还是谢谢你。

标签: sockets ssl https rust


【解决方案1】:
.write(b"GET / HTTP/1.1\r\nConnection: close\r\n\r\n")

这不是一个有效的 HTTP/1.1 请求。它缺少 Host 标头。

【讨论】:

  • 非常感谢!!我只是从另一个问题中复制了代码而没有仔细检查!我尝试了rustls 示例代码,但一整天都没有结果!还有一个问题:如何使用 IP 地址而不是 url?
  • @Behdad:“还有一个问题” - 评论不是提出新问题的地方。此外,您一开始不使用 URL。如果您引用www.google.com - 那是一个域名。 URL 将是https://www.google.com
  • danke schön! Sie helfen mir sehr gut!
猜你喜欢
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多