Chữ ký số ghi lại người đã ký tài liệu. Một dấu thời gian đáng tin cậy ghi lại khi nào, và thời gian đó đến từ một cơ quan dấu thời gian độc lập (TSA) thay vì đồng hồ trên máy tính của người ký. Hướng dẫn này cho bạn thấy cách ký một tài liệu Word bằng chữ ký XAdES‑T có dấu thời gian trong Python, sau đó xác nhận rằng dấu thời gian có trong tệp.
Những điểm chính
- Đặt cả
SignOptions.xml_dsig_level = XmlDsigLevel.X_AD_ES_TvàSignOptions.timestamp_settings. Nếu chỉ một trong hai sẽ tạo chữ ký không có dấu thời gian, và không có lỗi nào thông báo cho bạn. - Aspose.Words yêu cầu dấu thời gian trong quá trình
DigitalSignatureUtil.sign, vì vậy lời gọi này cần truy cập mạng tới TSA. - Các tệp DOCX và DOC có thể được gắn dấu thời gian. Các tệp ODT không thể.
DigitalSignature.is_validkiểm tra chữ ký, không phải dấu thời gian. Hãy xác nhận dấu thời gian riêng biệt.
Những gì một Dấu thời gian đáng tin cậy thêm vào Chữ ký
Mỗi chữ ký mà Aspose.Words tạo ra đều chứa thời gian ký, được đặt bởi SignOptions.sign_time. Giá trị này đến từ máy của người ký, vì vậy bất kỳ ai tranh cãi tài liệu cũng có thể tranh cãi thời gian ký.
Chữ ký XAdES‑T thêm bằng chứng độc lập. Sau khi tài liệu được ký, Aspose.Words gửi một hàm băm của giá trị chữ ký tới một TSA. TSA trả về một token RFC 3161, được ký bằng chứng chỉ của chính nó, liên kết hàm băm với một thời điểm cụ thể. Token đó được lưu trữ bên trong chữ ký. Một người xác thực sau đó có thể chứng minh rằng chữ ký đã tồn tại vào thời điểm đó, điều này quan trọng nhất khi chứng chỉ ký sau này hết hạn hoặc bị thu hồi.
Yêu cầu trước
Trước khi bạn chạy ví dụ, hãy chắc chắn rằng bạn đã có:
- Aspose.Words for Python via .NET 26.9 hoặc sau. Cài đặt hoặc nâng cấp từ PyPI:
pip install --upgrade "aspose-words>=26.9"
- Một chứng chỉ ký ở định dạng PKCS#12 (
.pfxhoặc.p12) và mật khẩu của nó. - URL của cơ quan thời gian. Ví dụ sử dụng FreeTSA (
https://freetsa.org/tsr), một TSA công cộng miễn phí thuận tiện cho việc thử nghiệm. Đối với tài liệu sản xuất, hãy sử dụng TSA mà tổ chức của bạn hoặc nhà cung cấp chứng chỉ đề xuất, vì những người kiểm tra tài liệu của bạn phải tin tưởng vào chứng chỉ của TSA đó. - Thông tin xác thực TSA, chỉ khi TSA của bạn yêu cầu xác thực.
Nếu không có giấy phép, Aspose.Words chạy ở chế độ đánh giá với các hạn chế. Một giấy phép tạm thời sẽ loại bỏ chúng khi bạn thử nghiệm.
Ký tài liệu Word với Dấu thời gian đáng tin cậy
Kịch bản sau ký một tệp DOCX bằng chữ ký XAdES‑T và nhúng dấu thời gian từ 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}")
Cách mã hoạt động
CertificateHolder.createđọc khóa riêng và chuỗi chứng chỉ từ tệp.pfx. Mật khẩu sai sẽ gây lỗi ở đây, trước khi bất kỳ quá trình ký nào bắt đầu.XmlDsigLevel.X_AD_ES_Tchỉ cho Aspose.Words xây dựng chữ ký XAdES‑T, là XAdES‑EPES cộng thêm dấu thời gian chữ ký.DigitalSignatureTimestampSettingschứa URL của TSA, tên người dùng và mật khẩu tùy chọn, và thời gian chờ tùy chọn. Các chuỗi rỗng là được chấp nhận cho TSA cho phép yêu cầu ẩn danh. Nếu TSA phản hồi bằng yêu cầu xác thực HTTP, Aspose.Words sẽ gửi thông tin đăng nhập mà bạn cung cấp.DigitalSignatureUtil.signghi một bản sao đã ký vàoOUTPUT_DOCvà giữ nguyên tệp đầu vào. Ký một tài liệu chưa ký: nếu đầu vào đã có chữ ký, đầu ra sẽ chứa cả chữ ký hiện có và chữ ký mới.
Check That the Timestamp Was Embedded
Các đối tượng DigitalSignature mà Aspose.Words trả về không hiển thị dấu thời gian, và is_valid không kiểm tra nó. Trong quá trình thử nghiệm, một tài liệu mà token dấu thời gian đã bị cố ý làm hỏng vẫn báo is_valid là True. Để xác nhận dấu thời gian, hãy xem bên trong XML chữ ký được lưu trong gói 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")
Đối với một tệp DOCX đã ký, bạn sẽ thấy đầu ra tương tự như sau:
Signer: CN=Your Name | valid: True
_xmlsignatures/sig1.xml: timestamp embedded (saved to timestamp-token.der)
Để đọc thời gian mà TSA đã chứng thực, hãy truyền token đã lưu cho OpenSSL:
openssl ts -reply -token_in -in timestamp-token.der -token_out -text
Dòng Time stamp hiển thị thời gian đã được chứng nhận theo GMT, và dòng TSA xác định cơ quan đã phát hành nó.
Kiểm tra này đọc định dạng gói DOCX. Tệp DOC lưu chữ ký của nó trong một container nhị phân, vì vậy script dựa trên ZIP không áp dụng cho nó.
Khắc phục lỗi ký và dấu thời gian
| Triệu chứng | Nguyên nhân có thể | Cách khắc phục |
|---|---|---|
| Ký thành công, nhưng không có dấu thời gian được nhúng | Chỉ một trong hai xml_dsig_level = X_AD_ES_T và timestamp_settings được đặt | Đặt cả hai trước khi gọi sign. Khi sử dụng XML_D_SIG hoặc X_AD_ES_EPES, các thiết lập dấu thời gian sẽ bị bỏ qua. |
RuntimeError đề cập đến (401) Unauthorized | TSA yêu cầu thông tin xác thực, hoặc thông tin xác thực sai | Cung cấp tên người dùng và mật khẩu do nhà cung cấp TSA của bạn cấp. |
RuntimeError đề cập đến kết nối bị từ chối hoặc lỗi proxy | URL của TSA sai, hoặc tường lửa hoặc proxy chặn yêu cầu | Kiểm tra URL và xác nhận máy chạy script của bạn có thể tiếp cận được TSA. |
RuntimeError đề cập đến The operation has timed out | TSA không trả lời trong thời gian chờ | Thử lại, hoặc truyền giá trị timeout dài hơn cho DigitalSignatureTimestampSettings. |
| Một tệp đầu ra rỗng vẫn còn lại sau lỗi | sign tạo tệp đích trước khi yêu cầu TSA thất bại | Xóa tệp đích trước khi thử lại, hoặc ghi vào đường dẫn tạm thời và đổi tên sau khi gọi thành công. |
RuntimeError cho biết dấu thời gian không được hỗ trợ cho định dạng tệp này | Đầu vào là tệp ODT | Thực hiện dấu thời gian cho các tệp DOCX hoặc DOC, hoặc chuyển đổi sang PDF và sử dụng quy trình ký PDF được mô tả bên dưới. |
No usable version of libssl was found, hoặc một lỗi crash do thiếu gói ICU, trên Linux | Runtime .NET được đóng gói trong gói Python cần OpenSSL 1.1 và phiên bản ICU được hỗ trợ | Cài đặt OpenSSL 1.1, hoặc cài đặt một phiên bản ICU được hỗ trợ. Nếu ứng dụng của bạn không cần định dạng theo văn hoá, đặt DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 để giải quyết lỗi ICU. |
Thay thế: Đánh dấu thời gian cho chữ ký trong đầu ra PDF
Nếu người nhận của bạn cần một tệp PDF thay vì tệp Word đã ký, bạn không cần DigitalSignatureUtil. Hãy ký và đánh dấu thời gian cho PDF khi lưu bằng cách đặt PdfSaveOptions.digital_signature_details.timestamp_settings thành một đối tượng PdfDigitalSignatureTimestampSettings. Phương pháp này đã có sẵn từ lâu hơn so với phiên bản 26.9. Tài liệu tham khảo PdfDigitalSignatureTimestampSettings reference bao gồm một ví dụ đầy đủ.
Các bước tiếp theo
Để thêm các dòng chữ ký, ký bằng hình ảnh dòng chữ ký, hoặc xóa các chữ ký hiện có, xem Work with Digital Signatures trong tài liệu Aspose.Words for Python.
FAQs
Dấu thời gian đáng tin cậy thêm gì vào chữ ký số?
Một cơ quan cấp dấu thời gian (TSA) xác nhận thời điểm chữ ký được tạo. Thời điểm này đến từ một bên thứ ba độc lập thay vì đồng hồ máy tính của người ký, và nó cho phép người xác thực chứng minh rằng chữ ký đã tồn tại trước khi chứng chỉ ký hết hạn hoặc bị thu hồi.Phiên bản Aspose.Words nào hỗ trợ việc tạo dấu thời gian trong DigitalSignatureUtil?
Phiên bản 26.9 của Aspose.Words for Python via .NET đã thêmSignOptions.timestamp_settings,XmlDsigLevel.X_AD_ES_Tvà lớpDigitalSignatureTimestampSettings. Các phiên bản trước chỉ có thể tạo dấu thời gian cho chữ ký trong đầu ra PDF.Tôi có cần đặt cả xml_dsig_level và timestamp_settings không?
Có. Khi chỉ đặt một trong hai, Aspose.Words vẫn ký tài liệu nhưng không yêu cầu hoặc nhúng dấu thời gian, và cũng không phát sinh lỗi.Các định dạng tệp nào có thể được tạo dấu thời gian?
Các tệp DOCX và DOC được ký vớiX_AD_ES_Tsẽ nhận được dấu thời gian. Khi ký tệp ODT với dấu thời gian sẽ gây ra lỗi cho biết định dạng này không hỗ trợ tạo dấu thời gian.is_validcó xác nhận rằng dấu thời gian là hợp lệ không?
Không.DigitalSignature.is_validchỉ kiểm tra chữ ký 자체. Để xác nhận dấu thời gian, cần kiểm tra XML chữ ký có chứa token dấu thời gian và kiểm tra token đó bằng công cụ như OpenSSL.Điều gì xảy ra nếu không thể kết nối tới TSA?
DigitalSignatureUtil.signsẽ ném ra mộtRuntimeErrormô tả vấn đề mạng, xác thực hoặc thời gian chờ. Đường dẫn đích có thể bị để lại dưới dạng tệp rỗng, vì vậy hãy xóa nó trước khi thử lại.
