28. Elektronické podpisy

Sekce Systém -> Elektronické podpisy slouží ke správě certifikátů, podpisových profilů a pravidel, který profil se použije pro konkrétní výstup. Aktuálně se podepisují PDF výstupy a vybrané odchozí e-maily.

PDF výstupy:

Když je výkaz práce vložený jako další stránka PDF faktury, podpis výstupu Vydaná faktura pokrývá celé výsledné PDF včetně této stránky. Výstup Výkaz práce se používá pro samostatně generované PDF výkazu.

S/MIME e-mailové výstupy:

PDF používá PAdES podpis. Bez časového razítka jde o úroveň PAdES-B, s nastaveným TSA serverem o PAdES-T. Odchozí e-mail se podepisuje jako S/MIME zpráva. S/MIME podpis potvrzuje odesílatele a integritu zprávy, ale e-mail nešifruje.

28.1 Základní pojmy

PojemVýznam
Podpisový profilPojmenované nastavení podpisu. Obsahuje vlastnictví, použití, backend, volitelnou PDF/TSA konfiguraci a jeden společný certifikát profilu.
Profil dodavateleProfil vlastněný dodavatelem. Spravuje ho admin a může se použít jako centrální firemní podpis.
Můj profilProfil vlastněný konkrétním uživatelem. Použije se jen tam, kde konfigurace výstupu počítá s přihlášeným uživatelem.
Konfigurace podpisůAdmin nastavení, které určuje, zda se PDF nebo e-mailový výstup podepisuje a odkud se bere podpisový profil.
Mapování podpisových profilůUživatelské výchozí profily pro výstupy, kde admin zvolil strategii Přihlášený uživatel.

28.2 Oprávnění

RoleCo může
adminSpravuje profily dodavatele, může spravovat i profily uživatelů, nastavuje konfiguraci podpisů a povoluje uživatelské profily.
accountantPo povolení adminem může spravovat pouze vlastní podpisové profily a vlastní výchozí mapování. V detailu dokladu může změnit výběr profilu, ale konkrétní profil dodavatele může vybrat jen admin.
readonlyMůže číst a stahovat doklady podle běžných oprávnění, ale nemůže měnit podpisové profily, mapování ani per-dokladový výběr podpisu.

Admin povolí uživatelské profily přepínačem Povolit uživatelům správu vlastních podpisových profilů. Pokud není zapnutý, účetní v menu sekci elektronických podpisů nevidí.

28.3 Založení podpisového profilu

  1. Otevři Systém -> Elektronické podpisy.
  2. V sekci Podpisové profily klikni Nový profil.
  3. Vyplň Název a Kód. Kód je technický identifikátor profilu a musí být unikátní v rámci dodavatele.
  4. Vyber Vlastník profilu:
  1. V části Použití vyber, k čemu se profil smí použít:
  1. Backend profilu ponech native. E-mailové výstupy používají S/MIME backend interně podle typu výstupu.
  2. Nech profil aktivní, pokud se má dát použít při podepisování.
  3. Ulož profil.

28.4 Certifikát P12/PFX

Ke každému profilu se nahrává jeden společný certifikát. Stejný P12/PFX soubor se může použít pro PDF podpis i pro S/MIME podpis e-mailu, pokud profil povoluje obě použití.

  1. Otevři editaci profilu.
  2. V části Certifikát profilu klikni Vybrat soubor.
  3. Vyber soubor ve formátu P12/PFX s privátním klíčem.
  4. Zadej Heslo k certifikátu. Aplikace ho použije pro kontrolu souboru a podle zvolené politiky ho buď uloží šifrovaně, nebo jen ověří.
  5. Vyber politiku hesla.
  6. Klikni Uložit profil nebo Nahrát certifikát podle toho, jestli profil teprve vytváříš, nebo upravuješ.

Po nahrání se zobrazí metadata certifikátu: subject, e-mail v certifikátu, platnost, politika hesla a SHA-256 fingerprint. Soubor certifikátu se ukládá do interního storage aplikace. V produkci je vhodné mít MYINVOICE_DATA_DIR nastavený mimo webový root.

Certifikát bez privátního klíče nestačí. Pokud import selže s chybou špatného hesla nebo neplatného PKCS#12, zkontroluj, že P12/PFX opravdu obsahuje privátní klíč a že zadáváš správnou passphrase.

Pro S/MIME podpis je prakticky důležité, aby certifikát obsahoval e-mailovou adresu používanou jako odesílatel nebo aby ho příjemcův klient uměl přiřadit k odesílateli. Aplikace podpis vytvoří, ale důvěryhodnost a shoda identity se vyhodnocuje až v e-mailovém klientovi příjemce.

28.5 Politika hesla k certifikátu

PolitikaKdy použítChování
Uložit šifrovaně (encrypted_store)Běžný produkční režim a background joby.Heslo se uloží v DB šifrovaně pomocí aplikačního klíče. Běžný uživatel ho nevidí a API ho nikdy nevrací.
Passphrase file (passphrase_file)Když nechceš heslo ukládat do DB, ale aplikace musí podepisovat i bez interaktivního vstupu.V profilu se uloží jen ID hesla. Skutečné heslo se čte ze serverového souboru nastaveného v konfiguraci.
Ptát se při použití (prompt_on_use)Interaktivní podpis na vyžádání.V této iteraci není pro runtime podpisy podporováno. Pro PDF i S/MIME zvol šifrované uložení nebo passphrase file.

Passphrase file

Cestu k souboru nastav správce v konfiguraci:

'signing' => [
    'passphrase_file' => '/var/lib/myinvoice/signing-passphrases.json',
],

Kvůli zpětné kompatibilitě se bere i pdf_signing.passphrase_file.

Soubor může být JSON:

{
  "profiles": {
    "owner_john": { "passphrase": "heslo-k-p12" },
    "owner_novak": { "passphrase": "jine-heslo" }
  }
}

Nebo INI:

[owner_john]
passphrase=heslo-k-p12

[owner_novak]
passphrase=jine-heslo

Do pole ID hesla v passphrase file v profilu zadej například owner_john. Soubor musí být čitelný procesem aplikace a neměl by být součástí webového rootu ani gitu.

28.6 TSA a důvod podpisu

V profilu je volitelná část PDF nastavení profilu. Tato nastavení platí jen pro PDF podpisy:

PoleVýznam
Použít časové razítkoZapne PAdES-T. Po zapnutí je povinná TSA URL.
TSA URLRFC 3161 endpoint časové autority, například URL služby poskytovatele časových razítek.
TSA jméno / hesloHTTP Basic auth, pokud ho TSA server vyžaduje.
Důvod podpisuTextový důvod v PDF podpisu. Když zůstane prázdný, použije se výchozí text podle typu dokumentu: Faktura nebo Výkaz práce.

Bez TSA se dokument podepíše jako PAdES-B. Pokud je TSA nastavená a dostupná, přidá se důvěryhodné časové razítko a výsledkem je PAdES-T.

S/MIME podpis odchozího e-mailu v této implementaci TSA nepoužívá.

28.7 Konfigurace podpisů pro výstupy

Sekci Konfigurace podpisů vidí admin. Každý řádek nastavuje jeden typ výstupu: buď PDF, nebo S/MIME e-mail.

SloupecVýznam
VýstupNapříklad Vydaná faktura, Výkaz práce nebo E-mail s fakturou. Badge PDF nebo S/MIME říká, jaký typ podpisu se použije.
PodepisovatZapne nebo vypne podpis pro daný výstup aktuálního dodavatele.
Výběr profiluUrčuje, odkud se vezme podpisový profil.
ProfilKonkrétní profil dodavatele, pokud výstup používá strategii Profil dodavatele.
Fallback uživateleCo se má stát, když je zvolen Přihlášený uživatel, ale uživatel nemá použitelný vlastní profil.
Při chyběCo se má stát, když podpis selže nebo není nakonfigurovaný.

Výběr profilu

HodnotaChování
Profil dodavatelePoužije se konkrétní aktivní profil dodavatele z pole Profil. Uživatelské profily se pro tento výstup nepoužijí.
Přihlášený uživatelAplikace použije výchozí profil přihlášeného uživatele pro daný výstup. Pokud ho nenajde, použije se Fallback uživatele.

U automatických/background operací nemusí existovat přihlášený uživatel. Pokud je výstup nastavený na Přihlášený uživatel, je proto důležité nastavit rozumný fallback.

Fallback uživatele

HodnotaChování
Profil dodavatelePokud uživatel nemá vlastní profil, použije se profil dodavatele z řádku konfigurace.
Vrátit nepodepsanéVýstup pokračuje bez podpisu a událost se zapíše do logu. U PDF se vydá nepodepsané PDF, u e-mailu odejde nepodepsaná zpráva.
Zastavit s chybouExport nebo odeslání selže s chybou.

Při chybě

HodnotaChování
Vrátit nepodepsané (fallback_unsigned)Při chybě podpisu výstup pokračuje bez podpisu a zapíše se auditní událost. Hodí se tam, kde je důležitější dostupnost dokladu nebo e-mailu než tvrdé vynucení podpisu.
Zastavit s chybou (fail_closed)Při chybě podpisu export nebo odeslání selže. Hodí se tam, kde podpis musí být povinný.
Přeskočit bez konfigurace (skip_when_unconfigured)Pokud chybí použitelný profil, podpis se přeskočí.

Tlačítko Otestovat v řádku konfigurace vytvoří dočasné PDF a zkusí ho podepsat podle stejného mapování. Zobrazuje se jen u PDF výstupů. Výsledek zobrazí stav, použitý profil a vlastníka certifikátu (CN), pokud ho backend zjistí.

S/MIME podpis otestuješ odesláním testovacího e-mailu pro příslušný typ zprávy a ověřením podpisu v e-mailovém klientovi.

28.8 Mapování podpisových profilů uživatele

Sekce Mapování podpisových profilů slouží pro osobní výchozí profily přihlášeného uživatele.

Použije se jen tehdy, když admin v Konfiguraci podpisů nastavil daný výstup na Přihlášený uživatel. Pokud je výstup nastavený na Profil dodavatele, uživatelský profil se ignoruje a UI na to upozorní.

Pro každý výstup vyber vlastní aktivní profil, který podporuje stejné použití jako výstup. Pro PDF výstupy musí profil podporovat použití PDF, pro e-mailové výstupy použití S/MIME e-mail.

28.9 Výběr podpisu na konkrétním dokladu

Na detailu faktury je pro uživatele s právem zápisu sekce Elektronický podpis dokumentu. Umožňuje přepsat výchozí konfiguraci pro konkrétní doklad.

HodnotaChování
DěditPoužije se globální konfigurace z Konfigurace podpisů.
Přihlášený uživatelPro tento doklad se použije výchozí podpisový profil uživatele, který PDF generuje nebo odesílá.
Profil dodavatelePro tento doklad se použije profil dodavatele. Admin může vybrat konkrétní profil, účetní nechává profil zdědit z konfigurace.

Změna výběru u faktury invaliduje PDF cache, aby se další stažení nebo odeslání vygenerovalo s aktuálním podpisem. U uživatelských profilů cache závisí na tom, který uživatel PDF generuje, takže stejný doklad může být podepsaný jiným profilem podle přihlášeného uživatele.

Per-dokladový výběr se týká PDF dokladů. Odchozí e-maily se řídí mapováním e-mailových výstupů v Konfiguraci podpisů.

28.10 Podepisování odchozích e-mailů

S/MIME podpis se aplikuje při sestavení e-mailu těsně před odesláním přes SMTP. Podepisuje se výsledná MIME zpráva včetně HTML/textového těla a příloh, takže příjemce může v běžném e-mailovém klientovi ověřit, že zpráva nebyla cestou změněna.

Podporované e-mailové výstupy:

Výstup v UIInterní šablona
E-mail s fakturouinvoice_send
E-mail s upomínkouinvoice_reminder
E-mail s připomínkou zálohyproforma_reminder
E-mail s poděkováním za úhraduinvoice_payment_thanks
E-mail se schválením výkazuinvoice_approval
E-mail s připomínkou pravidelné fakturyrecurring_draft_reminder

Nastavení funguje stejně jako u PDF výstupů:

S/MIME podpis e-mail nešifruje. Obsah zprávy zůstává čitelný stejně jako u běžného e-mailu, jen je opatřen elektronickým podpisem.

28.11 Ověření podepsaného PDF

Po stažení můžeš PDF ověřit v běžné PDF čtečce nebo na serveru například přes pdfsig:

pdfsig Faktura-2606009.pdf

U platného podpisu uvidíš stav podpisu jako validní. Pokud výstup hlásí, že vydavatel certifikátu je neznámý, znamená to obvykle chybějící důvěryhodný certifikační řetězec v prostředí ověřovatele. Samotný kryptografický podpis může být přesto validní.

28.12 Audit a řešení problémů

Správa i použití podpisů se zapisuje do activity logu. Typické události:

UdálostVýznam
signing.profile_created / signing.profile_updated / signing.profile_deletedZměna podpisového profilu.
signing.credential_uploaded / signing.credential_deleted / signing.credential_passphrase_updatedZměna certifikátu nebo politiky hesla.
signing.output_settings_updatedZměna konfigurace podpisů pro výstup.
signing.user_default_updatedZměna osobního mapování profilu.
signing.document_selection_updatedZměna výběru podpisu na konkrétním dokladu.
signing.pdf_signedPDF bylo úspěšně podepsáno.
signing.failedPodepisování selhalo. Podle politiky se buď vrátilo nepodepsané PDF, nebo operace skončila chybou.
signing.skippedPodepisování bylo přeskočeno, například kvůli vypnutému výstupu nebo chybějící konfiguraci.
signing.email_signedOdchozí e-mail byl úspěšně podepsán S/MIME.
signing.email_failedS/MIME podpis e-mailu selhal.
signing.email_skippedS/MIME podpis e-mailu byl přeskočen, například kvůli chybějící konfiguraci.

Časté problémy:

ProblémCo zkontrolovat
PDF se vygenerovalo bez podpisuZkontroluj Konfiguraci podpisů, aktivní profil, nahraný certifikát a politiku Při chybě. Při fallback_unsigned se nepodepsané PDF vydá záměrně.
Export skončil chybou PDF podpis není nakonfigurovanýVýstup je nastavený na tvrdé selhání a chybí použitelný profil nebo certifikát.
Certifikát nejde nahrátOvěř P12/PFX, heslo, privátní klíč a expiraci certifikátu.
Background job nepodepisuje uživatelským profilemBackground job nemá přihlášeného uživatele. Pro tyto scénáře použij fallback na profil dodavatele nebo passphrase file.
Po změně konfigurace se stále vrací staré PDFZkontroluj PDF historii a cache. Změna konfigurace podpisů faktury cache invaliduje, ale starší archivované verze zůstávají jako auditní záznam.
E-mail odešel bez S/MIME podpisuZkontroluj, že je zapnutý konkrétní e-mailový výstup, profil podporuje S/MIME e-mail a politika chyby není nastavená na tichý fallback.
E-mailový klient podpisu nevěříZkontroluj e-mail v certifikátu, důvěryhodnost certifikační autority a to, zda po podpisu zprávu neupravuje SMTP brána nebo antispam.

28.13 Poznámka k REST API

Podpisové endpointy jsou interní administrační endpointy používané SPA aplikací (/api/settings/... a /api/documents/.../signature-selection). Nejsou součástí veřejného /api/v1 subsetu a nejsou popsané v api/openapi.yaml.

Veřejné endpointy pro stažení nebo odeslání PDF vrací dokument podle aktuální konfigurace podpisů, ale samotná správa podpisových profilů zatím není veřejné API pro externí integrace.