如何使用 rustls 库建立 TLS 连接?

2024-05-09

The 文档 https://docs.rs/rustls/0.10.0/rustls/提供了一个例子——不幸的是它不能编译;很多东西都被重命名了,界面也被重命名了ClientSession构造函数改变了。我设法将错误修复到可以编译的程度,但没有修复到可以工作的程度。

这是我让最小示例发挥作用的最佳尝试:

extern crate rustls;

use io::Read;
use io::Write;
use rustls::Session;
use std::io;

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);
    client.write(b"GET https://www.google.com\r\n\r\n").unwrap();
    loop {
        if client.wants_read() {
            client.read_tls(&mut socket).unwrap();
            client.process_new_packets().unwrap();
            let mut plaintext = Vec::new();
            client.read_to_end(&mut plaintext).unwrap();
            io::stdout().write(&plaintext).unwrap();
        }
        if client.wants_write() {
            client.write_tls(&mut socket).unwrap();
        }
        // For testing purposes only
        std::thread::sleep_ms(1000);
    }
}

所发生的情况是,程序开始运行,并在 10 秒后中止,并显示错误“已建立的连接被主机中的软件中止”。

我本希望它能将一些数据打印到标准输出,但事实并非如此。


有一个结构体叫做rustls::Stream将会话用作普通流。它记录在docs.rs https://docs.rs/rustls/0.17.0/rustls/struct.Stream.html。你还可以找到一个例子在他们的 GitHub 存储库上 https://github.com/ctz/rustls/blob/master/rustls-mio/examples/simpleclient.rs.

您可以将您的代码转换为使用rustls::Stream像这样:

extern crate rustls; // 0.17.0

use io::Read;
use io::Write;
use std::io;

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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 rustls 库建立 TLS 连接? 的相关文章

随机推荐

  • eclipse-cdt如何链接静态库

    首先 我很困惑应该在链接器 库下设置库还是将它们设置在 路径和符号 下 我认为它们是一样的 我对么 对于我的问题 我需要链接静态库 所以我尝试了一些方法 第一次尝试我尝试在链接库中添加gtest 这是库 和gtest路径 通过这种方式 它的
  • 从设置中访问配置文件中的“applicationSettings”部分(而不是“appSettings”)

    我正在为我们构建的 Web 应用程序创建设置 不 我有一个配置文件 看起来像这样 其中包含 appSettings 部分和 applicationSettings 部分
  • VLC 和 ffmpeg 如何协同工作?

    我从源代码编译了VLC 它运行良好 当我执行 Vlc 时 vlc 运行 我还从源代码编译了 ffmpeg 它也运行良好 当我执行 ffmpeg i f toto flv mp3 vn acodec copy new toto mp3 时 会
  • 批处理 - 默认浏览器?

    有没有办法使用批处理文件查找我的计算机上的默认浏览器 只需使用 启动 www google com See here http social msdn microsoft com Forums is iewebdevelopment thr
  • 从重定向到日志文件的程序输出中删除进度条

    我正在运行一个程序 它会输出进度条 我是这样做的 python train py tee train log The train log看起来像下面这样 这是1号线 Training 这是2号线 000 valid 100 2630 263
  • 错误:子进程失败,退出,错误号 48

    错误 48 对我来说是一个新错误 我在尝试输入 mongo 时也遇到错误 Error network error while attempting to run command isMaster on host 127 0 0 1 2701
  • 社交对象 - 数据库结构、过滤、排序、可扩展性的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正在 ASP NET MVC 中构建通用企业社交网络平台 任何社交网站的主要特征之一是社会对象由用户显式 文本更新 照片 博客 视频等 或隐
  • 调用不通过空指针访问成员的非静态方法是否合法/定义良好的 C++?

    我最近遇到了以下代码 class Foo public void bar other stuff void Foo bar if this do some stuff without accessing any data members r
  • 使用 Flash 在本地托管游戏?

    我只是找不到合适的谷歌搜索词 是否可以使用 Flash 或 Flash 兼容服务 来允许游戏中的玩家通过 Web 浏览器托管自己的游戏 使用自己的带宽 在某种程度上 从他们的计算机运行他们自己的游戏服务器 对于 Flash 浏览器内游戏 但
  • 比较两个constexpr指针不是constexpr吗?

    我正在寻找一种在编译时将类型映射到数值的方法 理想情况下不使用中建议的哈希this https stackoverflow com a 36122101 2173029 answer 由于指针可以是constexpr 我尝试过这个 stru
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • 将非平凡函数应用于 data.table 的有序子集

    Problem 我正在尝试使用我新发现的 data table 功能 永久 来计算一堆数据的频率内容 如下所示 Sample Channel Trial Voltage Class Subject 1 1 1 196 82253 1 1 1
  • 使用 RewriteRule 从重定向中删除主题标签

    我目前正在通过获取变量并将其插入新 URL 来重定向 URL 就像这样 RewriteCond QUERY STRING pid 0 9 RewriteRule vault displayimage php photos 1 R 301 L
  • 我们可以同时使用拼音标记和同义词吗?

    我正在尝试同时启用语音分析器和同义词 这似乎不起作用 它们一起使用有错吗 在下面的实现中 我希望使用同义词转换搜索查询 然后使用语音分析器来检索结果 但我的同义词在这里完全被忽略了 如果我在创建索引时删除语音分析器 那么同义词就可以正常工作
  • 从 CosmosDB 文档嵌套数组中的对象中选择值

    想象一下我们有一个这样的集合 示例取自https www documentdb com sql demo https www documentdb com sql demo id 19015 description Snacks grano
  • 避免嵌套 for 循环

    我正在尝试使用六个不同参数的所有可能的值组合来重复测试其他一些 Python 代码 对于每个参数 我想迭代具有给定最小值 最大值和步长的一系列值 我设法编写了一些代码 例如 for var1 in range min1 max1 step1
  • 如何取消/关闭 Angular 中的行为主体

    我有一个订阅了行为主题的组件ngOnInit生命周期 该组件 html 使用ngIf在渲染表格之前查看数据是否存在 当我离开该页面时 我想确保下次返回时 该表不可见 直到再次获取该数据 到目前为止 我能够做到这一点的唯一方法是调用该主题的
  • 按一定条件查找数组内元素的最后一个索引

    假设我有一个对象数组 a something b 12 a something b 12 a somethingElse b 12 a something b 12 a somethingElse b 12 获取元素的最后一个索引的最干净的
  • 添加类/删除类问题

    单击 A 类按钮时 将 A 类替换为 B 类 单击 B 类按钮时 我需要执行一个操作 它正确地应用 删除了该类 但由于某种原因它不会选择 B 类 changebut click function input type text fadeOu
  • 如何使用 rustls 库建立 TLS 连接?

    The 文档 https docs rs rustls 0 10 0 rustls 提供了一个例子 不幸的是它不能编译 很多东西都被重命名了 界面也被重命名了ClientSession构造函数改变了 我设法将错误修复到可以编译的程度 但没有