Client Broker Server Interaction Use cases - LLNL-Collaboration/uiuc2015 GitHub Wiki
Using Broker to help establish an SSH tunnel a general TCP/IP socket server.
client: ssh to host
client(via ssh): start server on host
server --> broker: register service and request port
broker: generate port, establish ssh tunneling for port, generate magic key
broker --> server: return port
server: open socket server on port
client(via ssh) --> broker : request port #, magic key
client: establish other end of the ssh tunnel
client: open socket to server
client(via socket) --> server: provide magic key
server --> broker: verify magic key
- if verify fails: close socket connection to client
- if verify passes: start general communication over socket.
Using Broker to help establish a trusted HTTPS connection between a client and server
server --> broker: register service and request port
broker: generate port,generate magic key, create ssl cert, (future: register ssl cert with trusted ca)
broker --> server: return port, ssl cert path
server: open https server on port using ssl cert
client(via ssh, or something like lorenz) --> broker : request port #, magic key
client: open https connection to server (via web browser)
client(https) --> server: provide magic key
server --> broker: verify magic key
- if verify fails: close https connection to client
- if verify passes: allow web traffic
Broker Functionality
From these two cases, here are the things the broker must support:
-
(register/save) Request: register service (by name) and request port
-
SSH Case:
- Action: establish ssh tunneling for port, generate magic key
- Reply: port
-
HTTPS Case:
- Action: generate port,generate magic key, create ssl cert, (future: register ssl cert with trusted ca)
- Reply: port, path to ssl cert
-
(load) Request: give info about an active service (by name?)
-
Action: look up and give info about active service (maybe help with client ssh tunnel?)
-
Reply: port, magic key
-
(verify) Request: verify magic key
-
Action: check magic key against know key
-
Reply: pass or fail
-
(query) Request: list open services
-
Action: query active registrations by name
-
Reply: list of registered services that match query
For Lorenz, or stand alone apps to use this these request should be support via a shell command, or a python library.
Notes / Quandaries:
- N: In the above cases, the key exchange always happens via an already approved trusted channel (ssh, or lorenz)
- Q: Instead of magic key for the HTTPS case, can we create public / private keys for the client that the https server can use to only allow that client to connect? Not commonly done, but I think TLS (https) supports this.
- Q: For HTTPS case, instead of per service certs, and we use two certs per user (one for any server and on for any client)?