Comment puis-je imprimer / afficher le «Nom de l'utilisateur principal» ou le nom UPN d'un certificat «p12» sous Linux?

3

Mon entreprise m'a envoyé un certificat pour mon téléphone intelligent. Le nom du fichier est "3274634.p12". La documentation indique "Entrez votre nom d'utilisateur principal (UPN) en tant que connexion" et décrit comment obtenir cette valeur à l'aide d'Internet Explorer.

Comment puis-je faire la même chose sous Linux (Kubuntu 13.04)?

Aaron Digulla
la source
1
Par défaut, aucun "UPN" ou "Nom de l'utilisateur principal" n'est défini dans un fichier PKCS # 12. Pouvez-vous nous dire comment cela fonctionne dans IE peut-être alors que n'importe qui peut vous dire comment le faire sur Linux.
Uwe Plonus

Réponses:

7

Le fichier PKCS # 12 contient généralement un certificat X.509 et sa clé privée associée. Toutes les informations sont stockées dans le certificat, vous devez donc les extraire au préalable:

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

( foo.pem contiendra à la fois le certificat et la clé privée.)

L'UPN est stocké en tant que type spécial de "subjectAltName" dans le certificat. Malheureusement, OpenSSL ne sait pas encore comment afficher les UPN (ainsi que certains autres types de noms), aussi la commande habituelle pour examiner les certificats ( openssl x509 -noout -text < foo.pem ) ne fonctionnera pas. Au lieu de cela, vous aurez besoin d'outils de bas niveau.

Séparez le certificat dans un fichier qui lui est propre (vous pouvez également le faire avec un éditeur de texte):

openssl x509 < foo.pem > foo.cert

Imprimez le certificat en tant que structure ASN.1:

openssl asn1parse -i -dump < foo.cert

Recherchez les lignes décrivant l'extension 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...

Et courir asn1parse de nouveau, cette fois en lui demandant de creuser plus profondément dans le contenu de l'extension (qui est encore une structure ASN.1) - dans cet exemple, la valeur (ligne "OCTET STRING") commence au décalage 750:

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

Enfin, recherchez le nom UPN dans le dump:

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]

Si vous avez installé des outils GnuTLS, il existe un moyen plus rapide mais pas aussi fiable. Une fois le certificat extrait, vous pouvez l’alimenter certtool -i < foo.cert, et il imprimera le contenu brut même des noms qu’il ne reconnaît pas:

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

Rechercher l'OID 1.3.6.1.4.1.311.20.2.3; il sera suivi du contenu brut du nom. Heureusement, ils consistent en une seule chaîne UTF8String, de sorte que la sortie "otherName ASCII" est facile à comprendre - supprimez simplement les deux premiers octets (représentés par des points ici).


Une solution plus simple consisterait simplement à saisir votre propre identifiant Windows. l'UPN est toujours sous la forme username@domain.

(C’est un peu triste de constater que, parmi tous les outils que j’ai essayés, presque aucun d’entre eux ne sait interpréter des types de noms aussi simples et couramment utilisés - même s’ils sont propriétaires -.)

grawity
la source
Comment… compliqué mais ça marche. Juste une chose. Il imprime :name@domain. Je suppose que les deux points peuvent / doivent être ignorés?
Aaron Digulla
1
@AaronDigulla: Oui, les deux points font simplement partie de la sortie asn1parse. L'UPN est toujours name@domain.
grawity
1
dumpasn1 pourrait également être utile d'essayer. Je n'ai pas encore essayé le certificat avec UPN, mais son fichier de configuration comprend "OID = 1 3 6 1 4 1 311 20 2 3 Comment = Microsoft UPN Description = universalPrincipalName"
armb