2016-05-30 20:34:05 +00:00
|
|
|
# Rustls
|
|
|
|
Rustls is a new, modern TLS library written in Rust. It's pronounced 'rustles'.
|
|
|
|
It uses [*ring*](https://github.com/briansmith/ring) for cryptography
|
|
|
|
and [libwebpki](https://github.com/briansmith/webpki) for certificate
|
|
|
|
verification.
|
|
|
|
|
|
|
|
# Status
|
2016-09-17 18:42:32 +00:00
|
|
|
Rustls is currently in development and hence unstable. [Here's what I'm working on now](https://github.com/ctz/rustls/projects/1).
|
2016-05-30 20:34:05 +00:00
|
|
|
|
|
|
|
[![Build Status](https://travis-ci.org/ctz/rustls.svg?branch=master)](https://travis-ci.org/ctz/rustls)
|
2016-09-25 18:47:19 +00:00
|
|
|
[![Coverage Status](https://coveralls.io/repos/github/ctz/rustls/badge.svg?branch=master)](https://coveralls.io/github/ctz/rustls?branch=master)
|
|
|
|
[![Documentation](https://docs.rs/rustls/badge.svg)](https://docs.rs/rustls/)
|
2016-05-30 20:34:05 +00:00
|
|
|
|
2016-09-27 20:44:33 +00:00
|
|
|
## Release history:
|
|
|
|
|
2017-01-26 22:38:32 +00:00
|
|
|
* 0.5.4:
|
|
|
|
- First release with TLS1.3-draft-18 support.
|
|
|
|
- More performance improvements (now ~15Gbps per core).
|
|
|
|
- New API to learn version of negotiated connection.
|
2016-09-27 20:44:33 +00:00
|
|
|
* 0.5.0:
|
|
|
|
- Tickets.
|
|
|
|
- Coverage testing.
|
|
|
|
- Benchmarking.
|
|
|
|
- Massive performance improvements (from ~1Gbps to ~6Gbps per core).
|
|
|
|
- OSX support.
|
|
|
|
- Minor API corrections and additional testing.
|
|
|
|
|
2016-06-21 00:49:25 +00:00
|
|
|
# Documentation
|
2016-08-28 21:33:19 +00:00
|
|
|
Lives here: https://docs.rs/rustls/
|
2016-06-21 00:49:25 +00:00
|
|
|
|
2016-05-30 20:34:05 +00:00
|
|
|
# Approach
|
2016-07-03 11:41:33 +00:00
|
|
|
Rustls is a TLS library that aims to provide a good level of cryptographic security,
|
|
|
|
requires no configuration to achieve that security, and provides no unsafe features or
|
|
|
|
obsolete cryptography.
|
|
|
|
|
|
|
|
## Current features
|
|
|
|
|
|
|
|
* TLS1.2 only.
|
|
|
|
* ECDSA or RSA server authentication by clients.
|
|
|
|
* RSA server authentication by servers.
|
|
|
|
* Forward secrecy using ECDHE; with curve25519, nistp256 or nistp384 curves.
|
|
|
|
* AES128-GCM and AES256-GCM bulk encryption, with safe nonces.
|
|
|
|
* Chacha20Poly1305 bulk encryption.
|
|
|
|
* ALPN support.
|
|
|
|
* SNI support.
|
|
|
|
* Tunable MTU to make TLS messages match size of underlying transport.
|
2016-09-20 01:15:26 +00:00
|
|
|
* Resumption.
|
|
|
|
* Resumption via tickets (RFC5077).
|
2016-08-14 20:01:37 +00:00
|
|
|
* Client authentication by clients.
|
|
|
|
* Client authentication by servers.
|
2016-07-03 11:41:33 +00:00
|
|
|
|
|
|
|
## Possible future features
|
|
|
|
|
|
|
|
* ECDSA server authentication by servers.
|
|
|
|
* PSK support.
|
|
|
|
* OCSP stapling.
|
|
|
|
* Certificate pinning.
|
|
|
|
|
|
|
|
## Non-features
|
|
|
|
|
|
|
|
The following things are broken, obsolete, badly designed, underspecified,
|
|
|
|
dangerous and/or insane. Rustls does not support:
|
|
|
|
|
|
|
|
* SSL1, SSL2, SSL3, TLS1 or TLS1.1.
|
|
|
|
* RC4.
|
|
|
|
* DES or triple DES.
|
|
|
|
* EXPORT ciphersuites.
|
|
|
|
* MAC-then-encrypt ciphersuites.
|
|
|
|
* Ciphersuites without forward secrecy.
|
|
|
|
* Renegotiation.
|
|
|
|
* Kerberos.
|
|
|
|
* Compression.
|
|
|
|
* Discrete-log Diffie-Hellman.
|
|
|
|
* Automatic protocol version downgrade.
|
|
|
|
* AES-GCM with unsafe nonces.
|
|
|
|
|
|
|
|
There are plenty of other libraries that provide these features should you
|
|
|
|
need them.
|
2016-05-30 20:34:05 +00:00
|
|
|
|
2016-07-03 12:09:48 +00:00
|
|
|
# Example code
|
2016-11-08 14:35:53 +00:00
|
|
|
There are two example programs which use
|
|
|
|
[mio](https://github.com/carllerche/mio) to do asynchronous IO.
|
2016-05-30 20:34:05 +00:00
|
|
|
|
2016-07-03 11:41:33 +00:00
|
|
|
## Client example program
|
|
|
|
The client example program is named `tlsclient`. The interface looks like:
|
2016-05-30 20:34:05 +00:00
|
|
|
|
2016-09-11 16:51:51 +00:00
|
|
|
```tlsclient
|
2016-07-03 11:41:33 +00:00
|
|
|
Connects to the TLS server at hostname:PORT. The default PORT
|
|
|
|
is 443. By default, this reads a request from stdin (to EOF)
|
|
|
|
before making the connection. --http replaces this with a
|
|
|
|
basic HTTP GET request for /.
|
|
|
|
|
2016-08-28 14:03:04 +00:00
|
|
|
If --cafile is not supplied, a built-in set of CA certificates
|
|
|
|
are used from the webpki-roots crate.
|
2016-07-03 11:41:33 +00:00
|
|
|
|
|
|
|
Usage:
|
2016-09-11 17:12:25 +00:00
|
|
|
tlsclient [options] [--suite SUITE ...] [--proto PROTO ...] <hostname>
|
2016-09-11 16:51:51 +00:00
|
|
|
tlsclient (--version | -v)
|
|
|
|
tlsclient (--help | -h)
|
2016-07-03 11:41:33 +00:00
|
|
|
|
|
|
|
Options:
|
2016-09-11 16:51:51 +00:00
|
|
|
-p, --port PORT Connect to PORT [default: 443].
|
2016-07-03 11:41:33 +00:00
|
|
|
--http Send a basic HTTP GET request for /.
|
|
|
|
--cafile CAFILE Read root certificates from CAFILE.
|
2016-08-28 14:03:04 +00:00
|
|
|
--auth-key KEY Read client authentication key from KEY.
|
|
|
|
--auth-certs CERTS Read client authentication certificates from CERTS.
|
|
|
|
CERTS must match up with KEY.
|
2016-07-03 11:41:33 +00:00
|
|
|
--suite SUITE Disable default cipher suite list, and use
|
2016-09-11 17:12:25 +00:00
|
|
|
SUITE instead. May be used multiple times.
|
2016-07-03 11:41:33 +00:00
|
|
|
--proto PROTOCOL Send ALPN extension containing PROTOCOL.
|
2016-09-11 17:12:25 +00:00
|
|
|
May be used multiple times to offer serveral protocols.
|
2016-07-03 11:41:33 +00:00
|
|
|
--cache CACHE Save session cache to file CACHE.
|
2016-09-11 16:51:51 +00:00
|
|
|
--no-tickets Disable session ticket support.
|
2016-07-03 11:41:33 +00:00
|
|
|
--verbose Emit log output.
|
|
|
|
--mtu MTU Limit outgoing messages to MTU bytes.
|
2016-09-11 16:51:51 +00:00
|
|
|
--version, -v Show tool version.
|
|
|
|
--help, -h Show this screen.
|
2016-07-03 11:41:33 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
Some sample runs:
|
|
|
|
|
|
|
|
```
|
|
|
|
$ ./tlsclient --http mozilla-modern.badssl.com
|
2016-06-01 18:41:19 +00:00
|
|
|
HTTP/1.1 200 OK
|
2016-05-30 20:34:05 +00:00
|
|
|
Server: nginx/1.6.2 (Ubuntu)
|
2016-06-01 18:41:19 +00:00
|
|
|
Date: Wed, 01 Jun 2016 18:44:00 GMT
|
2016-05-30 20:34:05 +00:00
|
|
|
Content-Type: text/html
|
|
|
|
Content-Length: 644
|
2016-07-03 11:41:33 +00:00
|
|
|
(...)
|
2016-05-30 20:34:05 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
or
|
|
|
|
|
|
|
|
```
|
2016-06-01 18:41:19 +00:00
|
|
|
$ ./target/debug/examples/tlsclient --http expired.badssl.com
|
|
|
|
TLS error: WebPKIError(CertExpired)
|
|
|
|
Connection closed
|
2016-05-30 20:34:05 +00:00
|
|
|
```
|
|
|
|
|
2016-07-03 11:41:33 +00:00
|
|
|
## Server example program
|
|
|
|
The server example program is named `tlsserver`. The interface looks like:
|
|
|
|
|
2016-09-11 16:51:51 +00:00
|
|
|
```tlsserver
|
2016-07-03 11:41:33 +00:00
|
|
|
Runs a TLS server on :PORT. The default PORT is 443.
|
|
|
|
|
|
|
|
`echo' mode means the server echoes received data on each connection.
|
|
|
|
|
|
|
|
`http' mode means the server blindly sends a HTTP response on each connection.
|
|
|
|
|
|
|
|
`forward' means the server forwards plaintext to a connection made to
|
|
|
|
localhost:fport.
|
|
|
|
|
|
|
|
`--certs' names the full certificate chain, `--key' provides the RSA private
|
|
|
|
key.
|
|
|
|
|
|
|
|
Usage:
|
2016-09-11 17:12:25 +00:00
|
|
|
tlsserver --certs CERTFILE --key KEYFILE [--suite SUITE ...] [--proto PROTO ...] [options] echo
|
|
|
|
tlsserver --certs CERTFILE --key KEYFILE [--suite SUITE ...] [--proto PROTO ...] [options] http
|
|
|
|
tlsserver --certs CERTFILE --key KEYFILE [--suite SUITE ...] [--proto PROTO ...] [options] forward <fport>
|
2016-09-11 16:51:51 +00:00
|
|
|
tlsserver (--version | -v)
|
|
|
|
tlsserver (--help | -h)
|
2016-07-03 11:41:33 +00:00
|
|
|
|
|
|
|
Options:
|
2016-09-11 16:51:51 +00:00
|
|
|
-p, --port PORT Listen on PORT [default: 443].
|
2016-07-03 11:41:33 +00:00
|
|
|
--certs CERTFILE Read server certificates from CERTFILE.
|
|
|
|
This should contain PEM-format certificates
|
|
|
|
in the right order (the first certificate should
|
|
|
|
certify KEYFILE, the last should be a root CA).
|
2016-09-11 16:51:51 +00:00
|
|
|
--key KEYFILE Read private key from KEYFILE. This should be a RSA
|
|
|
|
private key, in PEM format.
|
2016-08-28 14:03:04 +00:00
|
|
|
--auth CERTFILE Enable client authentication, and accept certificates
|
|
|
|
signed by those roots provided in CERTFILE.
|
|
|
|
--require-auth Send a fatal alert if the client does not complete client
|
|
|
|
authentication.
|
2016-09-11 16:51:51 +00:00
|
|
|
--resumption Support session resumption.
|
2016-09-20 01:15:26 +00:00
|
|
|
--tickets Support tickets.
|
2016-07-03 11:41:33 +00:00
|
|
|
--suite SUITE Disable default cipher suite list, and use
|
2016-09-11 17:12:25 +00:00
|
|
|
SUITE instead. May be used multiple times.
|
2016-07-03 11:41:33 +00:00
|
|
|
--proto PROTOCOL Negotiate PROTOCOL using ALPN.
|
2016-09-11 17:12:25 +00:00
|
|
|
May be used multiple times.
|
2016-07-03 11:41:33 +00:00
|
|
|
--verbose Emit log output.
|
2016-09-11 16:51:51 +00:00
|
|
|
--version, -v Show tool version.
|
|
|
|
--help, -h Show this screen.
|
2016-07-03 11:41:33 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
Here's a sample run; we start a TLS echo server, then connect to it with
|
|
|
|
openssl and tlsclient:
|
|
|
|
|
|
|
|
```
|
|
|
|
$ ./tlsserver --certs test-ca/rsa/end.fullchain --key test-ca/rsa/end.rsa -p 8443 echo &
|
|
|
|
$ echo hello world | openssl s_client -ign_eof -quiet -connect localhost:8443
|
|
|
|
depth=2 CN = ponytown RSA CA
|
|
|
|
verify error:num=19:self signed certificate in certificate chain
|
|
|
|
hello world
|
|
|
|
^C
|
|
|
|
$ echo hello world | ./tlsclient --cafile test-ca/rsa/ca.cert -p 8443 localhost
|
|
|
|
hello world
|
|
|
|
^C
|
|
|
|
```
|
|
|
|
|
2016-06-19 16:42:57 +00:00
|
|
|
# License
|
|
|
|
|
|
|
|
Rustls is distributed under the following three licenses:
|
|
|
|
|
|
|
|
- Apache License version 2.0.
|
|
|
|
- MIT license.
|
|
|
|
- ISC license.
|
|
|
|
|
|
|
|
These are included as LICENSE-APACHE, LICENSE-MIT and LICENSE-ISC
|
|
|
|
respectively. You may use this software under the terms of any
|
|
|
|
of these licenses, at your option.
|
|
|
|
|