为ASN.1标识符获得合理的名称

7

使用BouncyCastle库(虽然我猜这个库有点不相关)时,我经常遇到指定为ASN.1标识符的算法ID。例如,证书的签名算法可能是"1.2.840.113549.1.1.11"

是否有一种适当的方法将其转换为某种人类可读形式,而不涉及查找我可以获取的每个ID并手动构建巨大的查找表?

4个回答

2
具体针对签名算法,您可以使用类org.bouncycastle.operator.DefaultAlgorithmNameFinder。但是 - 如果我没记错的话 - 这只在较新版本中引入(我正在使用Bouncy Castle 1.57 - 我还检查了1.46,它没有这个类)。
使用方法很简单:
DefaultAlgorithmNameFinder algFinder = new DefaultAlgorithmNameFinder();
System.out.println(algFinder.getAlgorithmName(new ASN1ObjectIdentifier("1.2.840.113549.1.1.11")));

输出结果为:
SHA256WITHRSA
根据javadoc的说明,如果它找不到一个人性化的名称,就会返回与输入中使用的相同的OID。
另请注意(如@pepo的回答中所述),不同工具之间的人性化名称可能不相同。虽然BouncyCastle返回SHA256WITHRSA,但OID存储库网站使用sha256WithRSAEncryption。
对于其他OID(如扩展和其他字段),我在API中找不到任何信息,因此唯一的替代方案似乎是使用大型查找表。

1

是的。就是这个:org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers.sha256WithRSAEncryption。

有关扩展,请参阅org.bouncycastle.asn1.x509.Extension ASN1ObjectIdentifier列表。


1

我认为没有其他方法,只能建立一个映射表。每个加密库都这样做,例如 OpenSSL、.NET Framework、BouncyCastle 等。

问题是,每个库可能会(并经常)将相同的 OID 分配给不同的 FriendlyName。例如,Openssl 使用 emailAddress,而 .NET 则将其翻译为 E

BouncyCastle 已经实现了这个映射表(抱歉,这里是 C# 版本链接)here(也可能在其他地方)。


是的,它们似乎也将其分散在各个文件中...一个用于签名算法的表,一个用于密钥目的的表,一个用于扩展的表,...目前我正在从OID->资源包键构建一个巨大的查找表,然后从那里查找,但如果所有想要处理无效证书的应用程序都必须付出这么多努力才能向用户显示漂亮的对话框,那就太疯狂了。 :/ - Hakanai

1
有没有一种合适的方式将此转换成一种人类可读的形式,而不需要找到我能找到的每个ID并手动构建一个巨大的查找表?
我对ASN.1的经验是模块实际上将名称与OID绑定: sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } 所以您的ASN.1解析器理论上可以为您自动构建查找表。
更方便的是,如果您的ASN.1库的OBJECT IDENTIFIER类型实现将名称附加到OID对象上,那么人们将能够提出类似以下的问题:

oid.name

不必通过查找表运行 OID:

name = gigantic_oid2name_map[oid]


我同意,很遗憾BC没有将标准符号名称放入标识符中。如果是这样的话,我就可以轻松地在其前面加上前缀,然后就有了完美的值,可以作为用户可读字符串的查找键。 :) 也许我会尝试问问他们是否认为值得添加。 - Hakanai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接