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