![](/img/trans.png)
[英]Android Studio 2.0 - NoSuchAlgorithmException: SHA256WITHDSA Signature not available
[英]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 )。 如何從證書中獲取正確的簽名算法? 有沒有其他方法可以做到?
此字段包含 CA 用於簽署證書的算法的算法標識符。
該字段必須包含與序列證書(第 4.1.1.2 節)中的 signatureAlgorithm 字段相同的算法標識符。 可選參數字段的內容將根據識別的算法而有所不同。 [RFC3279]、[RFC4055] 和 [RFC4491] 列出了支持的簽名算法,但也可以支持其他簽名算法。
這意味着X509Certificate#getSigAlgName返回 CA 用於簽署證書的算法,而不是最終用戶(來自當前證書)用於簽署 data/document 的算法。
如果您需要采取最終用戶算法,則必須使用另一種方式。
最終,您可以為不同的兼容簽名算法使用一個證書。 示例: SHA1withRSA
和SHA256withRSA
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();
}
}
輸出:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.