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中文網其他相關文章!