Как правильно получить SAN GUID с ASN1Sequence - PullRequest
1 голос
/ 02 мая 2020

У меня есть сертификат X509 с SAN (GUID)

Предполагается, что его получит следующий метод:

private static String getGUIDStringFromSequence(final ASN1Sequence seq)
    {
        if (seq != null)
        {
            // First in sequence is the object identifier, that we must check
            System.out.println(seq);
            final ASN1ObjectIdentifier id = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0));
            if (id != null && GUID_OBJECTID.equals(id.getId()))
            {
                final ASN1TaggedObject obj = (ASN1TaggedObject) seq.getObjectAt(1);
                ASN1Primitive prim = obj.getObject();

                // Due to bug in java cert.getSubjectAltName, it can be tagged an extra time
                if (prim instanceof ASN1TaggedObject)
                {
                    System.out.println("instance ASN1TaggedObject");
                    prim = ASN1TaggedObject.getInstance(((ASN1TaggedObject) prim)).getObject();
                }

                if (prim instanceof ASN1OctetString)
                {
                    System.out.println("instance ASN1OctetString");
                    return new String(((ASN1OctetString) prim).getOctets());
                }
                else if (prim instanceof ASN1String)
                {
                    System.out.println("instance ASN1String");
                    return ((ASN1String) prim).getString();
                }
                else
                {
                    return null;
                }
            }

            //System.out.println(id.getId());
        }
        return null;
    }

Вывод, который я получаю, следующий:

[1.3.6.1.4.1.311.25.1, [0][0]#4d202cbf1b554732973b2ae849e7a70b]
instance ASN1TaggedObject
instance ASN1OctetString

И хотя 4d202cbf1b554732973b2ae849e7a70b - это то, что я ищу, строка, которую я получаю в конце M ,�UG2�;*�I� определенно не

В чем проблема? Связано ли это с кодировкой?

Заранее спасибо

UPD

Я изменил строку:

if (prim instanceof ASN1OctetString)
{
   System.out.println("instance ASN1OctetString");
   return new String(((ASN1OctetString) prim).getOctets());
}

до:

if (prim instanceof ASN1OctetString)
{
   System.out.println("instance ASN1OctetString");
   return prim.toString();
}

И я получаю #4d202cbf1b554732973b2ae849e7a70b. Тем не менее, я все еще считаю, что я должен получить значение по-другому, а не просто вызывать .toString() на ASN1OctetString объекте

Кроме того, для чего нужен знак ha sh?

...