Skip to content

Commit 67aaefb

Browse files
committed
feat: make both http & https functional
other changes include: - read cert and key from config - grammar fixes Signed-off-by: Rupanshi Jain <rupanshijain45678@gmail.com>
1 parent 63e04e0 commit 67aaefb

6 files changed

Lines changed: 111 additions & 69 deletions

File tree

admin-tool/src/aio/configure.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ pub(super) struct Configuration {
2525
#[clap(long, default_value_t = 8080)]
2626
pub listen_port_manufacturing_server: u16,
2727
#[clap(long, default_value_t = 8081)]
28-
pub listen_port_owner_onboarding_server: u16,
28+
pub listen_port_http_owner_onboarding_server: u16,
29+
#[clap(long, default_value_t = 8085)]
30+
pub listen_port_https_owner_onboarding_server: u16,
2931
#[clap(long, default_value_t = 8082)]
3032
pub listen_port_rendezvous_server: u16,
3133
#[clap(long, default_value_t = 8083)]
@@ -78,7 +80,8 @@ impl Default for Configuration {
7880

7981
listen_ip_address: String::from("0.0.0.0"),
8082
listen_port_manufacturing_server: 8080,
81-
listen_port_owner_onboarding_server: 8081,
83+
listen_port_http_owner_onboarding_server: 8081,
84+
listen_port_https_owner_onboarding_server: 8085,
8285
listen_port_rendezvous_server: 8082,
8386
listen_port_serviceinfo_api_server: 8083,
8487

@@ -155,7 +158,7 @@ impl Configuration {
155158
Ok(vec![fdo_data_formats::types::RemoteConnection::new(
156159
fdo_data_formats::types::RemoteTransport::Http,
157160
owner_addresses,
158-
self.listen_port_owner_onboarding_server,
161+
self.listen_port_http_owner_onboarding_server,
159162
)])
160163
}
161164

@@ -309,7 +312,17 @@ fn generate_configs(aio_dir: &Path, config_args: &Configuration) -> Result<(), E
309312
path: aio_dir.join("stores").join("owner_onboarding_sessions"),
310313
},
311314

312-
bind: get_bind(config_args.listen_port_owner_onboarding_server)?,
315+
owner_server_https_cert: AbsolutePathBuf::new(
316+
aio_dir.join("keys").join("owner_server_https_cert.crt"),
317+
)
318+
.unwrap(),
319+
owner_server_https_key: AbsolutePathBuf::new(
320+
aio_dir.join("keys").join("owner_server_https_key.key"),
321+
)
322+
.unwrap(),
323+
324+
bind_http: get_bind(config_args.listen_port_http_owner_onboarding_server)?,
325+
bind_https: get_bind(config_args.listen_port_https_owner_onboarding_server)?,
313326

314327
ownership_voucher_store_driver: StoreConfig::Directory {
315328
path: aio_dir.join("stores").join("owner_vouchers"),

admin-tool/src/aio/execute.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ impl ChildBinary {
203203
fn port(&self, config: &Configuration) -> u16 {
204204
match self {
205205
ChildBinary::ManufacturingServer => config.listen_port_manufacturing_server,
206-
ChildBinary::OwnerOnboardingServer => config.listen_port_owner_onboarding_server,
206+
ChildBinary::OwnerOnboardingServer => config.listen_port_http_owner_onboarding_server,
207207
ChildBinary::RendezvousServer => config.listen_port_rendezvous_server,
208208
ChildBinary::ServiceInfoApiServer => config.listen_port_serviceinfo_api_server,
209209
_ => unreachable!(),

owner-onboarding-server/src/main.rs

Lines changed: 64 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::convert::{TryFrom, TryInto};
22
use std::fs;
3-
use std::net::SocketAddr;
43
use std::sync::Arc;
54

65
use anyhow::{bail, Context, Result};
@@ -38,12 +37,13 @@ use std::convert::Infallible;
3837
use tls_listener::TlsListener;
3938

4039
pub mod tls_config;
40+
use tls_config::tls_acceptor;
4141

4242
mod handlers;
4343
mod ov_management;
4444
use crate::ov_management::ov_filter;
4545

46-
pub(crate) struct OwnerServiceUD {
46+
pub struct OwnerServiceUD {
4747
// Trusted keys
4848
#[allow(dead_code)]
4949
trusted_device_keys: X5Bag,
@@ -58,6 +58,8 @@ pub(crate) struct OwnerServiceUD {
5858
>,
5959
>,
6060
session_store: Arc<fdo_http_wrapper::server::SessionStore>,
61+
owner_server_https_cert: AbsolutePathBuf,
62+
owner_server_https_key: AbsolutePathBuf,
6163

6264
// Our keys
6365
owner_key: PKey<Private>,
@@ -285,8 +287,8 @@ async fn main() -> Result<()> {
285287
.context("Error parsing configuration")?;
286288

287289
// Bind information
288-
let bind_addr = settings.bind.clone();
289-
let addr = SocketAddr::from(([0, 0, 0, 0], 8081));
290+
let bind_http_addr = settings.bind_http.clone();
291+
let bind_https_addr = settings.bind_https.clone();
290292

291293
// Trusted keys
292294
let trusted_device_keys = {
@@ -352,6 +354,8 @@ async fn main() -> Result<()> {
352354
// Stores
353355
ownership_voucher_store,
354356
session_store: session_store.clone(),
357+
owner_server_https_cert: settings.owner_server_https_cert,
358+
owner_server_https_key: settings.owner_server_https_key,
355359

356360
// Trusted keys
357361
trusted_device_keys,
@@ -424,56 +428,75 @@ async fn main() -> Result<()> {
424428
let routes = warp::post()
425429
.and(
426430
hello
427-
.or(handler_ping)
428-
.or(handler_report_to_rendezvous)
431+
.or(handler_ping.clone())
432+
.or(handler_report_to_rendezvous.clone())
429433
// TO2
430-
.or(handler_to2_hello_device)
431-
.or(handler_to2_get_ov_next_entry)
432-
.or(handler_to2_prove_device)
433-
.or(handler_to2_device_service_info_ready)
434-
.or(handler_to2_device_service_info)
435-
.or(handler_to2_done)
434+
.or(handler_to2_hello_device.clone())
435+
.or(handler_to2_get_ov_next_entry.clone())
436+
.or(handler_to2_prove_device.clone())
437+
.or(handler_to2_device_service_info_ready.clone())
438+
.or(handler_to2_device_service_info.clone())
439+
.or(handler_to2_done.clone())
436440
.or(ov_filter(user_data.clone())),
437441
)
438442
.recover(fdo_http_wrapper::server::handle_rejection)
439-
.with(warp::log("owner-onboarding-service"));
443+
.with(warp::log(
444+
"owner-onboarding-service to handle http and https",
445+
));
440446

441-
log::info!("Listening on {}", addr);
442-
443-
let service = warp::service(routes);
447+
let service = warp::service(routes.clone());
444448

445449
let make_svc = hyper::service::make_service_fn(move |_| {
446450
let svc = service.clone();
447451
async move { Ok::<_, Infallible>(svc) }
448452
});
449453

450454
let incoming = TlsListener::new(
451-
tls_config::tls_config::tls_acceptor(),
452-
AddrIncoming::bind(&addr)?,
455+
tls_acceptor(user_data.clone()),
456+
AddrIncoming::bind(&bind_https_addr.into())?,
457+
);
458+
let https_server = hyper::Server::builder(incoming).serve(make_svc);
459+
let https_server = https_server.with_graceful_shutdown(async {
460+
signal(SignalKind::terminate()).unwrap().recv().await;
461+
log::info!("Terminating HTTPS server");
462+
});
463+
let https_server_handle = tokio::spawn(https_server);
464+
465+
let http_server = warp::serve(routes.clone());
466+
let http_server = http_server
467+
.bind_with_graceful_shutdown(bind_http_addr, async {
468+
signal(SignalKind::terminate()).unwrap().recv().await;
469+
log::info!("Terminating HTTP server");
470+
})
471+
.1;
472+
let http_server_handle = tokio::spawn(http_server);
473+
474+
let maintenance_runner_handle =
475+
tokio::spawn(async move { perform_maintenance(user_data.clone()).await });
476+
477+
log::info!("starting both servers with http & https support");
478+
// Join all the three handlers and wait
479+
let (http_result, https_result, maintenance_result) = tokio::join!(
480+
http_server_handle,
481+
https_server_handle,
482+
maintenance_runner_handle
453483
);
454-
let server = hyper::Server::builder(incoming).serve(make_svc);
455-
log::info!("starting at https://{}", addr);
456-
server.await?;
457-
// let server = warp::serve(routes);
458-
459-
// let maintenance_runner =
460-
// tokio::spawn(async move { perform_maintenance(user_data.clone()).await });
461-
462-
// let server = server
463-
// .bind_with_graceful_shutdown(bind_addr, async {
464-
// signal(SignalKind::terminate()).unwrap().recv().await;
465-
// log::info!("Terminating");
466-
// })
467-
// .1;
468-
// let server = tokio::spawn(server);
469-
470-
// tokio::select!(
471-
// _ = server => {
472-
// log::info!("Server terminated");
473-
// },
474-
// _ = maintenance_runner => {
475-
// log::info!("Maintenance runner terminated");
476-
// });
484+
485+
// Check the results and handle accordingly since we have joined
486+
match http_result {
487+
Ok(_) => log::info!("HTTP server terminated successfully"),
488+
Err(err) => log::error!("HTTP server terminated with an error: {:?}", err),
489+
}
490+
491+
match https_result {
492+
Ok(_) => log::info!("HTTPS server terminated successfully"),
493+
Err(err) => log::error!("HTTPS server terminated with an error: {:?}", err),
494+
}
495+
496+
match maintenance_result {
497+
Ok(_) => log::info!("Maintenance runner terminated successfully"),
498+
Err(err) => log::error!("Maintenance runner terminated with an error: {:?}", err),
499+
}
477500

478501
Ok(())
479502
}

owner-onboarding-server/src/ov_management/mod.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ pub(crate) fn ov_filter(
2626
.and(warp::body::bytes())
2727
.map(move |count, content_type, body| (count, content_type, body, session_store.clone()))
2828
.untuple_one()
29-
.and_then(add_ov);
29+
.and_then(add_ov)
30+
.recover(recover_err);
3031

3132
let delete = baseurl
3233
.and(warp::post())
@@ -139,8 +140,8 @@ async fn add_ov(
139140
StatusCode::BAD_REQUEST,
140141
)));
141142
}
142-
ErrorCode::InvalidVoucherSignatureDescription() => {
143-
let message = ErrorCode::generate(ErrorCode::InvalidVoucherSignature(i));
143+
ErrorCode::InvalidVoucherSignaturesDescription() => {
144+
let message = ErrorCode::generate(ErrorCode::InvalidVoucherSignatures(i));
144145
return Ok(Box::new(warp::reply::with_status(
145146
warp::reply::json(&message),
146147
StatusCode::BAD_REQUEST,
@@ -253,13 +254,13 @@ async fn recover_err(e: Rejection) -> Result<impl warp::Reply, warp::Rejection>
253254
enum ErrorCode {
254255
#[error("Voucher count should be positive integer")]
255256
VoucherCountError,
256-
#[error("Content-type should be application/x-pem-file,application/cbor")]
257+
#[error("Content-type should be application/x-pem-file or application/cbor")]
257258
RequireContentTypeHeader,
258259
#[error("Ownership voucher not found")]
259260
NoOwnershipVoucherFound,
260261
#[error("Unable to parse UUID")]
261262
UuidParseError,
262-
#[error("Pem format error")]
263+
#[error("PEM format error")]
263264
ParseError,
264265
#[error("{0}")]
265266
StoreError(String),
@@ -270,17 +271,17 @@ enum ErrorCode {
270271
#[error("{0:?}")]
271272
UnknownDevice(Vec<String>),
272273
#[error("Voucher signature not valid")]
273-
InvalidVoucherSignature(usize),
274+
InvalidVoucherSignatures(usize),
274275
#[error("Incomplete Voucher")]
275276
IncompleteVoucher(usize),
276-
#[error("Error parsing pem file")]
277+
#[error("Error parsing PEM file")]
277278
PemParseError(usize),
278279
#[error("")]
279280
PemParseErrorDescription(),
280281
#[error("")]
281282
IncompleteVoucherDescription(),
282283
#[error("")]
283-
InvalidVoucherSignatureDescription(),
284+
InvalidVoucherSignaturesDescription(),
284285
#[error("Something is wrong here, please try again")]
285286
MiscError,
286287
}
@@ -310,7 +311,7 @@ impl ErrorCode {
310311
error_details: json! ({"error": ErrorCode::ParseError.to_string()})
311312
}),
312313
ErrorCode::InvalidNumberOfVouchers(e) => json!(ErrorMsg {
313-
error_code: "invalid_number_of_voucher",
314+
error_code: "invalid_number_of_vouchers",
314315
error_details: json!({ "parsed": e })
315316
}),
316317
ErrorCode::UnwonedVoucher(e) => json!(ErrorMsg {
@@ -321,9 +322,9 @@ impl ErrorCode {
321322
error_code: "unknown_device",
322323
error_details: json!({ "unknown": e })
323324
}),
324-
ErrorCode::InvalidVoucherSignature(idx) => json!(ErrorMsg {
325-
error_code: "invalid_voucher_signature",
326-
error_details: json! ({"failed_at_index": idx,"description": &ErrorCode::InvalidVoucherSignature(idx).to_string()})
325+
ErrorCode::InvalidVoucherSignatures(idx) => json!(ErrorMsg {
326+
error_code: "invalid_voucher_signatures",
327+
error_details: json! ({"failed_at_index": idx,"description": &ErrorCode::InvalidVoucherSignatures(idx).to_string()})
327328
}),
328329
ErrorCode::IncompleteVoucher(idx) => json!(ErrorMsg {
329330
error_code: "incomplete_voucher",
@@ -344,14 +345,13 @@ fn validate_ov<'a>(
344345
) -> Result<bool, ErrorCode> {
345346
ov.iter_entries()
346347
.map_err(|_e| ErrorCode::PemParseErrorDescription())?
347-
.into_iter()
348348
.next()
349349
.ok_or(|| ErrorCode::ParseError)
350350
.map_err(|_| ErrorCode::ParseError)?
351351
.map_err(|_e| ErrorCode::IncompleteVoucherDescription())?
352352
.public_key()
353353
.matches_pkey(owner_key)
354-
.map_err(|_e| ErrorCode::InvalidVoucherSignatureDescription())
354+
.map_err(|_e| ErrorCode::InvalidVoucherSignaturesDescription())
355355
}
356356

357357
fn validate_count(count: HeaderValue) -> Result<usize, ErrorCode> {
Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
pub mod tls_config {
2+
use crate::OwnerServiceUD;
23
use openssl::ssl::{SslContext, SslFiletype, SslMethod};
34
use std::path::Path;
5+
use std::sync::Arc;
46
pub type Acceptor = openssl::ssl::SslContext;
57

6-
fn tls_acceptor_impl<P: AsRef<Path>>(cert_file: P, key_file: P) -> Acceptor {
7-
8+
fn tls_acceptor_impl<P: AsRef<Path>>(cert_file: P, key_file: P) -> Acceptor {
89
let mut builder = SslContext::builder(SslMethod::tls_server()).unwrap();
910
builder
1011
.set_certificate_file(cert_file, SslFiletype::PEM)
1112
.unwrap();
1213
builder
1314
.set_private_key_file(key_file, SslFiletype::PEM)
14-
.unwrap();
15+
.unwrap();
1516
builder.build()
1617
}
1718

18-
pub fn tls_acceptor() -> Acceptor {
19-
tls_acceptor_impl(
20-
"/workspaces/fido-device-onboard-rs/server.crt",
21-
"/workspaces/fido-device-onboard-rs/server.key",
22-
)
19+
pub fn tls_acceptor(user_data: Arc<OwnerServiceUD>) -> Acceptor {
20+
let cert_file = &user_data.owner_server_https_cert;
21+
let key_file = &user_data.owner_server_https_key;
22+
tls_acceptor_impl(cert_file, key_file)
2323
}
2424
}
25+
26+
pub use tls_config::tls_acceptor;
27+
pub use tls_config::Acceptor;

util/src/servers/configuration/owner_onboarding_server.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ pub struct OwnerOnboardingServerSettings {
2020
// Our private owner key
2121
pub owner_private_key_path: AbsolutePathBuf,
2222
pub owner_public_key_path: AbsolutePathBuf,
23+
pub owner_server_https_cert: AbsolutePathBuf,
24+
pub owner_server_https_key: AbsolutePathBuf,
2325

2426
// Bind information
25-
pub bind: Bind,
27+
pub bind_http: Bind,
28+
pub bind_https: Bind,
2629

2730
// Service Info API Server
2831
pub service_info_api_url: String,

0 commit comments

Comments
 (0)