Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Změna CSP/KSP poskytovatele v existujícím PFX souboru
říjen 05
Změna CSP/KSP poskytovatele v existujícím PFX souboru

Když exportujete certifikát i s jeho soukromým klíčem (private key) tak vytváříte PFX soubor (neboli PKCS12 formát souboru, někdy také přípona P12). Problém na Windows je ten, že tento soubor obsahuje navíc jedno políčko (rozšíření, extension) s názvem kryptografického poskytovatele (cryptographic provider), který daný privátní klíč zrovna spravuje a v němž byl původně uložen.

Poskytovatel je buď tzv. starší CSP (cryptographic services provider), nebo tzv. novější CNG/KSP (cryptography next generation, key storage provider). Jaké všechny takové poskytovatele na počítači máte zjistíte jednoduše pomocí certutil -csplist. Z daného PFX souboru tuto informaci dostanete pomocí certutil -dump.

Soubor PFX je tím pádem na dále vázán na tohoto poskytovatele. Je možné, že na cílovém stroji takový poskytovatel neexistuje. Nebo aplikace, pro kterou certifikát instalujete, neumí právě toho původního použít, i když by byl na počítači k dispozici (viz. velká ne-podpora v mnoha moderních programech).

Název poskytovatele je v souboru uložen jen jako prostý text. Není k tomu nic vázáno, takže pokud je potřeba ho změnit, stačí nějak upravit jeho hodnotu. Samozřejmě by mohly být problémy s importem, pokud byste se snažili dostat do poskytovatele třeba delší privátní klíč, než by on sám uměl, ale to je málo pravděpodobné, běžné certifikáty umí většina z nich.

K úpravě potřebujete ale openssl, protože zabudovaný certutil to neumí. Openssl stáhnete někde na internetu. No a potom už jenom použijete PowerShell:

$pwd = 'Pa$$w0rd'
$openSsl = 'C:\OpenSSL-Win32\bin\openssl.exe'
$pfx = 'C:\ONDRA\pfx-with-wrong-csp-to-replace.pfx'

$newCSP = 'Microsoft Enhanced RSA and AES Cryptographic Provider'

$pem = [IO.Path]::ChangeExtension($pfx, '.pem')
$newPfx = [IO.Path]::ChangeExtension($pfx, '.newCSP.pfx')

Write-Host ('Original PFX file: {0}' -f $pfx) -Fore Green
certutil -dump -p $pwd $pfx

& $openssl pkcs12 -in $pfx -out $pem -passin "pass:$pwd" -passout "pass:$pwd"

& $openssl pkcs12 -export -in $pem -out $newPfx -CSP $newCSP -passin "pass:$pwd" -passout "pass:$pwd"

Write-Host ('New PFX file: {0}' -f $newPfx) -Fore Green
certutil -dump -p $pwd $newPfx

Comments

Re: Změna CSP/KSP poskytovatele v existujícím PFX souboru

Díky moc za super články ohledně certifikátů - měl bych k nim pár dotazů:

1) V článku (https://www.sevecek.com/Lists/Posts/Post.aspx?ID=40) se píše - Pokud máte svůj nějaký certifikát s privátním klíčem, musí být vždycky uložen pomocí nějakého poskytovatele. PostSignum -> pokud se vygeneruje žádost pomocí aplikace iSignum, tak při zadání příkazu certutil -user -store MY není vidět / není přiřazený žádný provider. Certifikát ale funguje všude tam, kde se vystačí třeba s SHA1. Pomocí PowerShellu (dir cert:\CurrentUser\My)[0].privatekey.cspkeycontainerinfo (https://www.sysadmins.lv/blog-en/how-to-properly-delete-certificate-with-private-key-in-powershell.aspx) se dokážu dobrat poskytovatele. Proč certutil nedokáže zobrazit správného poskytovatele?

POWERSHELL
ProviderName           : Microsoft Strong Cryptographic Provider

CERTUTIL
================ Certificate 1 ================
Serial Number: 1ebe71
Issuer: CN=PostSignum Qualified CA 2, O=Česká pošta, s.p. [IČ 47114983], C=CZ
 NotBefore: 10. 6. 2018 10:02
 NotAfter: 10. 6. 2019 10:02
Subject: SERIALNUMBER=P182838, G=Anna, SN=Nováková, CN=Anna Nováková, OU=P182838, C=CZ
Non-root Certificate
Cert Hash(sha1): f5 3e b5 b3 b4 cb b9 ae 88 ec 3c ec 47 eb ac 5a be 4c 74 a6
  Key Container = iSignum 20180609-164455
  Unique container name: 07af8fa089731bd108099ee29eb6e958_23ffeb3f-f1ed-48ee-82f6-c44bd535e56a
  Provider = (null)
Encryption test passed

2. V EN článku (http://www.sevecek.com/EnglishPages/Lists/Posts/Post.aspx?ID=8) je napsáno - You cannot simply move a private key from one CSP to another nor to a CNG or wiceversa either. V aplikaci iSignum je možné "zapnout" podporu SHA-256 (záložka Windows - poslední sloupec Podpora SHA-256 a pokud je tam volba zapnout, tak po kliknutí na se zapne podpora SHA-256). Aplikace na pozadí změní poskytovatele na Microsoft Enhanced RSA and AES Cryptographic Provider, který podporuje SHA-256 a další (https://docs.microsoft.com/en-us/windows/desktop/seccertenroll/cryptoapi-cryptographic-service-providers). Toto funguje i pokud není privátní klíč exportovatelný. Je možné něčeho podobného docílit i bez nutnosti exportu certifikátu do PFX, jeho změny přes OpenSSL a jeho nového importu? Mohou používat "interně" třeba něco popsaného zde (https://docs.microsoft.com/en-us/dotnet/framework/wcf/extending/change-cryptographic-provider-x509-certificate-private-key)? Nešlo by něco podobného napsat pro PowerShell (když je to možné pomocí certutil)?
Během psaní postu jsem přišel na možnost změny CSP u instalovaného certifikátu pomocí certutil -> certutil -user -csp "Microsoft Enhanced RSA and AES Cryptographic Provider" -f -repairstore MY sha1CertThumbprint
Mělo by být možné to udělat i pomocí PropertyInfFile   ale k tomu neexistuje žádná dokumentace (https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certutil)

3. Při exportu výše zmiňovaného certifikátu, se v PFX souboru nastaví Provider = Microsoft Enhanced Cryptographic Provider v1.0. Neměl by zůstat ten původní poskytovatel?

4. Existuje možnost importovat certifikát pomocí PowerShellu a zvolit CSP? U certutil je to jednoduché - certutil -csp atd., ale u PowerShellu jsem nedokázal nic podobného najít.

Předem díky za reakci
Jiří on 28.7.2018 12:10

Add Comment

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Type number two as digit *


Semhle vyplňte číslici dvě. Předchozí antispemové pole nefunguje úplně dokonale, zdá se, že jsou i spamery, které pochopily, že je občas potřeba vyplnit autora :-)

Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments