Changelog
Všechny významné změny v projektu Let's Encrypt Wizard.
Formát vychází z Keep a Changelog a verzování se řídí Semantic Versioning 2.0.0.
Pravidlo verzování (závazné)
Každý merge do main MUSÍ:
- Zvýšit
versionv souboruversion.json - Aktualizovat
released(datum publikace, formátYYYY-MM-DD) - Přidat záznam do tohoto
CHANGELOG.mdpod novou sekci s verzí a datem - Verze se v patičce wizardu načítá z
version.jsonautomaticky — neměň ji v HTML
Pravidla pro increment verze (MAJOR.MINOR.PATCH):
| Změna | Co povýšit |
|---|---|
| Breaking change (změna výstupních skriptů, která rozbije existující nasazení) | MAJOR (1.0.0 → 2.0.0) |
| Nová funkce / nový scénář / nový generátor | MINOR (1.2.0 → 1.3.0) |
| Bugfix, oprava textu, drobné UI tweaky, dokumentace | PATCH (1.2.3 → 1.2.4) |
Kategorie změn v záznamu: Přidáno, Změněno, Opraveno, Odebráno, Bezpečnost.
Unreleased
[1.4.1] - 2026-07-22
Opraveno
- Stepper už nedovolí přeskočit na nenavštívené kroky.
validateStep(6)vrací vždytrue, takže šlo z kroku 1 kliknout rovnou na „Výstup" a vygenerovat skripty sundefinedmísto domény. Klik nyní vyžaduje, aby byl krok už navštíven (maxStep). systemd-override.confnahrazen spustitelnýmsetup-renewal.sh. Původní soubor míchal[Timer]override a#!/bin/shhook do jednoho — nešel použít ani jako systemd unit, ani jako skript. Nový skript nainstaluje reload deploy-hook do/etc/letsencrypt/renewal-hooks/deploy/(certbot ho spouští jen po úspěšné obnově) a vypíše stavcertbot.timer, který obnovu řídí sám..ps1soubory se stahují s UTF-8 BOM. PowerShell 5.1 čte.ps1bez BOM jako ANSI, takže české/lokalizované texty ve výpisech se rozsypaly. Platí pro ZIP i jednotlivá stažení;.shsoubory zůstávají bez BOM (bash by BOM před shebang řádkem nesnesl).- Výběr certifikátu podle přesné shody domény (
DnsNameList) místoSubject -like "*…*". Substring dříve mohl vybrat certifikát jiné domény (např.jina-pohoda.firma.czpři hledánípohoda.firma.cz); u wildcard certů se*v doméně navíc chovalo jako žolík. Platí proexport-pem.ps1,deploy-mserver.ps1,deploy-iis.ps1i cleanup vissue.ps1; deploy skripty nově vybírají jen certifikáty s privátním klíčem (jinaknetshkončil chybou 1312). - ECDSA certifikát dostane srozumitelnou chybu. Export umí jen RSA (PKCS#1); u EC klíče skript dosud hlásil zavádějící „privátní klíč nenalezen" (a renewal hook padal na NullReference). Nově obě místa vysvětlí, že je potřeba RSA klíč (win-acme default).
install.ps1je odolnější: selhání GitHub API (síť, rate limit 60 req/h na IP) a chybějící release asset končí srozumitelnou chybou s odkazem na ruční stažení místo kryptického pádu.
[1.4.0] - 2026-07-22
Opraveno
- Windows + HTTP-01 webroot už negeneruje IIS skript. Kombinace padala do else větve s
--source iis --siteid 1, což na serveru bez IIS (typicky Pohoda mServer) nedávalo smysl — win-acme by četl domény z neexistující IIS site. Nově má kombinace vlastní větev:--source manual --validation filesystem --webroot <cesta>(webroot z kroku 4 musí obsluhovat port 80 dané domény). Nový i18n klíčscripts.httpWebrootWinDesc.
Přidáno
- Select webserverů v kroku 4 se filtruje podle zvoleného OS — IIS a Pohoda mServer jsou nabízeny jen na Windows, unixové webservery (nginx, Apache, HAProxy, Caddy) jen na Linuxu. Neplatná kombinace (změna OS, starý localStorage) se automaticky resetuje na rozumný default (Windows → IIS, Linux → nginx) včetně reload příkazu. Dříve šlo zvolit např. Debian + Pohoda mServer a deploy skript pak mlčky nic nedělal.
Změněno
- Mapa reload příkazů vytažena do konstanty
RELOAD_CMDS(sdílí ji change handler i reset neplatné kombinace).
[1.3.9] - 2026-07-22
Opraveno
- Renewal hook pro Pohoda mServer se nyní skutečně registruje do win-acme.
issue.ps1dosud vytvářel renewal bez--installation script, takže po automatické obnově (Scheduled Task, ~60 dní) serenewal-hook-mserver.ps1nikdy nespustil —netshbinding i PEM soubory zůstaly na starém certifikátu a HTTPS by po expiraci přestalo důvěryhodně fungovat. Nověissue.ps1hook sám zkopíruje doC:\Program Files\win-acme\Scripts\a předá win-acme přes--installation script+--scriptparameterss tokeny{CertThumbprint}/{CertFriendlyName}. Hook se spouští i při prvním vystavení, takže binding a PEM export proběhnou automaticky. - Pokud
renewal-hook-mserver.ps1neleží vedleissue.ps1, skript skončí srozumitelnou chybou místo vytvoření renewalu s nefunkčním instalačním skriptem. Nové i18n klíčescripts.hookSetupDesc/hookCopied/hookSrcMissingve všech 6 jazycích.
Změněno
docs/pohoda-mserver.md: sekce o obnově popisuje automatickou registraci hooku (ruční kopírování už není potřeba).- Text
scripts.dnsCloudflareDesctvrdil, že „win-acme si Cloudflare plugin stáhne automaticky" — nestáhne; plugin instalujeinstall.ps1(od v1.3.8). Opraveno ve všech jazycích.
[1.3.8] - 2026-07-22
Opraveno
install.ps1nyní instaluje i Cloudflare DNS validační plugin pro win-acme. Plugin není součástí hlavního balíčku (anipluggablevarianty) — je to samostatný assetplugin.validation.dns.cloudflare.*v GitHub release, který se musí rozbalit vedlewacs.exe. Bez nějissue.ps1s--validation cloudflareselhal na neznámém validačním pluginu, takže doporučená cesta průvodce (DNS-01 přes Cloudflare na Windows) nebyla vůbec funkční. Blok se generuje jen při zvolené Cloudflare validaci; pokud je plugin už nainstalovaný (*Cloudflare*.dllvedlewacs.exe), přeskočí se. Nové i18n klíčescripts.cfPlugin*ve všech 6 jazycích.
[1.3.7] - 2026-07-22
Opraveno
netsh http add sslcertvdeploy-mserver.ps1arenewal-hook-mserver.ps1nikdy nemohl uspět —appidpoužíval pseudo-GUID{a17a0a91-9b3b-4b1e-9b1e-pohoda0mserver}, jehož poslední skupina obsahuje nehexadecimální znaky (a má 14 znaků místo 12).netshtakový parametr odmítne („The parameter is incorrect."), a protože skript návratový kód nekontroloval, smazal starý binding, vypsal „Hotovo" a port zůstal bez certifikátu.appidje nyní validní GUID{a17a0a91-9b3b-4b1e-9b1e-a17a0a919b3b}.- Selhání
netsh http add sslcertse nyní detekuje kontrolou$LASTEXITCODEa skript skončí chybou s vysvětlením —$ErrorActionPreference = 'Stop'selhání nativních příkazů nezachytí. Platí pro oba skripty; nový i18n klíčscripts.netshAddFailedve všech 6 jazycích.
Změněno
deploy-mserver.ps1volánetshpřímo místo skládání příkazu do řetězce aInvoke-Expression.
[1.3.6] - 2026-07-22
Opraveno
mserver-cert.pemamserver.pemnyní obsahují celý certifikační řetězec (fullchain).export-pem.ps1irenewal-hook-mserver.ps1dosud exportovaly pouze koncový certifikát (Export-PfxCertificate -ChainOption EndEntityCertOnly+ zápis samotnéhoRawData), takže v PEM chyběl intermediate certifikát Let's Encrypt. Klienti, kteří neprovádějí AIA fetching (většina TLS knihoven), pak nemohli sestavit řetězec a certifikát odmítli jako nedůvěryhodný. Nově se exportuje s-ChainOption BuildChain(s fallbackem na samotný koncový certifikát, pokud řetězec nelze sestavit) a do PEM se zapisuje koncový certifikát + všechny intermediate certifikáty; self-signed root CA se vynechává (stejná konvence jako certbotfullchain.pem).- PEM se generuje s řádky Base64 po 64 znacích dle RFC 7468 — dříve 76 znaků přes
[Convert]::ToBase64String(..., 'InsertLineBreaks'), což striktní parsery odmítají. Platí pro certifikát i privátní klíč, v obou skriptech. - Popisek
scripts.exportPemDesc(ve všech jazycích) zmiňoval zastaralé názvy souborůmserver.crt+mserver.key— soubory se od v1.3.5 jmenujímserver-cert.pem+mserver-key.pem.
[1.3.5] - 2026-05-27
Opraveno
- Pohoda mServer file picker akceptuje pouze
.pemextension. Pri otevirani dialogu pro nacteni certifikatu a privatniho klice mServer filtruje pouze soubory typu „Privacy-Enhanced Mail (PEM) file“, takze drive generovanemserver.crtamserver.keyse ve file pickeru nezobrazily a uzivatel je nemohl vybrat.
Změněno
export-pem.ps1irenewal-hook-mserver.ps1nyni generuji soubory s.pemextension:mserver.crt→mserver-cert.pemmserver.key→mserver-key.pem
- ACL omezeni (
icacls) aplikovano i na novy slouceny soubormserver.pem.
Přidáno
- Slouceny
mserver.pem(cert + privatni klic v jednom souboru). Vedle dvou samostatnych PEM se nyni generuje i kombinovany PEM soubor pro pripady, kdy uzivatel preferuje jeden vstup pro oba (mServer akceptuje obe varianty — kombinovany PEM lze nacist v poli „Certifikat“ i „Privatni klic“). - i18n klice
scripts.writeCombinedPemascripts.combinedFileve vsech 6 jazycich (cs, sk, en, de, ro, uk).
[1.3.4] - 2026-05-27
Opraveno
- Dark mode — svetly pruh pod paticku. Pokud body neprekryval cely viewport (kratsi obsah, napr. krok 1), pod paticku probleskovala svetla barva
<html>elementu. CSS pravidlobody.dark { --bg: ... }definovalo dark variables jen nabody, ale<html>cetlo--bgz:root(svetle). Selector rozsiren nahtml.dark, body.dark— cely dokument je v dark modu jednotny.
[1.3.3] - 2026-05-27
Opraveno
export-pem.ps1selhalo v PS 7 sCannot convert argument "inArray", with value: "System.Object[]" ... to type "System.Byte[]". Pricina: PowerShell pri spojovani poli operatorem+vraciObject[]mistobyte[], takze[Convert]::ToBase64String($keyBytes, ...)selhalo na type mismatch.- Reseni: ASN.1 helpery prepsany na
System.Collections.Generic.List[byte]sAddRange()a explicitnimi[byte[]]casty na vsech klicovych mistech.foreach ($x in @(...))nahrazenofor-loopem pres pojmenovane pole, protoze PS unwrapuje single-element jagged arrays. Algoritmus skutecne overen v PowerShell 7.4.6 — vsech 9 RSAParameters bytu projde DER kodovanim,RSA.ImportFromPem()reparsuje vystup, signature roundtrip projde.
[1.3.2] - 2026-05-27
Opraveno
export-pem.ps1selhalo na Windows PowerShell 5.1 s chybou[System.Security.Cryptography.RSACng] does not contain a method named 'ExportRSAPrivateKey'. Tato metoda existuje az od .NET Core 3.0 / PowerShell 7, ale Windows Server / desktop ma defaultne PowerShell 5.1 (.NET Framework 4.8).- Reseni:
export-pem.ps1irenewal-hook-mserver.ps1nyni pouzivajiRSA.ExportParameters($true)a rucni PKCS#1 ASN.1 DER kodovani (RFC 8017 RSAPrivateKey struktura). Funguje na PowerShell 5.1 i 7+. Algoritmus byl overen v Node.js — vystupni PEM uspesne nactecrypto.createPrivateKey()a signature roundtrip projde.
Pridano
- 3 nove i18n klice
scripts.*(× 6 jazyku):asn1HelperDesc,asn1IntComment,exportingRsaParams.
[1.3.1] - 2026-05-27
Opraveno
- win-acme
--privatekeyexportableflag odstraněn — neexistuje vwacs.exeCLI a způsoboval chybuUnknown argument. Reportoval uživatel po testu z 24. 5. (renew vrátil chybu „Cannot export non-exportable private key“). - Pre-flight cleanup nekompatibilního certifikátu v
issue.ps1(mServer profil) — pokud vCert:\LocalMachine\Myexistuje cert pro doménu s neexportovatelným privátním klíčem (typicky z dřívější instalace bezPrivateKeyExportable=true), je před volánímwacs.exeodstraněn. Bez toho by win-acme jen provedlrenewse stávajícími (non-exportable) flagy a nový PFX export by selhal.
Přidáno
install.ps1konfigurujesettings.json— po stažení/aktualizaci win-acme automaticky nastavíStore.CertificateStore.PrivateKeyExportable = truevC:\Program Files\win-acme\settings.json(jediný oficiální způsob — flag na CLI neexistuje). Fallback zsettings_default.jsonpokudsettings.jsonještě neexistuje.--acl-fullcontrol "administrators"vissue.ps1store options — Administrators dostávají plnou kontrolu nad privátním klíčem (jinak je vlastníkemSYSTEMaAdministratornemůže klíč exportovat — viz win-acme issue #2529).- 5 nových i18n klíčů
scripts.*(× 6 jazyků):settingsConfig,settingsUpdated,privateKeyExportableOn,cleanupOldCertDesc,removingNonExportable.
Změněno
- Refaktor
install.ps1: proměnná$shouldUpdate→$shouldDownload. Konfiguracesettings.jsonběží vždy na konci (i když nedošlo ke stažení), aby existující instalace byly opraveny.
[1.3.0] - 2026-05-27
Přidáno
- Klikatelný stepper: každý vyplněný krok je zelený a slouží jako tlačítko pro skok zpět ke kontrole. Nevyplněné kroky jsou červené a neklikatelné. Aktuální krok zůstává modrý.
- Nápověda na hover (
title=) pro všechny kroky stepperu — Úvod, Domény, Challenge, Server, Obnova, Výstup. Lokalizováno do všech 6 jazyků (6 nových i18n klíčůprogress.tip1…progress.tip6). - Nová CSS proměnná
--err(light:#b42318, dark:#f97066) pro neutrální červenou napříč motivem.
Změněno
.progress-steppřevedeno z<div>na<button type="button">kvůli přístupnosti (Tab + Enter navigace, srůstání s čtečkami obrazovky). Třída.donenahrazena třídou.valid, která se přiřazuje na základěvalidateStep(), ne pouze podle pořadí.- Cursor
not-allowedna nevyplněných krocích jasně signalizuje, že zatím nejsou klikatelné.
[1.2.5] - 2026-05-27
Přidáno
install.ps1na začátku zjistí, jestli je win-acme již nainstalován, přečte jeho verzi (Get-Item wacs.exe.VersionInfo) a porovná ji s nejnovějším releasem na GitHubu. Pokud je verze aktuální, instalace se přeskočí; pokud je dostupná novější, skript se interaktivně zeptá, jestli aktualizovat (default = ne).- 9 nových i18n klíčů ve všech 6 jazycích (
scripts.wacsCheckExisting,wacsAlreadyInstalled,wacsLatestVersion,wacsUpToDate,wacsUpdateAvailable,wacsUpdateSkipped,wacsUpdating,wacsNotFound,wacsVersionUnknown).
Změněno
- Opakované spuštění
install.ps1již zbytečně nestáhnex64.pluggable.zip, pokud je uživatel již na aktuální verzi.
[1.2.4] - 2026-05-26
Přidáno
- Nový skript
export-pem.ps1pro mServer profil — exportuje certifikát z Windows Cert Store do PEM dvojice (mserver.crt+mserver.key, PKCS#1 RSA), kterou vyžaduje Pohoda mServer (HTTPS dialog podporuje pouze cestu k souborům, ne thumbprint). - 17 nových i18n klíčů ve všech 6 jazycích (
scripts.exportPemDesc,scripts.findLatestCert,scripts.exportingTo,scripts.tempPfxStep,scripts.reloadExportable,scripts.writeCertPem,scripts.writeKeyPem,scripts.noPrivateKey,scripts.cleanupTempPfx,scripts.restrictKeyAcl,scripts.exportDone,scripts.certFile,scripts.keyFile,scripts.exportNextSteps,scripts.hookRebindNetsh,scripts.hookReexportPem,scripts.hookPemUpdated).
Změněno
issue.ps1nyní vždy obsahuje flag--privatekeyexportableu všech 4 challenge větví (HTTP-01, DNS-01 manual, DNS-01 Cloudflare, TLS-ALPN-01) — bez toho nelze klíč později exportovat do PEM.renewal-hook-mserver.ps1po obnově certifikátu znovu spouštíexport-pem.ps1, takžemserver.crt+mserver.keyzůstávají v synchronizaci s aktuálním thumbprintem.- README v ZIPu pro mServer profil odkazuje na nový krok exportu do PEM.
Opraveno
- Dříve win-acme ukládal privátní klíč jako non-exportable, takže Pohoda mServer (čte pouze soubory) nemohl certifikát použít a
Export-PfxCertificateselhával s chybou „Cannot export non-exportable private key“. - Použit
ExportRSAPrivateKey()(PKCS#1) namístoExportPkcs8PrivateKey(), který v PowerShell 5.1 / .NET Framework chybí.
[1.2.3] - 2026-05-26
Změněno
- Pojmenování ZIP archivu — datum a čas jsou nyní na začátku názvu (snazší chronologické třídění v adresáři) a přibyl čas. Nový formát:
YYYY-MM-DD-HHMM-letsencrypt-wizard_<doména>.zip(např.2026-05-26-0850-letsencrypt-wizard_mserver.baklofgroup.cz.zip). Čas je v lokálním čase prohlížeče.
[1.2.2] - 2026-05-26
Změněno
- Kontaktní e-mail pro hlášení chyb sjednocen na alias
letsencrypt@unifi.pro(dříveperplexity.ai@crump.cz) — nový alias je specifický pro tento projekt a snadno se přesměruje. Změna se promitla do patičkyindex.html, generovanýchprivacy.html/changelog.html, README.txt v ZIP archivu a všech zmínek v dokumentaci.
[1.2.1] - 2026-05-25
Opraveno
- Ikona přepínače tmavého režimu se nyní dynamicky mění podle stavu: měsíček v světlém režimu (klik = přepnout do tmavého), sluníčko v tmavém režimu (klik = přepnout do světlého); přidán
aria-pressedpro asistivní technologie
Změněno
- Topbar (hlavička) zarovnán na stejnou šířku jako wizard panel (max-width 780 px, centrovaný) — logo vlevo, vlaječky a přepínač režimu vpravo na úrovni pravého okraje panelu
- Drobné úpravy paddingu na mobilech (≤600 px) pro úspornější layout
[1.2.0] - 2026-05-25
Přidáno
- Vícejazyčné rozhraní (i18n): 6 jazyků — čeština, angličtina, slovenština, němčina, rumunština, ukrajinština
- Lehký i18n engine bez závislostí (
assets/js/i18n.js) —data-i18n*atributy, fallback na EN, persist vlocalStorage(le-wizard-lang), detekce znavigator.language - Přepínač jazyků s inline SVG vlaječkami (žádné externí obrázky, žádné CDN)
- Tooltipy se slovníkem pojmů (
assets/js/tooltip.js,assets/js/glossary.js) — 28 termínů s autoritativními odkazy (RFC, MDN, MS Learn, certbot.eff.org, Let's Encrypt docs) - Markup
<term key="...">v překladech, popover otevíratelný klikem/fokusem, zavíratelný ESC - Tlačítko „Stáhnout vše (ZIP)" v kroku 6 — všechny skripty +
README.txtv jednom ZIP archivu - Vlastní MiniZip writer (
assets/js/zip.js) — 142 řádků, STORED metoda, CRC32, UTF-8 jména souborů (bit 11), žádné CDN - Tlačítko „Regenerovat" v kroku 6 — vynutí přepočet výstupních skriptů
- Veřejné dokumenty:
privacy.htmlachangelog.htmlbudované z MD souborů (privátní repo už nezpůsobuje 404) - Build skript
scripts/build-docs.js(Node 20) s vendoredvendor/marked.min.js(38 KB, MIT) — bez CDN - GitHub Actions workflow
pages.ymlrozšířen o build krok před nasazením
Změněno
- Kontakt v patičce: odkaz na issue tracker nahrazen mailto kontaktem (privátní repo nemá veřejný issue tracker)
- Odebrán odkaz na GitHub repo z patičky (privátní = veřejný 404)
- Komentáře ve výstupních skriptech přepsány do čistého ASCII (žádná diakritika) napříč všemi jazyky — lepší kompatibilita se starými shelly a CMD prostředími; UI texty v JSON zůstávají s plnou diakritikou
- Idempotentní transliterace přes
scripts/strip-diacritics.js(cs/sk háčky → bez háčků, de ä→ae, ro ș→s, uk azbuka → BGN/PCGN, smart quotes a šipky → ASCII) - Tmavý režim se aplikuje na
documentElement(sdílen meziindex.html,privacy.html,changelog.html) - README.txt v ZIP archivu generován z lokalizovaných klíčů
scripts.readme*včetně shrnutí konfigurace a mailto kontaktu
Opraveno
wizard.jsinit(): ReferenceError na proměnnoumppřed deklarací — nahrazenoconst mpEl = ...- i18n engine umí kombinované klíče (
step1.single.titlejako vnořené i jako plochý klíč vstep1objektu)
Bezpečnost
- Zero CDN politika potvrzena: marked.js vendorován, ZIP writer napsaný od nuly, SVG vlaječky inline
1.1.1 - 2026-05-25
Opraveno
- W3C HTML validace: 10 chyb (
<div>uvnitř<label>,aria-labelna<div>bezrole, trailing slashes na void elementech) - Refactor
.choiceblocků: vnořený<div>nahrazen<span class="choice-body">(zachován vizuální výsledek) - Přidán
role="group"k progress baru pro správnou ARIA sémantiku
Výsledek validace
- validator.w3.org/nu: 0 errors, 0 warnings
- Jigsaw CSS validator: 0 errors
1.1.0 - 2026-05-25
Přidáno
- Zobrazení verze a data publikace v patičce + odkaz na nahlášení chyby (🐛 → GitHub Issues)
version.jsonjako jediný zdroj pravdy o verzi (load přes fetch)CHANGELOG.mds pravidly verzování (Keep a Changelog + SemVer)PRIVACY.md— disclosure ukládaných dat a GDPR analýza- Storage banner při prvním otevření — informuje o použití localStorage a vyžádá souhlas s uložením Cloudflare API tokenu
- Footer link na Privacy a CHANGELOG
1.0.0 - 2026-05-25
Přidáno
- F2.1: Scénář pro Windows Server + Pohoda mServer (Stormware)
- Generátor PowerShell skriptů s win-acme (
install.ps1,issue.ps1,deploy-mserver.ps1,renewal-hook-mserver.ps1,verify-schedule.ps1) - Auto-bind certifikátu na port přes
netsh http add sslcertpodle thumbprintu - Warning panel s vysvětlením Windows Certificate Store, omezení Let's Encrypt pro LAN/VPN
- Podpora IIS jako webserveru
docs/pohoda-mserver.md— detailní návod, omezení, troubleshooting
Změněno
- Krok 5 (obnova): pro Windows zobrazit info o Scheduled Tasku win-acme místo systemd/cron
- Krok 3 (challenge): doporučení podle OS+webserveru, mServer → DNS-01
0.2.0 - 2026-05-25
Přidáno
- Nasazení na GitHub Pages přes GitHub Actions (
pages.ymlworkflow) - Auto-deploy z
mainvětve - Živá URL: https://openai-crump.github.io/letsencrypt-wizard/
0.1.0 - 2026-05-24
Přidáno
- F1: Kostra wizardu — 6 kroků (úvod, domény, challenge, server, obnova, výstup)
- Stavový stroj s validací a persistencí v localStorage
- Dark mode toggle
- Generátory bash skriptů pro Linux (Debian/RHEL/Alpine × nginx/Apache/HAProxy/none)
- Podpora HTTP-01 webroot/standalone a DNS-01 Cloudflare/manual
- Doporučení challenge metody podle situace
PLAN.mds detailní architekturou a fázemi F1-F6docs/cloudflare-token.md— návod na scoped Cloudflare token