3个不稳定版本
使用旧的Rust 2015
0.2.1 | 2016年3月15日 |
---|---|
0.2.0 | 2016年2月16日 |
0.1.0 | 2016年2月11日 |
#5 in #libressl
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