| Gabriel Cuba | f734996 | 2023-04-26 12:01:25 -0500 | [diff] [blame] | 1 | from base64 import b64decode |
| Gabriel Cuba | 8b7a395 | 2022-11-02 17:21:50 -0500 | [diff] [blame] | 2 | import logging |
| 3 | import ssl |
| Gabriel Cuba | f734996 | 2023-04-26 12:01:25 -0500 | [diff] [blame] | 4 | from .util_kubernetes import get_secret_data |
| Gabriel Cuba | 8b7a395 | 2022-11-02 17:21:50 -0500 | [diff] [blame] | 5 | |
| 6 | logger = logging.getLogger("osm_ee.util_grpc") |
| Gabriel Cuba | f734996 | 2023-04-26 12:01:25 -0500 | [diff] [blame] | 7 | SERVER_CERT_SECRET = "ee-tls" |
| 8 | CLIENT_CA_SECRET = "osm-ca" |
| 9 | SERVER_CERT_FILE = "/etc/ssl/ee-tls.crt" |
| 10 | SERVER_KEY_FILE = "/etc/ssl/ee-tls.key" |
| 11 | CLIENT_CA_FILE = "/etc/ssl/osm-ca.crt" |
| Gabriel Cuba | 8b7a395 | 2022-11-02 17:21:50 -0500 | [diff] [blame] | 12 | |
| 13 | |
| 14 | def create_secure_context() -> ssl.SSLContext: |
| Gabriel Cuba | f734996 | 2023-04-26 12:01:25 -0500 | [diff] [blame] | 15 | # retrieve certificates from secrets |
| 16 | if not _retrieve_certs(): |
| 17 | logger.warning("TLS Certificates not found, starting gRPC server in unsecure mode") |
| Gabriel Cuba | 8b7a395 | 2022-11-02 17:21:50 -0500 | [diff] [blame] | 18 | return None |
| Gabriel Cuba | f734996 | 2023-04-26 12:01:25 -0500 | [diff] [blame] | 19 | # create SSL context |
| 20 | ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) |
| 21 | ctx.verify_mode = ssl.CERT_REQUIRED |
| 22 | ctx.load_cert_chain(SERVER_CERT_FILE, SERVER_KEY_FILE) |
| 23 | ctx.load_verify_locations(CLIENT_CA_FILE) |
| Gabriel Cuba | 8b7a395 | 2022-11-02 17:21:50 -0500 | [diff] [blame] | 24 | ctx.set_ciphers('ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20') |
| 25 | ctx.set_alpn_protocols(['h2']) |
| 26 | try: |
| 27 | ctx.set_npn_protocols(['h2']) |
| 28 | except NotImplementedError: |
| 29 | pass |
| Gabriel Cuba | f734996 | 2023-04-26 12:01:25 -0500 | [diff] [blame] | 30 | return ctx |
| 31 | |
| 32 | |
| 33 | def _retrieve_certs(): |
| 34 | _server_data = get_secret_data(SERVER_CERT_SECRET) |
| 35 | lcm_ca = get_secret_data(CLIENT_CA_SECRET).get("ca.crt") |
| 36 | if not (_server_data and lcm_ca): |
| 37 | return False |
| 38 | server_cert = _server_data.get("tls.crt") |
| 39 | with open(SERVER_CERT_FILE, "w") as server_cert_file: |
| 40 | server_cert_file.write(b64decode(server_cert).decode()) |
| 41 | server_key = _server_data.get("tls.key") |
| 42 | with open(SERVER_KEY_FILE, "w") as server_key_file: |
| 43 | server_key_file.write(b64decode(server_key).decode()) |
| 44 | with open(CLIENT_CA_FILE, "w") as client_ca_file: |
| 45 | client_ca_file.write(b64decode(lcm_ca).decode()) |
| 46 | return True |