Как мне создать соединение с эквивалентом `-starttls smtp` с помощью rust-openssl? - PullRequest
0 голосов
/ 12 ноября 2018

Когда я запускаю следующую команду в терминале

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

Я получаю CONNECTED(00000005) ответ.

Я пытаюсь установить такое же соединение с Rust, используя rust-openssl (хотя я открыт для других библиотек), и вот что у меня есть:

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
                            }
                        ]
                    )
                )
            )
        }
    }
)

Полагаю, мне не хватает части -starttls smtp в коде Rust, но я не могу понять, как ее добавить.

1 Ответ

0 голосов
/ 15 ноября 2018

Посмотрите более подробно в openssl-source о том, что на самом деле делает -starttls smtp, и воспроизведите это в Rust?Это будет всего лишь несколько вызовов из библиотеки, но сначала вам нужно будет передать STMP на ваш сервер, а затем , а затем переключиться на TLS.(Возможно, это уже собрано в openssl-библиотеке за один вызов.)

...