我有一个从X500Name检索的java.security.util.DerValue

x500Name.findMostSpecificAttribute(SOME_OID)


一些值存储为DER编码。 .toString给我一些东西lile:

[DerValue, tag = 18, length = 12]


怎么解码呢?

另外,不可能从中获取bytes []。

derValue.getOctetString


还给我

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检索哪种数据。可以在in this book或标准8824-1 and 8825-1中找到更多信息。

但是,您不应该依赖Sun内部类。如果您可以在byte[]中获得基础DER编码,则可以使用例如有弹性的城堡解析BER / DER。

09-04 21:24