提问人:user1391606 提问时间:11/17/2023 最后编辑:Progmanuser1391606 更新时间:11/20/2023 访问量:31
ASN1TaggedObject 中的 Java BouncyCastle getObject() 已被弃用,如何替换?
Java BouncyCastle getObject() in ASN1TaggedObject has been deprecated how to replace?
问:
升级到 BouncyCastle 的 1.71 版时,我们在编译时收到以下警告:
warning: [deprecation] getObject() in ASN1TaggedObject has been deprecated ASN1OctetString url = (ASN1OctetString) location.getObject();
我可以从以下方面看到:
描述如下:
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();
所以这个警告消失了。
任何帮助非常感谢。
答:
当询问如何解析某些 ASN.1 结构时,理想情况下会给出所涉及的 ASN.1 定义。在这种情况下,这一点尤为重要,因为正确解析标记对象需要知道标记定义(以及是否在相关的 ASN.1 模块中启用了隐式标记)。
旧的假设您已经检查了标签编号 (),并且它也仅适用于使用显式标记的CONTEXT_SPECIFIC标签。getObject
getTagNo
对替代品的合理猜测是:
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
}
}
}
经过一些阅读,这是解决方案:
ASN1TaggedObject location = (ASN1TaggedObject) obj.getObjectAt(1);
ASN1OctetString uri = (ASN1OctetString) location.getBaseObject();
所以用getObject()
getBaseObject()
评论
ASN1OctetString url = null;