Digitální podpis zaznamenává, kdo dokument podepsal. Důvěryhodné časové razítko zaznamenává kdy, a tento čas pochází od nezávislé autority časových razítek (TSA) místo hodin na počítači podepisujícího. Tento tutoriál vám ukáže, jak podepsat dokument Word s časovým razítkem XAdES‑T v Pythonu a poté potvrdit, že časové razítko je v souboru.

Key Takeaways

  • Nastavte obojí SignOptions.xml_dsig_level = XmlDsigLevel.X_AD_ES_T a SignOptions.timestamp_settings. Každý z nich samostatně vytvoří podpis bez časového razítka a žádná chyba vás o tom neinformuje.
  • Aspose.Words požaduje časové razítko během volání DigitalSignatureUtil.sign, takže toto volání potřebuje přístup k síti k TSA.
  • DOCX a DOC soubory lze časově razítkovat. Soubory ODT nelze.
  • DigitalSignature.is_valid kontroluje podpis, nikoli časové razítko. Časové razítko potvrďte samostatně.

Co důvěryhodný časový razítko přidává k podpisu

Každý podpis vytvořený pomocí Aspose.Words obsahuje čas podpisu, nastavený pomocí SignOptions.sign_time. Tato hodnota pochází z počítače podepisujícího, takže kdokoli, kdo dokument zpochybňuje, může zpochybnit i čas.

XAdES‑T podpis přidává nezávislý důkaz. Po podepsání dokumentu Aspose.Words odešle hash hodnoty podpisu do TSA. TSA vrátí token RFC 3161, podepsaný svým vlastním certifikátem, který sváže hash s konkrétním časem. Tento token je uložen uvnitř podpisu. Verifikátor pak může ukázat, že podpis existoval v daném okamžiku, což je nejdůležitější, když certifikát pro podepisování později vyprší nebo bude odvolán.

Požadavky

Než spustíte příklad, ujistěte se, že máte:

pip install --upgrade "aspose-words>=26.9"
  • Podpisový certifikát ve formátu PKCS#12 (.pfx nebo .p12) a jeho heslo.
  • URL autority časových razítek. Příklad používá FreeTSA (https://freetsa.org/tsr), volně dostupnou veřejnou TSA, která je vhodná pro testování. Pro produkční dokumenty použijte TSA, kterou doporučuje vaše organizace nebo poskytovatel certifikátu, protože lidé kontrolující vaše dokumenty musí důvěřovat certifikátu této TSA.
  • Přihlašovací údaje TSA, pouze pokud vaše TSA vyžaduje autentizaci.

Bez licence běží Aspose.Words v evaluačním režimu s omezeními. Dočasná licence je odstraňuje během testování.

Podepsat dokument Word pomocí důvěryhodného časového razítka

Následující skript podepisuje soubor DOCX pomocí podpisu XAdES‑T a vkládá časové razítko z TSA.

import datetime
import aspose.words as aw

# Replace these values with your own files and credentials.
INPUT_DOC = "contract.docx"
OUTPUT_DOC = "contract-signed.docx"
CERT_FILE = "signing-cert.pfx"
CERT_PASSWORD = "your-pfx-password"

TSA_URL = "https://freetsa.org/tsr"
TSA_USER = ""       # Fill in only if your TSA requires authentication.
TSA_PASSWORD = ""

# Load the signing certificate from a PKCS#12 file.
cert_holder = aw.digitalsignatures.CertificateHolder.create(
    file_name=CERT_FILE, password=CERT_PASSWORD)

# Request an XAdES-T signature and point it at a timestamp authority.
sign_options = aw.digitalsignatures.SignOptions()
sign_options.xml_dsig_level = aw.digitalsignatures.XmlDsigLevel.X_AD_ES_T
sign_options.timestamp_settings = aw.digitalsignatures.DigitalSignatureTimestampSettings(
    server_url=TSA_URL,
    user_name=TSA_USER,
    password=TSA_PASSWORD,
    timeout=datetime.timedelta(seconds=60),  # Default is 100 seconds.
)

# Sign the document. Aspose.Words contacts the TSA during this call.
aw.digitalsignatures.DigitalSignatureUtil.sign(
    src_file_name=INPUT_DOC,
    dst_file_name=OUTPUT_DOC,
    cert_holder=cert_holder,
    sign_options=sign_options,
)
print(f"Signed with a trusted timestamp: {OUTPUT_DOC}")

Jak kód funguje

  • CertificateHolder.create načte soukromý klíč a řetězec certifikátů ze souboru .pfx. Špatné heslo selže zde, ještě před zahájením podepisování.
  • XmlDsigLevel.X_AD_ES_T říká Aspose.Words, aby vytvořil XAdES‑T podpis, což je XAdES‑EPES plus časové razítko podpisu.
  • DigitalSignatureTimestampSettings obsahuje URL TSA, volitelné uživatelské jméno a heslo a volitelný časový limit. Prázdné řetězce jsou v pořádku pro TSA, který přijímá anonymní požadavky. Pokud TSA odpoví HTTP výzvou k autentizaci, Aspose.Words odešle poskytnuté přihlašovací údaje.
  • DigitalSignatureUtil.sign zapíše podepsanou kopii do OUTPUT_DOC a ponechá vstupní soubor beze změny. Podepište nepodepsaný dokument: pokud vstup již obsahuje podpis, výstup obsahuje jak existující podpis, tak nový.

Zkontrolujte, že bylo časové razítko vloženo

Objekty DigitalSignature, které vrací Aspose.Words, neodhalují časové razítko a is_valid jej nekontroluje. V testování dokument, jehož token časového razítka byl úmyslně poškozen, stále hlásil is_valid jako True. Pro potvrzení časového razítka se podívejte do XML podpisu uloženého v balíčku DOCX:

import base64
import re
import zipfile
import aspose.words as aw

SIGNED_DOC = "contract-signed.docx"

# 1. Check the signature itself.
for sig in aw.digitalsignatures.DigitalSignatureUtil.load_signatures(SIGNED_DOC):
    print(f"Signer: {sig.subject_name} | valid: {sig.is_valid}")

# 2. Check that a timestamp token was embedded, and save it for inspection.
with zipfile.ZipFile(SIGNED_DOC) as package:
    for part in package.namelist():
        if part.startswith("_xmlsignatures/sig") and part.endswith(".xml"):
            xml = package.read(part).decode("utf-8")
            match = re.search(r"<(?:\w+:)?EncapsulatedTimeStamp[^>]*>([^<]+)<", xml)
            if match:
                with open("timestamp-token.der", "wb") as f:
                    f.write(base64.b64decode(match.group(1)))
                print(f"{part}: timestamp embedded (saved to timestamp-token.der)")
            else:
                print(f"{part}: no timestamp found")

Pro podepsaný DOCX byste měli vidět výstup podobný tomuto:

Podepisující: CN=Your Name | platný: True
_xmlsignatures/sig1.xml: časové razítko vloženo (uloženo do timestamp-token.der)

Pro načtení času, který TSA certifikoval, předávejte uložený token do OpenSSL:

openssl ts -reply -token_in -in timestamp-token.der -token_out -text

Řádek Time stamp zobrazuje certifikovaný čas v GMT a řádek TSA identifikuje autoritu, která jej vydala.

Tato kontrola čte formát balíčku DOCX. Soubor DOC ukládá svůj podpis v binárním kontejneru, takže skript založený na ZIP na něj neplatí.

Řešení problémů s podepisováním a časovým razítkem

PříznakPravděpodobná příčinaCo dělat
Podepsání proběhlo úspěšně, ale není vloženo časové razítkoBylo nastaveno pouze jedno z xml_dsig_level = X_AD_ES_T a timestamp_settingsNastavte obojí před voláním sign. Při použití XML_D_SIG nebo X_AD_ES_EPES jsou nastavení časového razítka ignorována.
RuntimeError s hláškou (401) UnauthorizedTSA vyžaduje přihlašovací údaje, nebo jsou údaje nesprávnéPředávejte uživatelské jméno a heslo poskytnuté vaším poskytovatelem TSA.
RuntimeError s hláškou odmítnutého připojení nebo chyby proxyURL TSA je špatná, nebo firewall či proxy blokuje požadavekZkontrolujte URL a ověřte, že stroj, na kterém běží skript, může TSA dosáhnout.
RuntimeError s hláškou The operation has timed outTSA neodpověděla v rámci časového limituOpakujte, nebo předávejte delší timeout do DigitalSignatureTimestampSettings.
Po chybě zůstane prázdný výstupní souborsign vytvoří cílový soubor před selháním požadavku na TSAOdstraňte cílový soubor před opakováním, nebo zapisujte do dočasné cesty a po úspěšném volání ji přejmenujte.
RuntimeError uvádějící, že časové razítkování není podporováno tímto formátem souboruVstup je soubor ODTČasové razítko aplikujte na soubory DOCX nebo DOC, nebo je převeďte na PDF a použijte popsaný postup podepisování PDF níže.
No usable version of libssl was found, nebo pád kvůli chybějícímu balíčku ICU, na LinuxuZabalený .NET runtime Python balíčku vyžaduje OpenSSL 1.1 a podporovanou verzi ICUNainstalujte OpenSSL 1.1, nebo nainstalujte podporovanou verzi ICU. Pokud vaše aplikace nepotřebuje formátování specifické pro kulturu, nastavte DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 pro chybu ICU.

Alternativa: Časové razítko podpisu v PDF výstupu

Pokud vaši příjemci potřebují PDF místo podepsaného souboru Word, nemusíte používat DigitalSignatureUtil. Podepište a opatřete PDF časovým razítkem při ukládání nastavením PdfSaveOptions.digital_signature_details.timestamp_settings na objekt PdfDigitalSignatureTimestampSettings. Tato cesta je k dispozici mnohem déle než 26.9. Odkaz PdfDigitalSignatureTimestampSettings reference obsahuje kompletní příklad.

Další kroky

Chcete-li přidat řádky podpisu, podepsat pomocí obrázku řádku podpisu nebo odstranit existující podpisy, podívejte se na Práce s digitálními podpisy v dokumentaci Aspose.Words for Python.

FAQs

  1. Co přidává důvěryhodné časové razítko k digitálnímu podpisu?
    Autorita časových razítek (TSA) certifikuje čas, kdy byl podpis vytvořen. Tento čas pochází od nezávislé třetí strany místo hodin počítače podepisujícího, a umožňuje ověřovateli prokázat, že podpis existoval před vypršením platnosti nebo odvoláním podpisového certifikátu.

  2. Která verze Aspose.Words podporuje časové razítkování v DigitalSignatureUtil?
    Verze 26.9 Aspose.Words for Python via .NET přidala SignOptions.timestamp_settings, XmlDsigLevel.X_AD_ES_T a třídu DigitalSignatureTimestampSettings. Starší verze mohou časové razítko použít pouze u podpisů v PDF výstupu.

  3. Musím nastavit jak xml_dsig_level, tak timestamp_settings?
    Ano. Pokud je nastaven jen jeden z nich, Aspose.Words stále podepíše dokument, ale nepožádá ani nevloží časové razítko a nevygeneruje chybu.

  4. Které formáty souborů lze časově razítkovat?
    Soubory DOCX a DOC podepsané s X_AD_ES_T získají časové razítko. Pokus o podepsání souboru ODT s časovým razítkem vyvolá chybu s informací, že tento formát časové razítkování nepodporuje.

  5. Potvrzuje is_valid, že je časové razítko platné?
    Ne. DigitalSignature.is_valid kontroluje samotný podpis. Pro ověření časového razítka je třeba zkontrolovat, že XML podpisu obsahuje token časového razítka, a tento token prověřit pomocí nástroje jako OpenSSL.

  6. Co se stane, pokud není možné dosáhnout TSA?
    DigitalSignatureUtil.sign vyvolá RuntimeError, který popisuje problém se sítí, autentizací nebo časovým limitem. Cílová cesta může zůstat jako prázdný soubor, proto jej před dalším pokusem odstraňte.

Získejte bezplatnou licenci a podporu