3

Моя компания прислала мне сертификат на мой смартфон. Имя файла: «3274634.p12». В документации написано «Введите ваше основное имя пользователя (UPN) в качестве логина» и описано, как получить это значение с помощью Internet Explorer.

Как я могу сделать то же самое в Linux (Kubuntu 13.04)?

1 ответ1

7

Файл 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 .

(Немного грустно, что из всех инструментов, которые я пробовал, почти никто из них не знает, как интерпретировать такие простые и часто используемые - даже если проприетарные - типы имен.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .