Bonsoir à tous,
Alors voilà ce que je souhaite faire, en essayant d'être le plus clair possible.
J'ai conçu une passerelle ZigBee/Ethernet avec tout un écosystème de recueil de données à distance. C'est bien sûr la partie que je maitrise.
Pour "faire passer" les données UART Zigbee vers Ethernet et inversement, et pour ce dernier, j'utilise un module xPortEDGE qui gère tout un tas de protocoles réseaux comme TCP, UDP, MQTT... en tant que serveur ou client. Mais surtout offre une couche supplémentaire de sécurité comme TLS (1.0 - 1.1 - 1.2) ou AES.
Le domaine qui est bloquant pour moi, ce sont les possibilités étendues que permet la connexion TLS. Car comme vous l'avez compris, je ne suis pas un expert dans cet aspect crypto de la couche TCP. Mais j'ai bien fouiné le web pour mieux en comprendre les mécanismes.
TLS 1.2 vieillit doucement et TLS 1.3 est disponible depuis maintenant pas mal de temps (2018)
La réponse est simple, ce module ne prend pas encore en charge cette évolution. Mais au vu des mises à jour régulières, j'estime que TLS1.3 viendra.
La chose pour mes essais se résume à :
- l'objet IoT Ethernet connecté à un serveur (Node-Red) en réseau local.
- l'objet IoT Ethernet connecté à un serveur (Node-Red) Internet.
Les caractéristiques de config TLS coté serveur ne sont à priori pas contraignantes :
Les caractéristiques de config TLS coté client, soit mon module se présente comme ceci :
Plus présicément, la doc constructeur indique ceci :
Data Communication Security (TLS)
Transport Layer Security (TLS) and its predecessor, Secure Sockets Layer (SSL), use asymmetric encryption for authentication. In some scenarios, only a server needs to be authenticated, in others both client and server authenticate each other. Once authentication is established, clients and servers use asymmetric encryption to exchange a secret key. Communication then proceeds with symmetric encryption, using this key.
TLS/SSL application hosts use separate digital certificates as a basis for authentication in both directions: to prove their own identity to the other party, and to verify the identity of the other party. In proving its own authenticity, the XPort EDGE will use its own "personal" certificate. In verifying the authenticity of the other party, the XPort EDGE module will use a "trusted authority" certificate.
On the gateway, you use a TLS Credential to configure the TLS properties between two communicating applications.
Creating a TLS Credential
The TLS Credential contains the private key and certificate details. You can use TLS for TCP and UDP connections as well as for secure HTTP Server.
Note
The xPort EDGE supports TLS credentials only in the PKCS1 and PKCS12 formats (PKCS12 via Web Manager only).
Les exigences du modules sont donc :
- Format de cryptage : PKSC1 ou PKSC12
- Fichier en format PEM
- Nombre d'octets KEY, CERT, CA, ROOT CA : 4000 bytes.
Ce que j'arrive à faire aujourd'hui (avec ma propre compréhension):
Sachant que :
- Client IP (module) : 192.168.1.17
- Server IP : 192.168.1.36
- Communication TLS établie sans vérification du client
C'est la première chose que j'ai essayé et qui à fonctionné du premier coup :
- Coté serveur : j'installe un certificat auto-signé ainsi que sa clé privée RSA 2048.
- Coté client : J'active TLS, mais je laisse tous les champs vierges
- Communication TLS établie avec vérification du client Ce qu'ils appellent, "Asymmetric encryption" ?
Je viens tout juste de réussir à faire cela :
- Coté serveur : j'installe un certificat auto-signé ainsi que sa clé privée RSA 2048.
- Coté client : j'installe un certificat auto-signé ainsi que sa clé privée RSA 2048.
- Pour les 2 : J'installe l'Autorité de Certification (CA) (même fichier) qui a signé le certificat serveur d'une part, le certificat client d'un autre part.
Maintenant, voici ce que j'ai fait pour ce dernier cas avec OpenSSH :
J'admet volontier avoir pondu ça en partie grâce à de l'IA
1. Création de l'Autorité de Certification (CA)
Génération de la clé privée de la CA :
Génération du certificat auto-signé de la CA :
Code : Tout sélectionner
openssl req -x509 -new -nodes -key ca.key -sha256 -days 1825 -out ca.crt
Ici, lors des renseignement demandés, je renseigne CN avec un nom générique.
2. Génération des certificats pour Node-RED et xPortEdge
Pour Node-RED : Serveur
Génération de la clé privée :
Création de la demande de signature de certificat (CSR) :
Ici, lors des renseignement demandés, je renseigne CN avec l'IP du serveur soit :
192.168.1.36.
Configuration des extensions pour le certificat de Node-RED : Création nodered.ext avec le contenu suivant :
Code : Tout sélectionner
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
Il y a là une demande d'identification de la part du client ?
Signer le certificat de Node-RED avec la CA :
Code : Tout sélectionner
openssl x509 -req -in nodered.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out nodered.crt -days 365 -sha256 -extfile nodered.ext
Convertir la clé privée et le certificat au format PEM PKCS#1 :
Code : Tout sélectionner
openssl rsa -in nodered.key -outform PEM -out nodered.pem
openssl x509 -in nodered.crt -outform PEM -out nodered-cert.pem
Pour xPortEdge : Client
Génération de la clé privée :
Création de la demande de signature de certificat (CSR) :
Ici, lors des renseignement demandés, je renseigne CN avec l'IP du module client soit :
192.168.1.17.
Configuration des extensions pour le certificat de xPortEdge : Création fichier xportedge.ext avec le contenu suivant :
Code : Tout sélectionner
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = clientAuth
Il y a là une demande d'identification de la part du Serveur ?
Signer le certificat de xPortEdge avec la CA :
Code : Tout sélectionner
openssl x509 -req -in xportedge.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out xportedge.crt -days 365 -sha256 -extfile xportedge.ext
Convertir la clé privée et le certificat au format PEM PKCS#1 :
Code : Tout sélectionner
openssl rsa -in xportedge.key -outform PEM -out xportedge.pem
openssl x509 -in xportedge.crt -outform PEM -out xportedge-cert.pem
3. Configuration de Node-RED
Comme dans la capture d'écran ci-dessus pour le serveur, j'uploade ces 3 fichiers :
nodered.pem
nodered-cert.pem
ca.crt
4. Configuration de xPortEdge
Comme dans la capture d'écran ci-dessus pour le module client, je copie colle le contenu de ces 3 fichiers :
xportedge.pem
xportedge-cert.pem
ca.crt.
Ce que je ne comprend pas :
Pour ce dernier cas, où j'estime que seuls mes modules xPortEdge client peuvent ce connecter au serveur, quel type de CA ai-je généré car il y a CA et CA racine ... et pour preuve :
Dans la capture ci-dessous que je vous remet, j'avais apparemment fait une erreur.
- CA copié/collé dans Certificate Higher Authority ---> ERR_CERT_CHAIN_NO_TRUST_ANCHOR venant du xPortEdge
- CA copié/collé dans Certificate Trusted Authority ---> ça fonctionne.

Quelle différence ?

Ensuite, quel intérêt dans ce module d'avoir plusieurs possibilité de CA racines ou de confiances ?

Pour finir comment remplit-on correctement les renseignements au moment de la demande de signature de certificat que ce soit pour la partie client (dont l'IP peut-être changeante) ou serveur (entre IP, nom de domaine etc...) surtout pour le champ CN (Nom commun) ?
Voilà désolé pour ce pavé bien pesant, mais en espérant avoir été assez clair
Et merci d'avance pour votre aide
Sylvain
PC fixe HP | CPU i7-3770 4 cœurs @ 3.6GHz | 16Go ram | GPU Nvidia 750Ti | Dual Boot Mint Cinnamon 20.03 vs Win10 | 3 écrans