首頁 >Java >ESig DSS 簽名驗證始終傳回 INDETERMINATE

ESig DSS 簽名驗證始終傳回 INDETERMINATE

WBOY
WBOY轉載
2024-02-22 13:49:06790瀏覽

php小編新一為您介紹:在Java開發中,ESig DSS簽名驗證時始終返回"INDETERMINATE"可能是由於簽名不完整或無法驗證所致。此問題通常涉及數位憑證、簽章演算法等方面,需要仔細檢查簽章資料和驗證流程。解決方法包括檢查簽章演算法、憑證有效性、簽章資料完整性等方面,確保所有步驟正確無誤。透過仔細排查可能的問題,可以解決這個常見的簽章驗證困擾,確保系統的資料安全和完整性。

問題內容

我正在嘗試使用歐盟委員會贊助的數位簽章服務 (dss) 庫 5.12.1 來驗證數位簽章 pdf 和 xml 的電子簽章。

我使用的程式碼是

byte[] binaryPdf = Base64.getDecoder().decode(base64EncodedDocument);
CommonTrustedCertificateSource trustedCertSource = new CommonTrustedCertificateSource();
CertificateVerifier cv = new CommonCertificateVerifier();
cv.setAIASource(new DefaultAIASource());
cv.setOcspSource(new OnlineOCSPSource());
cv.setCrlSource(new OnlineCRLSource());
cv.addTrustedCertSources(trustedCertSource);
DSSDocument document = new InMemoryDocument(binaryPdf, shortFileName);
SignedDocumentValidator documentValidator = SignedDocumentValidator.fromDocument(document);
documentValidator.setCertificateVerifier(cv);
UserFriendlyIdentifierProvider userFriendlyIdentifierProvider = new UserFriendlyIdentifierProvider();
documentValidator.setTokenIdentifierProvider(userFriendlyIdentifierProvider);
Reports reports = documentValidator.validateDocument();

在 dss 文件 pdf 中指出。我的應用程式總是獲得帶有子指示 no_certificate_chain_found 的 indeterminate 指示(在憑證鏈的憑證元素中可見)。它找不到信任錨。當我使用範例應用程式 5.12.1 進行簽名驗證並嘗試驗證相同文件時,我得到了預期的 total_passed 指示。我的應用程式可以存取互聯網。我做錯了什麼? 謝謝!

解決方法

範例應用程式和您的程式碼之間存在差異。
範例應用程式附帶預先配置的受信任根清單 (EU LOTL)。
您的程式碼附帶一個空的 CommonTrustedCertificateSource (即沒有憑證受信任)

請參考DSS FAQ

#

因此您需要在 CommonTrustedCertificateSource 新增一些憑證。如果您僅驗證自己建立的簽名,請將您的 CA 根/簽名憑證新增至受信任的來源。如果您要驗證第三方簽名,解決方案會更加複雜。例如,您可以從 PDF 中提取所有經過認證的內容,並在驗證之前將它們新增至受信任清單中

以上是ESig DSS 簽名驗證始終傳回 INDETERMINATE的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除