3个不稳定版本

使用旧的Rust 2015

0.2.1 2016年3月15日
0.2.0 2016年2月16日
0.1.0 2016年2月11日

#5 in #libressl

ISC许可证

130KB
789

Rust对libressl的libtls的绑定。有关libtls内部工作的权威信息,请查看手册页raw模块包含围绕libtls的绑定。这里还提供了一个更符合惯用的API。

客户端

use std::io::Write;
use std::net::TcpStream;
let tcp = TcpStream::connect("google.com:443").unwrap();
let mut client = telos::new_client()
    .connect(tcp, "google.com")
    .unwrap();
client.write("GET / HTTP/1.1\n\n".as_bytes()).unwrap();

服务器

该库不处理TCP监听和绑定,您需要处理TCP服务器的accept(),然后调用TlsServer::accept

use std::net::TcpListener;
let srv = TcpListener::bind("127.0.0.1:0").unwrap();
let addr = srv.local_addr().unwrap();
let mut tls_srv = telos::new_server()
    .key_file("tests/private_key.key")
    .cert_file("tests/certificate.crt")
    .bind().unwrap();
// Accept TCP connection, and then start TLS over it
let tcp_conn = srv.incoming().next().unwrap().unwrap();
let mut tls_conn = tls_srv.accept(tcp_conn).unwrap();

证书验证

默认情况下,libtls将使用系统证书存储(通常定义为/etc/ssl/cert.pem)来验证证书。在某些Linux版本和Windows中,此文件不存在,您需要使用适当的方法之一来加载适合您系统的正确证书 - 检查Builder类中的ca方法。

连接生命周期

默认情况下,connect()accept()会获取底层套接字的拥有权,以确保它们在使用时不会关闭。

如果您想保持拥有权,connect_socket()accept_socket()允许您这样做。但是,丢弃TlsStream不会关闭底层套接字,您需要自己关闭它们。

同样,确保套接字不会被过早关闭的责任在调用者身上。以下示例未能保持原始TcpStream的作用域

#[cfg(unix)]
use std::os::unix::io::AsRawFd;
#[cfg(windows)]
use std::os::windows::io::AsRawSocket;
use std::net::TcpStream;
fn create_client() -> telos::TlsStream<()> {
    let tcp = TcpStream::connect("google.com:443").unwrap();
    let mut client = telos::new_client()
        .connect_socket(&tcp, "google.com")
        .unwrap();
    client
}

fn main() {
    let mut client = create_client();
    // The TcpStream was closed when create_client exited the following
    // will fail with "handshake failed: Bad file descriptor"
    client.handshake().unwrap();
}

依赖项

约2.5MB
约38K SLoC