Como posso imprimir / exibir o “Nome Principal do Usuário” ou UPN de um certificado “p12” no Linux?

3

Minha empresa me enviou um certificado para meu smartphone. O nome do arquivo é "3274634.p12". A documentação diz "Insira seu nome principal de usuário (UPN) como login" e descreve como obter esse valor usando o Internet Explorer.

Como posso fazer o mesmo no Linux (Kubuntu 13.04)?

    
por Aaron Digulla 05.07.2013 / 10:31

1 resposta

7

O arquivo PKCS # 12 geralmente contém um certificado X.509 e sua chave privada associada. Todas as informações são armazenadas no certificado, então você precisa extraí-las primeiro:

openssl pkcs12 -in foo.p12 -out foo.pem

( foo.pem conterá o certificado e a chave privada.)

O UPN é armazenado como um tipo especial de "subjectAltName" no certificado. Infelizmente, o OpenSSL ainda não sabe como exibir UPNs (assim como alguns outros tipos de nomes), portanto o comando usual para examinar certificados ( openssl x509 -noout -text < foo.pem ) não funcionará. Em vez disso, você precisará de ferramentas de baixo nível.

Separe o certificado para um arquivo próprio (você também pode fazer isso com um editor de texto):

openssl x509 < foo.pem > foo.cert

Imprimir o certificado como uma estrutura ASN.1:

openssl asn1parse -i -dump < foo.cert

Encontre as linhas que descrevem a extensão 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...

E execute asn1parse novamente, desta vez dizendo para aprofundar o conteúdo da extensão (que é uma outra estrutura ASN.1) - neste exemplo, o valor (linha "OCTET STRING") começa no deslocamento 750 :

openssl asn1parse -i -dump -strparse 750 < foo.cert

Finalmente, procure o UPN no despejo:

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      :[email protected]

Se você tiver as ferramentas GnuTLS instaladas, há um caminho mais rápido, mas não tão confiável. Depois de extrair o certificado, você poderá alimentá-lo com certtool -i < foo.cert e imprimir o conteúdo bruto até mesmo de nomes que ele não reconhece:

Subject Alternative Name (not critical):
    otherName OID: 1.3.6.1.4.1.311.20.2.3
    otherName DER: 0c1867726177697479404e554c4c524f5554452e45552e4f5247
    otherName ASCII: [email protected]

Procure o OID 1.3.6.1.4.1.311.20.2.3 ; será seguido pelo conteúdo bruto do nome. Felizmente, eles consistem em uma única UTF8String, então a saída "otherName ASCII" é facilmente entendida - apenas tire os dois primeiros bytes (mostrados como pontos aqui).

Uma maneira mais simples seria apenas tentar entrar no seu próprio login do Windows; o UPN está sempre no formato username@domain .

(É um pouco triste que, de todas as ferramentas que eu tentei, quase nenhum deles saiba como interpretar tipos de nome tão simples e comumente usados - mesmo que proprietários -).

    
por 05.07.2013 / 15:26