====== Self signed certificate ====== Mým cílem bylo vytvořit self-signed certifikát pro server. Zároveň jsem chtěl mít vytvořeno důvěryhodnou certifikační autoritu, kterou bych naimportoval do telefonu s Androidem. V rámci openssl jsem se docela potrápil s hledáním řešení. Nakonec jsem našel utilitu, která mi všechno potřebné vyřeší. Vygeneruje certifikační autoritu a vygeneruje certifikáty pro server (například pro NodeRed) a podepíše certifikát. Utilita se jmenuje [[https://github.com/FiloSottile/mkcert|mkcert]] a zafungovala mi perfektně. Jediná drobná komplikace je, že jsem si ji musel zkompilovat - je napsaná v jazyce GO. Doporučuji postupovat dle návodu na githubu, můj už nemusí být aktuální. V době zprovoznění jsem postupoval takto: sudo apt install libnss3-tools git clone https://github.com/FiloSottile/mkcert && cd mkcert go build -ldflags "-X main.Version=$(git describe --tags)" Po kompilaci už stačilo spustit příkaz, který vygeneroval jak CA, tak i certifikát pro server. Pokud chci certifikát pro více domén najednou, tak poslouží například: mkcert example.com "*.example.com" example.test Certifikát byl vygenerován pro server v požadovaném formátu. Takže jsem ho jenom přenesl na server. ===== Přenesení certifikační autority do telefonu - Android ===== Do telefonu je potřeba nainstalovat certifikační autoritu. Program ji vygeneroval hned na začátku. Její umístění zjistím: mkcert -CAROOT Certifikační autoritu jsem měl umístěnu zde: zenbook:~$ ls -l ~/.local/share/mkcert/ celkem 8 -r-------- 1 user group 2484 led 7 22:34 rootCA-key.pem -rw-r--r-- 1 user group 1688 led 7 22:34 rootCA.pem **rootCA-key.pem** je třeba chránit a nikam nepřenášet. Protože klíč podepisuje další certifikáty. Telefon pak přijme všechny certifikáty, vygenerované touto autoritou. Přenáším soubor **rootCA.pem**. Soubor jsem si uložil na GDrive a pak jsem šel v telefonu do **Nastavení-> Zabezpečení a poloha -> Rozšířené -> Šifrování a identifikační údaje -> Instalovat z úložiště**. Vybal jsem certifikační autoritu a povolil jsem ji pro VPN a aplikace. U telefonu jsem potřeboval certifikační autoritu v jiném formátu. Tento příkaz převede soubor CA.pem ve formátu PEM na soubor CA.crt ve formátu DER (CRT). openssl x509 -in rootCA.pem -outform DER -out CA.crt ===== Převod DER certifikátů pro Arduino ===== Potřeboval jsem použít certifikát pro připojení k MQTT serveru přes Arduino. Program pro Arduino je v C. Hledal jsem způsob v jakém formátu dodat certifikáty. Po nějaké době hledání jsem našel způsob. Použil jsem certifikáty v binárním formátu DER. A ty jsem převedl do hexadecimálního formátu skrze nástroj **xxd**. xxd -i client.crt > client_crt.h xxd -i client.key > client_key.h xxd -i ca.crt > ca_crt.h Tímto způsobem jsem získal soubory, ve kterých jsou certifikáty jako pole bajtů. V Arduionu jsem pak mohl načíst tyto soubory a použít: #include #include #include // Vložení certifikátů #include "client_crt.h" // klientův certifikát #include "client_key.h" // klientův klíč #include "ca_crt.h" // CA certifikát (pokud je potřeba) // ... [zbytek vašeho kódu] void setup() { // ... [připojení k WiFi a další nastavení] // Nastavení SSL/TLS certifikátů a klíčů // Proměnné předané v parametrech jsou v obsahu vygenerovaných souborů *.h BearSSL::X509List cert(cert_der, cert_der_len); BearSSL::PrivateKey key(key_der, key_der_len); BearSSL::X509List caCert(ca_der, ca_der_len); espClient.setInsecure(); espClient.setClientRSACert(&cert, &key); // Nastavení klientova certifikátu a klíče mqttClient.setServer(mqttBroker, mqttPort); // ... [nastavení MQTT klienta] } // ... [zbytek vašeho kódu] Ještě doplním, že protože používám self signed certifikát, vypínám ověření CA.