diff --git a/protocol/dtls_session.py b/protocol/dtls_session.py index d86a6a8..d26fccb 100644 --- a/protocol/dtls_session.py +++ b/protocol/dtls_session.py @@ -22,6 +22,7 @@ import os import socket import threading import time +from pathlib import Path from OpenSSL import SSL @@ -37,6 +38,8 @@ import logging logger = logging.getLogger(__name__) +_OCF_ROOT_CA = str(Path(__file__).parent / 'ocf_root_ca.pem') + # Diagnostic logging — when DEBUG_BRIDGE=1 in env, the bridge dumps # every received CoAP frame, every /operational/state/vs/0 + /oven/vs/0 @@ -102,9 +105,13 @@ class DtlsCoapSession: """DTLS handshake. Blocks up to HANDSHAKE_TIMEOUT_S. Raises ConnectionError / TimeoutError on failure.""" ctx = SSL.Context(SSL.DTLS_METHOD) - ctx.set_verify(SSL.VERIFY_NONE, lambda *_: True) - # @SECLEVEL=0 — the AC14K_M-rooted chain is SHA-1 signed, which - # OpenSSL 3.x's default security level rejects. + + ctx.load_verify_locations(_OCF_ROOT_CA) + ctx.set_verify(SSL.VERIFY_PEER, lambda conn, cert, err, depth, ok: ok) + # @SECLEVEL=0 permits SHA-1 in Samsung's server cert chain (AC14K_M + # intermediate is SHA-1 signed). This is the only channel that reaches + # the OpenSSL instance cryptography bundles — ctypes and cffi bindings + # do not expose SSL_CTX_set_security_level on this build. ctx.set_cipher_list(b'ECDHE-ECDSA-AES128-GCM-SHA256:@SECLEVEL=0') ctx.use_certificate_chain_file(self.cert_path) ctx.use_privatekey_file(self.key_path) diff --git a/protocol/ocf_root_ca.pem b/protocol/ocf_root_ca.pem new file mode 100644 index 0000000..43f34a2 --- /dev/null +++ b/protocol/ocf_root_ca.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICXTCCAgGgAwIBAgIBATAMBggqhkjOPQQDAgUAMGsxKDAmBgNVBAMTH1NhbXN1 +bmcgRWxlY3Ryb25pY3MgT0NGIFJvb3QgQ0ExFDASBgNVBAsTC09DRiBSb290IENB +MRwwGgYDVQQKExNTYW1zdW5nIEVsZWN0cm9uaWNzMQswCQYDVQQGEwJLUjAgFw0x +NjExMjQwMjU1MTFaGA8yMDY5MTIzMTE0NTk1OVowazEoMCYGA1UEAxMfU2Ftc3Vu +ZyBFbGVjdHJvbmljcyBPQ0YgUm9vdCBDQTEUMBIGA1UECxMLT0NGIFJvb3QgQ0Ex +HDAaBgNVBAoTE1NhbXN1bmcgRWxlY3Ryb25pY3MxCzAJBgNVBAYTAktSMFkwEwYH +KoZIzj0CAQYIKoZIzj0DAQcDQgAEYsf/Kx+sUFBQESbuytTDPwLPIe0X/8/B1L7b +3abxE9w0gQZAfI8WYUkKfNfP7HXh1M5SCnOkfwWraltGOKTeX6OBkTCBjjAOBgNV +HQ8BAf8EBAMCAcYwMgYDVR0fBCswKTAnoCWgI4YhaHR0cDovL3Byb2RjYS5zYW1z +dW5naW90cy5jb20vY3JsMA8GA1UdEwEB/wQFMAMBAf8wNwYIKwYBBQUHAQEEKzAp +MCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5zYW1zdW5naW90cy5jb20wDAYIKoZI +zj0EAwIFAANIADBFAiARY9aSE30q31q5v8B4sJczBqOp7AsD9o8ZIuNmH7IwSwIh +ALfR56jcXoFis/nDx0tQ2xTI/f0b7F6tWPqj2vyKQeNR +-----END CERTIFICATE-----