Файл PKCS # 12 обычно содержит сертификат X.509 и связанный с ним закрытый ключ. Вся информация хранится в сертификате, поэтому сначала нужно извлечь ее:
openssl pkcs12 -in foo.p12 -out foo.pem
(foo.pem
будет содержать как сертификат, так и закрытый ключ.)
UPN хранится в сертификате как специальный тип "subjectAltName". К сожалению, OpenSSL пока не знает, как отображать UPN (а также некоторые другие типы имен), поэтому обычная команда для проверки сертификатов (openssl x509 -noout -text < foo.pem
) не будет работать. Вместо этого вам понадобятся инструменты низкого уровня.
Разделите сертификат на собственный файл (вы также можете сделать это с помощью текстового редактора):
openssl x509 < foo.pem > foo.cert
Распечатайте сертификат как структуру ASN.1:
openssl asn1parse -i -dump < foo.cert
Найдите строки, которые описывают расширение subjectAltName:
742:d=4 hl=3 l= 200 cons: SEQUENCE
745:d=5 hl=2 l= 3 prim: OBJECT :X509v3 Subject Alternative Name
750:d=5 hl=3 l= 192 prim: OCTET STRING [HEX DUMP]:3081BDA036...
И снова запустите asn1parse
, на этот раз попросив его копаться глубже в содержимое расширения (которое является еще одной структурой ASN.1) - в этом примере значение (строка "OCTET STRING") начинается со смещения 750:
openssl asn1parse -i -dump -strparse 750 < foo.cert
Наконец, ищите UPN в дампе:
59:d=1 hl=2 l= 40 cons: cont [ 0 ]
61:d=2 hl=2 l= 10 prim: OBJECT :Microsoft Universal Principal Name
73:d=2 hl=2 l= 26 cons: cont [ 0 ]
75:d=3 hl=2 l= 24 prim: UTF8STRING :grawity@NULLROUTE.EU.ORG
Если у вас установлены инструменты GnuTLS, есть более быстрый способ, но не такой надежный. После того, как вы извлечете сертификат, вы можете передать его в certtool -i < foo.cert
, и он напечатает необработанное содержимое даже с именами, которые он не распознает:
Subject Alternative Name (not critical):
otherName OID: 1.3.6.1.4.1.311.20.2.3
otherName DER: 0c1867726177697479404e554c4c524f5554452e45552e4f5247
otherName ASCII: ..grawity@NULLROUTE.EU.ORG
Ищите OID 1.3.6.1.4.1.311.20.2.3
; за ним последует необработанное содержимое имени. К счастью, они состоят из единственной строки UTF8, поэтому вывод "otherName ASCII" легко понять - просто зачистите первые два байта (показаны здесь как точки).
Более простым способом было бы просто попытаться ввести свой собственный логин Windows; UPN всегда находится в форме username@domain
.
(Немного грустно, что из всех инструментов, которые я пробовал, почти никто из них не знает, как интерпретировать такие простые и часто используемые - даже если проприетарные - типы имен.)