Skip to content

Commit 65b3900

Browse files
authored
feat: implment tls transport (#31)
* feat: implement tls transport based on tokio-native-tls * feat: add wait_for_close for client
1 parent 5e4b5b2 commit 65b3900

File tree

32 files changed

+472
-64
lines changed

32 files changed

+472
-64
lines changed

examples/Cargo.toml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ log = "0.4.11"
1010
env_logger = "0.8.2"
1111
futures = "0.3.8"
1212
clap = "2.33.3"
13-
async-trait = "0.1.42"
1413

1514
[dev-dependencies.rsocket_rust]
1615
path = "../rsocket"
1716

1817
[dev-dependencies.rsocket_rust_transport_tcp]
1918
path = "../rsocket-transport-tcp"
19+
features = ["tls"]
2020

2121
[dev-dependencies.rsocket_rust_transport_websocket]
2222
path = "../rsocket-transport-websocket"
@@ -41,3 +41,11 @@ path = "cli.rs"
4141
[[example]]
4242
name = "qps"
4343
path = "qps.rs"
44+
45+
[[example]]
46+
name = "tls-server"
47+
path = "tls/server.rs"
48+
49+
[[example]]
50+
name = "tls-client"
51+
path = "tls/client.rs"

examples/tls/cert.pem

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFUDCCAzigAwIBAgIJAJjWP27hY7PeMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
3+
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
4+
aWRnaXRzIFB0eSBMdGQwHhcNMjEwMTA1MDMwODUzWhcNMjIwMTA1MDMwODUzWjBa
5+
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
6+
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRMwEQYDVQQDDApmb29iYXIuY29tMIICIjAN
7+
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtv10GWc14Kyu94jmT/a52HEdTf9f
8+
gSFc9fTiGIcvsHwGe5HU5tMEEpVmVQqMeWHMgIunHpAVbmu9dhZ/r256QiR+bU8o
9+
Zzv6ShJ6gdYAv/j2MEu7sHFpFHWEaZmPgqbREHioerS8AMJwNLcFF47EKUsKlbJy
10+
Yn7rsfDl1Vir3I5l2VOORmjNOap/++CNJf39oGN8yx6+6YUT+lcUY2GkI8BkXLRI
11+
ITTYOnAsjnwtk9k2sHQaCMfmlQYr5FCDTi2A4MEWfBecJ8Logbt+E02ZaaMj5pSW
12+
Q4oqpZUEzhYhUgNUahy1Gfeso9BZsFj056dn8qiaa61tV1vtFsnk2bHEU9HTu/NA
13+
TwTLsRhWVqfOA04zT2V9OPcaO+shiMsY7JzivLFnBBsPeTC43e5Js1OZSeRr6Dbq
14+
8jJ61p+f5DbBRHUFl3oZ0pz+8xYpusDHHzVPqE5izKS3fz2FNyK+OjJwEsNmSpNc
15+
X4+g3YeZj3Oq4fs/vGu3y1IZq9wIR1pBSRosW+SOpPd9PBWhbF43fUa0k2kSI7Xc
16+
BkDQbEWxY0jEY4vzvNOA2C5A3eg8DzvDpjGE13GeSzk3DsObwmugHWZaz/TK0KeI
17+
7LWDCHkUBizublZ+htUHDZxTU5mXWhaU2tU/udz+4rPVymns8RZ+Omm3uOC4PuQo
18+
g+ezrcaZwyZptv0CAwEAAaMuMCwwEwYDVR0lBAwwCgYIKwYBBQUHAwEwFQYDVR0R
19+
BA4wDIIKZm9vYmFyLmNvbTANBgkqhkiG9w0BAQsFAAOCAgEAKj6H77fLp5jL/oEJ
20+
qglaOaM4OHU4FbQ3mTPLTjeVrvcnoxavigZC++0FwEkNm9FEfA8fDDNsVgK4CTof
21+
Jdsq10hkHVE44Y5WLJha4o50dvUczj0k4wV5BaZ0cC2aYwdRXVkSYVNa90951pDq
22+
FBy75ltWUWnQ8tibU4tZPgg2sbMzWkcRJ5bJfmEFVbB930x6ofllVZx2h9wZERBp
23+
otgtJzQ1+P+MZ5By2nF59gpKURbRyS06y5emuhs/7UF2E/ETvMTiyBgcRiASYqGO
24+
2bcxvZ6J6zo93D2gEAUKrP2QVsE0o3oTtc3N5ix1lXegdi9AM4AGnzb8uDkjyJHn
25+
J9ibW1pWPYey2DjArbcq1uSKzXtC+YVEdS7k6X91ksYrFZgjAporyhJbqISq+sJO
26+
1gaTXu1VRNRhFVfJQjNVfA0ar+RHcx5xetdJKRglekGqGcBQfTFMNhLcGfuY16pe
27+
qRzF9gwCqnX0c+tIl32IxCS4g6Pj/LBn3qCGE4sycWUz6+mwjGopFWK2gBGpj4M0
28+
Dvnv+c72QQKmijtpQX6tSn75MBhtG9hZD8jPpMyfIFfkhx71StZ4j1O+rvXQs7go
29+
Nb9qJOug/jfSrDQl9D5FSlRaqX19fm7JxiK7+fSnh/WlMmBQfn/j/lJ/sSDcyAbb
30+
KrQM79kml5Luw0QXo7yLtoYD93A=
31+
-----END CERTIFICATE-----

examples/tls/client.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#[macro_use]
2+
extern crate log;
3+
4+
use rsocket_rust::prelude::*;
5+
use rsocket_rust::Result;
6+
use rsocket_rust_transport_tcp::tokio_native_tls::{native_tls, TlsConnector};
7+
use rsocket_rust_transport_tcp::TlsClientTransport;
8+
9+
#[tokio::main]
10+
async fn main() -> Result<()> {
11+
env_logger::builder().format_timestamp_millis().init();
12+
13+
let pem = include_bytes!("cert.pem");
14+
let cert = native_tls::Certificate::from_pem(pem)?;
15+
let cx = native_tls::TlsConnector::builder()
16+
.add_root_certificate(cert)
17+
.build()?;
18+
let cx = TlsConnector::from(cx);
19+
let cli = RSocketFactory::connect()
20+
.transport(TlsClientTransport::new(
21+
"foobar.com".into(),
22+
"127.0.0.1:4444".parse()?,
23+
cx,
24+
))
25+
.start()
26+
.await?;
27+
let res = cli
28+
.request_response(Payload::builder().set_data_utf8("hello").build())
29+
.await?;
30+
info!("response: {:?}", res);
31+
32+
cli.wait_for_close().await;
33+
34+
Ok(())
35+
}

examples/tls/identity.p12

4.02 KB
Binary file not shown.

examples/tls/server.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#[macro_use]
2+
extern crate log;
3+
4+
use rsocket_rust::prelude::*;
5+
use rsocket_rust::utils::EchoRSocket;
6+
use rsocket_rust::Result;
7+
use rsocket_rust_transport_tcp::tokio_native_tls::{native_tls, TlsAcceptor};
8+
use rsocket_rust_transport_tcp::TlsServerTransport;
9+
10+
#[tokio::main]
11+
async fn main() -> Result<()> {
12+
env_logger::builder().format_timestamp_millis().init();
13+
14+
let der = include_bytes!("identity.p12");
15+
let cert = native_tls::Identity::from_pkcs12(der, "mypass")?;
16+
RSocketFactory::receive()
17+
.acceptor(Box::new(|setup, _socket| {
18+
info!("connection established: {:?}", setup);
19+
Ok(Box::new(EchoRSocket))
20+
}))
21+
.transport(TlsServerTransport::new(
22+
"127.0.0.1:4444".parse()?,
23+
TlsAcceptor::from(native_tls::TlsAcceptor::builder(cert).build()?),
24+
))
25+
.serve()
26+
.await
27+
}

rsocket-transport-tcp/Cargo.toml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@ repository = "https://github.com/rsocket/rsocket-rust"
99
homepage = "https://github.com/rsocket/rsocket-rust"
1010
description = "TCP RSocket transport implementation."
1111

12+
[features]
13+
default = []
14+
tls = ["tokio-native-tls"]
15+
1216
[dependencies]
1317
log = "0.4.11"
1418
futures = "0.3.8"
1519
bytes = "0.6.0"
16-
async-trait = "0.1.42"
1720

1821
[dependencies.rsocket_rust]
1922
path = "../rsocket"
@@ -28,3 +31,7 @@ features = [ "rt", "rt-multi-thread", "net", "sync", "stream", "io-util", "macro
2831
version = "0.5.1"
2932
default-features = false
3033
features = ["codec"]
34+
35+
[dependencies.tokio-native-tls]
36+
optional = true
37+
version = "0.2.0"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
mod tcp;
2+
#[cfg(feature = "tls")]
3+
mod tls;
24
mod uds;
35

46
pub use tcp::TcpClientTransport;
7+
#[cfg(feature = "tls")]
8+
pub use tls::TlsClientTransport;
59
pub use uds::UnixClientTransport;

rsocket-transport-tcp/src/client/tcp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{connection::TcpConnection, misc::parse_tcp_addr};
2-
use async_trait::async_trait;
2+
use rsocket_rust::async_trait;
33
use rsocket_rust::{error::RSocketError, transport::Transport, Result};
44
use std::net::SocketAddr;
55
use tokio::net::TcpStream;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
use crate::connection::TlsConnection;
2+
use rsocket_rust::async_trait;
3+
use rsocket_rust::{error::RSocketError, transport::Transport, Result};
4+
use std::net::SocketAddr;
5+
use tokio::net::TcpStream;
6+
use tokio_native_tls::{TlsConnector, TlsStream};
7+
8+
#[derive(Debug)]
9+
enum Connector {
10+
Direct(TlsStream<TcpStream>),
11+
Lazy(String, SocketAddr, TlsConnector),
12+
}
13+
14+
pub struct TlsClientTransport {
15+
connector: Connector,
16+
}
17+
18+
impl TlsClientTransport {
19+
pub fn new(domain: String, addr: SocketAddr, connector: TlsConnector) -> Self {
20+
Self {
21+
connector: Connector::Lazy(domain, addr, connector),
22+
}
23+
}
24+
}
25+
26+
#[async_trait]
27+
impl Transport for TlsClientTransport {
28+
type Conn = TlsConnection;
29+
30+
async fn connect(self) -> Result<Self::Conn> {
31+
match self.connector {
32+
Connector::Direct(stream) => Ok(TlsConnection::from(stream)),
33+
Connector::Lazy(domain, addr, cx) => match TcpStream::connect(addr).await {
34+
Ok(stream) => match cx.connect(&domain, stream).await {
35+
Ok(stream) => Ok(TlsConnection::from(stream)),
36+
Err(e) => Err(RSocketError::Other(e.into()).into()),
37+
},
38+
Err(e) => Err(RSocketError::IO(e).into()),
39+
},
40+
}
41+
}
42+
}
43+
44+
impl From<TlsStream<TcpStream>> for TlsClientTransport {
45+
fn from(stream: TlsStream<TcpStream>) -> Self {
46+
Self {
47+
connector: Connector::Direct(stream),
48+
}
49+
}
50+
}

rsocket-transport-tcp/src/client/uds.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::connection::UnixConnection;
22
use crate::misc::parse_uds_addr;
3-
use async_trait::async_trait;
3+
use rsocket_rust::async_trait;
44
use rsocket_rust::{error::RSocketError, transport::Transport, Result};
55
use tokio::net::UnixStream;
66

0 commit comments

Comments
 (0)