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_TaSignOptions.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_validkontroluje 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:
- Aspose.Words for Python via .NET 26.9 nebo novější. Nainstalujte nebo aktualizujte z PyPI:
pip install --upgrade "aspose-words>=26.9"
- Podpisový certifikát ve formátu PKCS#12 (
.pfxnebo.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.createnač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.DigitalSignatureTimestampSettingsobsahuje 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.signzapíše podepsanou kopii doOUTPUT_DOCa 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říznak | Pravděpodobná příčina | Co dělat |
|---|---|---|
| Podepsání proběhlo úspěšně, ale není vloženo časové razítko | Bylo nastaveno pouze jedno z xml_dsig_level = X_AD_ES_T a timestamp_settings | Nastavte 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) Unauthorized | TSA 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 proxy | URL TSA je špatná, nebo firewall či proxy blokuje požadavek | Zkontrolujte URL a ověřte, že stroj, na kterém běží skript, může TSA dosáhnout. |
RuntimeError s hláškou The operation has timed out | TSA neodpověděla v rámci časového limitu | Opakujte, nebo předávejte delší timeout do DigitalSignatureTimestampSettings. |
| Po chybě zůstane prázdný výstupní soubor | sign vytvoří cílový soubor před selháním požadavku na TSA | Odstraň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 souboru | Vstup 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 Linuxu | Zabalený .NET runtime Python balíčku vyžaduje OpenSSL 1.1 a podporovanou verzi ICU | Nainstalujte 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
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.Která verze Aspose.Words podporuje časové razítkování v DigitalSignatureUtil?
Verze 26.9 Aspose.Words for Python via .NET přidalaSignOptions.timestamp_settings,XmlDsigLevel.X_AD_ES_Ta tříduDigitalSignatureTimestampSettings. Starší verze mohou časové razítko použít pouze u podpisů v PDF výstupu.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.Které formáty souborů lze časově razítkovat?
Soubory DOCX a DOC podepsané sX_AD_ES_Tzí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.Potvrzuje is_valid, že je časové razítko platné?
Ne.DigitalSignature.is_validkontroluje 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.Co se stane, pokud není možné dosáhnout TSA?
DigitalSignatureUtil.signvyvolá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.
