Dijital imza, bir belgenin kim tarafından imzalandığını kaydeder. Güvenilir bir zaman damgası ne zaman olduğunu kaydeder ve bu zaman, imzalayanın bilgisayarındaki saat yerine bağımsız bir zaman damgası otoritesinden (TSA) gelir. Bu öğreticide, bir Word belgesini Python’da zaman damgalı XAdES‑T imzası ile nasıl imzalayacağınızı ve ardından zaman damgasının dosyada olduğunu nasıl doğrulayacağınızı gösteriyoruz.

Temel Çıkarımlar

  • her ikisini SignOptions.xml_dsig_level = XmlDsigLevel.X_AD_ES_T ve SignOptions.timestamp_settings ayarlayın. Tek başına biri zaman damgası olmadan bir imza üretir ve hiçbir hata bunu size söylemez.
  • Aspose.Words, zaman damgasını DigitalSignatureUtil.sign sırasında talep eder, bu nedenle bu çağrı TSA’ya ağ erişimine ihtiyaç duyar.
  • DOCX ve DOC dosyalarına zaman damgası eklenebilir. ODT dosyalarına eklenemez.
  • DigitalSignature.is_valid imzayı kontrol eder, zaman damgasını değil. Zaman damgasını ayrı olarak doğrulayın.

Güvenilir Zaman Damgasının Bir İmzaya Katkısı

Aspose.Words tarafından oluşturulan her imza, SignOptions.sign_time ile ayarlanan bir imzalama zamanını içerir. Bu değer imzalayanın makinesinden gelir, bu yüzden belgeyi itiraz eden herkes zamanı da itiraz edebilir.

XAdES‑T imzası bağımsız kanıt ekler. Belge imzalandıktan sonra, Aspose.Words imza değerinin bir özetini bir TSA’ya gönderir. TSA, özeti belirli bir zamana bağlayan, kendi sertifikasıyla imzalanmış bir RFC 3161 belirteci döndürür. Bu belirteç imza içinde depolanır. Bir doğrulayıcı daha sonra imzanın o anda var olduğunu gösterebilir; bu, imzalayan sertifikanın daha sonra süresi dolduğunda veya iptal edildiğinde en çok önemlidir.

Önkoşullar

Örneği çalıştırmadan önce, şunların olduğundan emin olun:

pip install --upgrade "aspose-words>=26.9"
  • İmzalama sertifikası PKCS#12 formatında (.pfx veya .p12) ve şifresi.
  • Zaman damgası yetkilisi URL’si. Örnekte FreeTSA (https://freetsa.org/tsr) kullanılmıştır; test için uygun ücretsiz bir kamu TSA’sıdır. Üretim belgelerinde, kuruluşunuzun veya sertifika sağlayıcınızın önerdiği TSA’yı kullanın; çünkü belgelerinizi kontrol eden kişilerin o TSA’nın sertifikasına güvenmesi gerekir.
  • TSA kimlik bilgileri, yalnızca TSA kimlik doğrulaması gerektiriyorsa.

Bir lisans olmadan, Aspose.Words sınırlamalarla değerlendirme modunda çalışır. Bir geçici lisans test ederken bu sınırlamaları kaldırır.

Güvenilir Bir Zaman Damgası ile Word Belgesini İmzala

Aşağıdaki betik, bir DOCX dosyasını XAdES‑T imzası ile imzalar ve TSA’dan bir zaman damgası ekler.

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}")

How the Code Works

  • CertificateHolder.create .pfx dosyasından özel anahtarı ve sertifika zincirini okur. Yanlış bir şifre burada başarısız olur, imzalama başlamadan önce.
  • XmlDsigLevel.X_AD_ES_T Aspose.Words’e bir XAdES-T imzası oluşturmasını söyler; bu, XAdES-EPES artı bir imza zaman damgasıdır.
  • DigitalSignatureTimestampSettings TSA URL’sini, isteğe bağlı bir kullanıcı adı ve şifreyi ve isteğe bağlı bir zaman aşımını tutar. Boş dizeler, anonim istekleri kabul eden bir TSA için uygundur. TSA bir HTTP kimlik doğrulama isteğiyle yanıt verirse, Aspose.Words sağladığınız kimlik bilgilerini gönderir.
  • DigitalSignatureUtil.sign OUTPUT_DOC konumuna imzalı bir kopya yazar ve girdi dosyasını değiştirmez. İmzalanmamış bir belgeyi imzalayın: girdi zaten bir imzaya sahipse, çıktı mevcut imzayı ve yenisini içerir.

Zaman Damgasının Gömülü Olduğunu Kontrol Edin

Aspose.Words tarafından döndürülen DigitalSignature nesneleri zaman damgasını ortaya çıkarmaz ve is_valid bunu kontrol etmez. Testlerde, zaman damgası belirteci kasıtlı olarak bozulmuş bir belge hâlâ is_valid değerini True olarak raporlamıştır. Zaman damgasını doğrulamak için, DOCX paketinde depolanan imza XML’ine bakın:

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")

İmzalı bir DOCX için, benzer bir çıktıyı şöyle görmelisiniz:

Signer: CN=Your Name | valid: True
_xmlsignatures/sig1.xml: timestamp embedded (saved to timestamp-token.der)

TSA tarafından sertifikalandırılan zamanı okumak için, kaydedilen token’ı OpenSSL’e gönderin:

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

Time stamp satırı, GMT cinsinden sertifikalı zamanı gösterir ve TSA satırı, bunu veren otoriteyi tanımlar.

Bu kontrol DOCX paket formatını okur. Bir DOC dosyası imzasını ikili bir kapsayıcıda saklar, bu nedenle ZIP tabanlı komut dosyası ona uygulanmaz.

İmzalama ve Zaman Damgası Hatalarını Giderme

SemptomMuhtemel nedenNe yapılmalı
İmza başarılı, ancak zaman damgası eklenmediYalnızca xml_dsig_level = X_AD_ES_T ve timestamp_settings‘den biri ayarlanmışsign çağrılmadan önce ikisini de ayarlayın. XML_D_SIG veya X_AD_ES_EPES ile zaman damgası ayarları yok sayılır.
RuntimeError içinde (401) Unauthorized belirtiliyorTSA kimlik bilgileri gerektiriyor veya kimlik bilgileri yanlışTSA sağlayıcınız tarafından verilen kullanıcı adı ve şifreyi geçin.
RuntimeError içinde reddedilen bağlantı veya proxy hatası belirtiliyorTSA URL’si yanlış, ya da bir güvenlik duvarı veya proxy isteği engelliyorURL’yi kontrol edin ve betiğinizi çalıştıran makinenin TSA’ya ulaşabildiğini doğrulayın.
RuntimeError içinde The operation has timed out belirtiliyorTSA zaman aşımı içinde yanıt vermediTekrar deneyin veya DigitalSignatureTimestampSettings‘e daha uzun bir timeout değeri geçin.
Bir hata sonrası boş bir çıktı dosyası kalıyorsign, TSA isteği başarısız olmadan önce hedef dosyayı oluştururTekrar denemeden önce hedef dosyayı silin veya geçici bir yola yazın ve başarılı çağrıdan sonra yeniden adlandırın.
RuntimeError bu dosya formatı için zaman damgasının desteklenmediğini söylüyorGirdi bir ODT dosyasıDOCX veya DOC dosyalarına zaman damgası ekleyin, ya da PDF’ye dönüştürüp aşağıda açıklanan PDF imzalama yolunu kullanın.
No usable version of libssl was found veya Linux’ta eksik bir ICU paketiyle ilgili çökmePython paketinin içinde gelen .NET çalışma zamanı OpenSSL 1.1 ve desteklenen bir ICU sürümü gerektirirOpenSSL 1.1 kurun veya desteklenen bir ICU kurun. Uygulamanız kültüre özgü biçimlendirmeye ihtiyaç duymuyorsa ICU hatası için DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 ayarlayın.

Alternatif: PDF Çıktısında İmzanın Zaman Damgasını Eklemek

Alıcılarınız imzalı bir Word dosyası yerine PDF istiyorsa, DigitalSignatureUtil‘e ihtiyacınız yok. PdfSaveOptions.digital_signature_details.timestamp_settings özelliğini bir PdfDigitalSignatureTimestampSettings nesnesine ayarlayarak PDF’yi kaydederken imzalayın ve zaman damgası ekleyin. Bu yöntem, 26.9’dan çok daha uzun bir süredir kullanılmaktadır. PdfDigitalSignatureTimestampSettings referansı eksiksiz bir örnek içerir.

Sonraki Adımlar

İmza satırları eklemek, bir imza satırı resmiyle imzalamak veya mevcut imzaları kaldırmak için, Aspose.Words for Python belgelerinde Dijital İmzalarla Çalışma bölümüne bakın.

FAQs

  1. Güvenilir bir zaman damgası dijital imzaya ne ekler?
    Bir zaman damgası otoritesi (TSA), imzanın yapıldığı zamanı onaylar. Bu zaman, imzalayanın bilgisayar saatinden değil bağımsız bir üçüncü taraftan gelir ve doğrulayıcının imzanın imzalama sertifikası süresi dolmadan veya iptal edilmeden önce var olduğunu göstermesini sağlar.
  2. DigitalSignatureUtil içinde zaman damgasını destekleyen Aspose.Words sürümü hangisidir?
    Aspose.Words for Python via .NET’in 26.9 sürümü SignOptions.timestamp_settings, XmlDsigLevel.X_AD_ES_T ve DigitalSignatureTimestampSettings sınıfını ekledi. Daha eski sürümler yalnızca PDF çıktısındaki imzalara zaman damgası ekleyebilir.
  3. Hem xml_dsig_level hem de timestamp_settings ayarlamam gerekiyor mu?
    Evet. Sadece birini ayarlarsanız, Aspose.Words belgeyi imzalar ancak zaman damgası talep etmez veya eklemez ve hata vermez.
  4. Hangi dosya formatları zaman damgası alabilir?
    X_AD_ES_T ile imzalanan DOCX ve DOC dosyaları zaman damgası alır. Bir ODT dosyasını zaman damgası ile imzalamak, formatın zaman damgasını desteklemediğini belirten bir hata oluşturur.
  5. is_valid zaman damgasının geçerli olduğunu doğrular mı?
    Hayır. DigitalSignature.is_valid yalnızca imzayı kontrol eder. Zaman damgasını doğrulamak için, imza XML’inin bir zaman damgası tokenı içerdiğini kontrol edin ve tokenı OpenSSL gibi bir araçla inceleyin.
  6. TSA’ya ulaşılamazsa ne olur?
    DigitalSignatureUtil.sign ağ, kimlik doğrulama veya zaman aşımı sorununu açıklayan bir RuntimeError fırlatır. Hedef yol boş bir dosya olarak kalabilir; bu yüzden yeniden denemeden önce dosyayı silin.

Ücretsiz Lisans ve Destek Alın