簡體   English   中英

使用 Java 的 SHA256withDSA 的 X509Certificate 中錯誤的驗證簽名算法

[英]Wrong vertificate signature algorithm in X509Certificate for SHA256withDSA using Java

我有密鑰類型為 DSA、位長為 1024、簽名算法為 SHA256 的證書:

我正在將其轉換為 Java 中的 X509Certificate。 當我試圖從 X509Certificate 獲取簽名算法時,我得到了類似2.16.840.1.101.3.4.3.2 的東西

CertificateFactory factory=CertificateFactory.getInstance("X.509");
X509Certificate cert=(X509Certificate) factory.generateCertificate(inputStream);
    System.out.println(cert.getSigAlgName());

以上方法適用於所有其他類型(正確獲取名稱為SHA256withRSA )。 不適用於 SHA256withDSA(獲得 2.16.840.1.101.3.4.3.2 預期SHA256withDSA )。 如何從證書中獲取正確的簽名算法? 有沒有其他方法可以做到?

根據X.509 規范第 4.1.2.3 節

此字段包含 CA 用於簽署證書的算法的算法標識符。

該字段必須包含與序列證書(第 4.1.1.2 節)中的 signatureAlgorithm 字段相同的算法標識符。 可選參數字段的內容將根據識別的算法而有所不同。 [RFC3279]、[RFC4055] 和 [RFC4491] 列出了支持的簽名算法,但也可以支持其他簽名算法。

這意味着X509Certificate#getSigAlgName返回 CA 用於簽署證書的算法而不是最終用戶(來自當前證書)用於簽署 data/document 的算法

如果您需要采取最終用戶算法,則必須使用另一種方式。

最終,您可以為不同的兼容簽名算法使用一個證書。 示例: SHA1withRSASHA256withRSA RSA證書

這是我在 Eclipse 中嘗試的代碼:

     InputStream inStream = null;
     try {
         inStream = new FileInputStream("<cert-file-name-with-path>");
         CertificateFactory cf = CertificateFactory.getInstance("X.509");
         X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
         System.out.println("##"+cert.getSigAlgName()+"##"+cert.getSigAlgOID()+"##"+cert.getType());
     } finally {
         if (inStream != null) {
             inStream.close();
         }
     }

輸出:

SHA256withDSA##2.16.840.1.101.3.4.3.2##X.509

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM