openssl - 如何使用 rust-openssl 创建与 `-starttls smtp` 等效的连接?

标签 openssl rust smtp starttls

当我在终端中运行以下命令时

openssl s_client -connect gmail-smtp-in.l.google.com:25 -starttls smtp

我收到一个 CONNECTED(00000005) 响应。

我正在尝试使用 rust-openssl 实现与 Rust 的相同连接(尽管我对其他库开放),这就是我所拥有的:

extern crate openssl;

use openssl::ssl::{SslConnector, SslMethod};

use std::net::TcpStream;

fn main() {
    let connector = SslConnector::builder(SslMethod::tls()).unwrap().build();
    let stream = TcpStream::connect("gmail-smtp-in.l.google.com:25").unwrap();
    let e = connector
        .connect("gmail-smtp-in.l.google.com", stream)
        .unwrap_err();
    eprintln!("{:#?}", e);
}

但是,我得到的响应是:

Failure(
    MidHandshakeSslStream {
        stream: SslStream {
            stream: TcpStream {
                addr: V6(
                    [2001:41d0:a:2346::1]:57190
                ),
                peer: V6(
                    [2a00:1450:400c:c0c::1b]:25
                ),
                fd: 3
            },
            ssl: Ssl {
                state: "SSLv3/TLS write client hello",
                verify_result: X509VerifyResult {
                    code: 0,
                    error: "ok"
                }
            }
        },
        error: Error {
            code: ErrorCode(
                1
            ),
            cause: Some(
                Ssl(
                    ErrorStack(
                        [
                            Error {
                                code: 336130315,
                                library: "SSL routines",
                                function: "ssl3_get_record",
                                reason: "wrong version number",
                                file: "ssl/record/ssl3_record.c",
                                line: 252
                            }
                        ]
                    )
                )
            )
        }
    }
)

我猜我在 Rust 代码中缺少 -starttls smtp 部分,但不知道如何添加它。

最佳答案

在 openssl-sources 中更详细地了解 -starttls smtp 实际做了什么,并在 Rust 中重播?这只是几个库调用,但首先您需要与您的服务器对话 STMP,然后然后切换到 TLS。 (也许这已经在一次调用中捆绑在 openssl-library 中。)

关于openssl - 如何使用 rust-openssl 创建与 `-starttls smtp` 等效的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53266542/

相关文章:

java - 使用 X509 证书验证 SOAP 请求

rust - 仅将功能导出到模块测试?

rust - Libssh2停止读取大文件

php - 电子邮件 SMTP 问题 - 错误 :The following From address failed:

objective-c - 通过套接字与 ESMTP 协商 TLS

c - openssl/sha.h 似乎计算出了错误的哈希值

bash - 针对各种 CRL 文件验证 SSL 证书

rust - 无法编译bitvec 0.19.4 “multiple ` BITS`”

java - 通过 Amazon SES 发送电子邮件时出现 Java 错误

linux - 如何使用 Conan 在 Linux 上构建 openssl