我有一个java.security.util.DerValue
,我从X500Name检索。
x500Name.findMostSpecificAttribute(SOME_OID)
一些值存储为der编码。.toString
返回如下内容:
[DerValue, tag = 18, length = 12]
如何解码?
也不可能从中获取bytes[]。
derValue.getOctetString
返回me
java.io.IOException: DerValue.getOctetString, not an Octet String: 18
编辑:我的解决方案是:
def decodeDERValue(derValue: DerValue): String = {
val asnInput = new ASN1InputStream(new ByteArrayInputStream(derValue.toByteArray))
val obj = asnInput.readObject()
val derValueSting = obj match {
case p: DERPrintableString => p.getString
case p: DERUTF8String => p.getString
case p: DERIA5String => p.getString
case _ => ASN1Dump.dumpAsString(obj, true)
}
asnInput.close()
derValueSting.trim
}
这是Sun内部的一个类,它叫sun.security.util.DerValue
,不是java.security.util.DerValue
。ASN.1类型由标签中的信息识别。因此,这取决于标签,您可以从DerValue
检索到什么样的数据。更多信息可在本书或标准8824-1和8825-1中找到。
你不应该依赖于Sun内部类。如果你能在byte[]
中获得底层DER编码,你可以使用例如Bouncy Castle来解析BER/DER。
类提供了各种构造函数和方法。
1)尝试该类的其他方法。关于
toByteArray()
getDataBytes()
getAsString() // calls toPrintableString internally
?我只是稍微看了一下字节码,还不能肯定。