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_TveSignOptions.timestamp_settingsayarlayı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.signsı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_validimzayı 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:
- Aspose.Words for Python via .NET 26.9 veya daha yeni sürüm. PyPI’den kurun veya yükseltin PyPI.
pip install --upgrade "aspose-words>=26.9"
- İmzalama sertifikası PKCS#12 formatında (
.pfxveya.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.pfxdosyasından özel anahtarı ve sertifika zincirini okur. Yanlış bir şifre burada başarısız olur, imzalama başlamadan önce.XmlDsigLevel.X_AD_ES_TAspose.Words’e bir XAdES-T imzası oluşturmasını söyler; bu, XAdES-EPES artı bir imza zaman damgasıdır.DigitalSignatureTimestampSettingsTSA 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.signOUTPUT_DOCkonumuna 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
| Semptom | Muhtemel neden | Ne yapılmalı |
|---|---|---|
| İmza başarılı, ancak zaman damgası eklenmedi | Yalnı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 belirtiliyor | TSA 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ı belirtiliyor | TSA URL’si yanlış, ya da bir güvenlik duvarı veya proxy isteği engelliyor | URL’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 belirtiliyor | TSA zaman aşımı içinde yanıt vermedi | Tekrar deneyin veya DigitalSignatureTimestampSettings‘e daha uzun bir timeout değeri geçin. |
| Bir hata sonrası boş bir çıktı dosyası kalıyor | sign, TSA isteği başarısız olmadan önce hedef dosyayı oluşturur | Tekrar 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üyor | Girdi 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 çökme | Python paketinin içinde gelen .NET çalışma zamanı OpenSSL 1.1 ve desteklenen bir ICU sürümü gerektirir | OpenSSL 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
- 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. - 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_TveDigitalSignatureTimestampSettingssınıfını ekledi. Daha eski sürümler yalnızca PDF çıktısındaki imzalara zaman damgası ekleyebilir. - 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. - Hangi dosya formatları zaman damgası alabilir?
X_AD_ES_Tile 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. - is_valid zaman damgasının geçerli olduğunu doğrular mı?
Hayır.DigitalSignature.is_validyalnı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. - TSA’ya ulaşılamazsa ne olur?
DigitalSignatureUtil.signağ, kimlik doğrulama veya zaman aşımı sorununu açıklayan birRuntimeErrorfırlatır. Hedef yol boş bir dosya olarak kalabilir; bu yüzden yeniden denemeden önce dosyayı silin.
