解码从X500Name编码的值



我有一个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

?我只是稍微看了一下字节码,还不能肯定。

如果你显式地调用一个构造函数,尝试从提供给构造函数的参数中获取内容。

最新更新