ASN1TaggedObject 中的 Java BouncyCastle getObject() 已被弃用,如何替换?

Java BouncyCastle getObject() in ASN1TaggedObject has been deprecated how to replace?

提问人:user1391606 提问时间:11/17/2023 最后编辑:Progmanuser1391606 更新时间:11/20/2023 访问量:31

问:

升级到 BouncyCastle 的 1.71 版时,我们在编译时收到以下警告:

warning: [deprecation] getObject() in ASN1TaggedObject has been deprecated ASN1OctetString url = (ASN1OctetString) location.getObject();

我可以从以下方面看到:

https://javadoc.io/doc/org.bouncycastle/bcprov-jdk15on/latest/org/bouncycastle/asn1/ASN1TaggedObject.html#getTagClass--

描述如下:

getObject() Deprecated. Tagged objects now include the tag class. This method will raise an exception if it is not BERTags.CONTEXT_SPECIFIC. Use getBaseUniversal(boolean, int) only after confirming the expected tag class.

我不知道如何重写:

ASN1OctetString url = (ASN1OctetString) location.getObject();

所以这个警告消失了。

任何帮助非常感谢。

Java Bouncycastle 已弃用

评论

0赞 tucuxi 11/17/2023
你能写一个最小的例子,让人们可以看到你想做什么吗?开玩笑,会毫无征兆地编译......ASN1OctetString url = null;
0赞 user1391606 11/21/2023
谢谢反馈,我添加了位置实例化行(见帖子)。

答:

2赞 Peter Dettman 11/20/2023 #1

当询问如何解析某些 ASN.1 结构时,理想情况下会给出所涉及的 ASN.1 定义。在这种情况下,这一点尤为重要,因为正确解析标记对象需要知道标记定义(以及是否在相关的 ASN.1 模块中启用了隐式标记)。

旧的假设您已经检查了标签编号 (),并且它也仅适用于使用显式标记的CONTEXT_SPECIFIC标签。getObjectgetTagNo

对替代品的合理猜测是:

ASN1Util.getContextBaseUniversal(location, tagNo, true, BERTags.OCTET_STRING)

其中“tagNo”是标记号,该标记号应在呼叫站点上已知,而“true”表示该字段正在使用显式标记。


从您的示例代码中,我们可以看到这里正在解析的整体扩展是一个颁发机构信息访问(在此处阅读有关扩展的信息);从技术上讲,ASN.1 类型是 .值得一读该部分,以特别了解“accessLocation”(作为 GeneralName)可以采用多种形式(尽管我认为如果您不能使用其他形式,可以只处理 URI 形式)。AuthorityInfoAccessSyntax

BouncyCastle 已经有一个类来解析这些:

org.bouncycastle.asn1.x509.AuthorityInformationAccess

因此,您可以像这样重写您的方法:

protected static void getAuthorityInfoExtensionValue(byte[] extensionValue,
    CertSignatureInformation certInfo) throws IOException
{
    AuthorityInformationAccess authInfo = AuthorityInformationAccess.getInstance(
        JcaX509ExtensionUtils.parseExtensionValue(extensionValue));

    for (AccessDescription accessDescription : authInfo.getAccessDescriptions())
    {
        ASN1ObjectIdentifier accessMethod = accessDescription.getAccessMethod();
        GeneralName accessLocation = accessDescription.getAccessLocation();

        if (X509ObjectIdentifiers.id_ad_ocsp.equals(accessMethod))
        {
            if (GeneralName.uniformResourceIdentifier == accessLocation.getTagNo())
            {
                ASN1IA5String uri = ASN1IA5String.getInstance(accessLocation.getName());
                certInfo.setOcspUrl(uri.getString());
            }
        }
        else if (X509ObjectIdentifiers.id_ad_caIssuers.equals(accessMethod))
        {
            if (GeneralName.uniformResourceIdentifier == accessLocation.getTagNo())
            {
                ASN1IA5String uri = ASN1IA5String.getInstance(accessLocation.getName());
                certInfo.setIssuerUrl(uri.getString());
            }
        }
    }
}

您可能还应该处理给定访问方法存在多个访问描述的可能性(因此可能有多个 URI)。


对于第二个示例 (),BC 具有以下 ASN.1 类型(另请参阅 RFC 5280 4.2.1.13):getCrlUrlFromExtensionValue

org.bouncycastle.asn1.x509.CRLDistPoint

示例代码:

    CRLDistPoint crlDistPoint = CRLDistPoint.getInstance(
        JcaX509ExtensionUtils.parseExtensionValue(extensionValue));
    for (DistributionPoint distPoint : crlDistPoint.getDistributionPoints())
    {
        GeneralNames crlIssuer = distPoint.getCRLIssuer();
        if (crlIssuer != null)
        {
            for (GeneralName name : crlIssuer.getNames())
            {
                // Look for URI as in first example
            }
        }
    }
0赞 user1391606 11/21/2023 #2

经过一些阅读,这是解决方案:

ASN1TaggedObject location = (ASN1TaggedObject) obj.getObjectAt(1);
ASN1OctetString uri = (ASN1OctetString) location.getBaseObject();

所以用getObject()getBaseObject()

评论

0赞 Peter Dettman 11/21/2023
这根本不会对标记是否具有正确的类和标记号或是否隐式标记执行任何验证。请包含您尝试解析的实际 ASN.1 类型,以便我们给出正确的解决方案。
0赞 user1391606 11/22/2023
嗨,感谢您的反馈。我更新了我的原始帖子。似乎此代码源自 PDFBox 示例。请参阅 svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/... 。在此类中,getObject() 被替换为 getBaseObject()。干杯。
0赞 Peter Dettman 11/22/2023
我已经用建议的替换代码更新了我的答案。
0赞 user1391606 11/23/2023
嗨,彼得,更新。我会在接下来的几天里尝试。我用第二种方法更新了我的帖子,该方法也使用 getObject()。我试图根据您的代码重写它,但不幸的是,我的 ASN 知识非常有限。你能看一看并指出我正确的方向是什么/如何重写吗?干杯。
0赞 user1391606 11/24/2023
嗨,PEter,我们测试了您对 getAuthorityInfoExtensionValue 函数的重写,这确实按预期工作。我会接受你的回答。干杯。