Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Následující verze | Předchozí verze | ||
| it:iot:self-signed-certificate [2023/01/08 17:54] – vytvořeno Petr Nosek | it:iot:self-signed-certificate [2024/01/01 13:51] (aktuální) – Petr Nosek | ||
|---|---|---|---|
| Řádek 3: | Řádek 3: | ||
| 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. | 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:// | + | Utilita se jmenuje [[https:// |
| + | 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: | ||
| + | |||
| + | <code bash> | ||
| + | sudo apt install libnss3-tools | ||
| + | git clone https:// | ||
| + | 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: | ||
| + | |||
| + | <code bash> | ||
| + | mkcert example.com " | ||
| + | </ | ||
| + | |||
| + | 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: | ||
| + | |||
| + | <code bash> | ||
| + | mkcert -CAROOT | ||
| + | </ | ||
| + | |||
| + | Certifikační autoritu jsem měl umístěnu zde: | ||
| + | |||
| + | <code bash> | ||
| + | zenbook:~$ ls -l ~/ | ||
| + | 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, | ||
| + | |||
| + | |||
| + | Soubor jsem si uložil na GDrive a pak jsem šel v telefonu do **Nastavení-> | ||
| + | |||
| + | |||
| + | 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). | ||
| + | |||
| + | <code bash> | ||
| + | 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**. | ||
| + | |||
| + | <code bash> | ||
| + | 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: | ||
| + | |||
| + | <code cpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Vložení certifikátů | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | // ... [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:: | ||
| + | BearSSL:: | ||
| + | BearSSL:: | ||
| + | | ||
| + | espClient.setInsecure(); | ||
| + | espClient.setClientRSACert(& | ||
| + | mqttClient.setServer(mqttBroker, | ||
| + | |||
| + | // ... [nastavení MQTT klienta] | ||
| + | } | ||
| + | |||
| + | // ... [zbytek vašeho kódu] | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | Ještě doplním, že protože používám self signed certifikát, | ||