【问题标题】:Wrong vertificate signature algorithm in X509Certificate for SHA256withDSA using Java使用Java的SHA256withDSA的X509Certificate中的错误验证签名算法
【发布时间】:2015-08-25 05:58:18
【问题描述】:

我有密钥类型 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)。如何从证书中获得正确的签名算法?还有其他方法吗?

【问题讨论】:

  • 我认为你应该发布更多的代码和更少的证书 ;-) 只要确保你不发布敏感信息。
  • 当你说“上述方法适用于所有其他类型”时,你实际上得到了什么你认为有效的东西?另外,您说不适用于 SHA256withDSA,意味着获得签名 ID“2.16.840.1.101.3.4.3.2”不是您的预期结果?您能否告诉我们您使用方法 cert.getSigAlgName() 得到的输出,看看这个输出是否是您需要的预期信息?
  • @ChaitanyaP 请参阅已编辑问题
  • @Peanut 谢谢我会考虑你的观点。证书是所有人都可以访问的公共信息。
  • 您是在 Java 8 上运行,还是使用自定义提供程序?只有在 8(或更高版本)中,默认提供程序才实现 FIPS 186-3(组大小 2k 和 3k,子组 224 和 256,以及相应的 SHA-2 哈希)。

标签: java ssl certificate x509certificate


【解决方案1】:

这是我在 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

【讨论】:

  • ##2.16.840.1.101.3.4.3.2##2.16.840.1.101.3.4.3.2##X.509 它是我的输出。你用的是什么java版本
  • Java SE 1.8,我使用了您提供的证书。它工作正常。
  • 这里的 Java SE 1.7 也可能是原因
【解决方案2】:

根据X.509 specification Section 4.1.2.3

此字段包含 CA 用于签署证书的算法的算法标识符。

该字段必须包含与序列证书中的 signatureAlgorithm 字段相同的算法标识符(第 4.1.1.2 节)。可选参数字段的内容将根据识别的算法而有所不同。 [RFC3279]、[RFC4055] 和 [RFC4491] 列出了支持的签名算法,但也可能支持其他签名算法。

这意味着 X509Certificate#getSigAlgName 返回 CA 用于签署证书的算法,不是最终用户(来自当前证书)用于签署数据/文档的算法

如果你需要采取最终用户算法,你必须使用另一种方式。

最终,您可以将一个证书用于不同的兼容签名算法。示例:SHA1withRSASHA256withRSARSA 证书

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2014-01-18
    • 1970-01-01
    • 2015-10-13
    • 2019-09-08
    相关资源
    最近更新 更多