05.03.2017, Vladimír Klaus, navštíveno 4684x
Pokud se chcete začít zabývat podepisováním aplikací, pak je ideální začít tím, že si vytvoříte vlastní certifikát. Komerční jsou relativně drahé a stejně je dobré se do problematiky nějak ponořit, než "vyhodíte" 5 000,-, případně i více.
Asi nejlepší začátek (v češtině) je skvělý návod od Pepáka. Provede vás celým procesem, vše je hodně komentované a mě to velmi pomohlo. Má to jen dva háčky, což chápu s ohledem na to, že jde o článek z roku 2010:
- pokud vynecháte "složitější" postup, tak vám to nebude fungovat
- pokud následně nezajistíte důvěryhodnost kořenového certifikátu, tak vám to nebude fungovat
Pokud tedy budete postupovat tou jednodušší cestou (popsanou i na jiných webech), dojdete do stavu, kdy podepsání skončí hláškou: "The signer’s certificate is not valid for signing", což je opravdu frustrující, protože nevíte proč není validní. To se v těch článcích nepíše, ale je také možné, že to je výsledek až novějších Windows, resp. přísnějších pravidel.
Pěkně se o tom píše v tomto článku. A to mě navedlo k tomu, že z Pepákova článku nelze vynechat tu složitější část, kde se certifikát vytvoří s délkou klíče 2048 bitů. Vše bude ukázáno níže v dávkových souborech.
Malá vsuvka: Další z oblíbených hlášek při podepisování je "The signing certificate is not valid for the requested usage.". To se stane v situaci, kdy máte dobře vytvořený a nainstalovaný certifikát, jen se nedá použít - klasickým příkladem je certifikát pro podepisování dokumentů/mailů/DPH třeba od PostSignum. A kdy a proč se použije tento certifikát? No třeba v případě, že zavoláte podepisovací aplikaci s parametrem /a, což znamená vybrat ten nejlepší certifikát, co máte. A když třeba ani jiný nemáte...
Ale zpět k podepisování. Pokud tedy zvládnete vytvořit konečně korektní certifikát, pak se objeví problém číslo 2. Aplikaci podepíšete, ale kontrola neprojde - "A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider".
K řešení mi pomohl tento článek. Je třeba spustit Microsoft Management Console, což je zde "C:\Windows\System32\mmc.exe". Tam vyberete "Přidat nebo odebrat modul snap-in".
Objeví se dialog (pěkně zprasený), ve kterém vyberte Certifikáty a Přidat.
Dále pak zvolte "Účet počítače" a "Místní počítač". Po potvrzení dialogu rozbalte v levém seznamu Důvěryhodné kořenové certifikační autority a přes kontextové menu u certifikátů zvolte Všechny úkoly > Importovat... A nalistujte váš root-certifikát.cer.
Pokud vše proběhne úspěšně, najdete svůj kořenový certifikát zde:
Když toto vše absolvujete a spustíte znovu dávku na podepsání, vše včetně kontroly proběhne úspěšně.
Ukázka dávkových souborů
Vytvoření certifikátu provedete pomocí této dávky. Důležité je správně nastavit cestu k nástrojům (ToolsRoot), která se může lišit podle toho, co všechno máte nebo nemáte nainstalováno. Pokud tyto aplikace nikde nenajdete, pak si zřejmě budete muset nainstalovat Microsoft Windows SDK.
@echo off
rem hlavní složka s nástroji
set ToolsRoot="c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Microsoft Azure Data Lake Tools for Visual Studio 2015\2.1.0000.0\CppSDK\SDK\bin\"
rem nástroje
set MC=%ToolsRoot%makecert.exe
set CS=%ToolsRoot%cert2spc.exe
set PP=%ToolsRoot%pvk2pfx.exe
rem Odstraním dříve vytvořené soubory týkající se certifikátu
del vkCert.*
rem Připravím certifikát a další soubory
%MC% -r -len 4096 -sv vkCert-root.pvk -n "CN=Vlada Klaus (root CA);E=http://www.vladimirklaus.cz" vkCert-root.cer
%MC% -ic vkCert-root.cer -iv vkCert-root.pvk -len 2048 -m 12 -sv vkCert.pvk -n "CN=Vlada Klaus;E=http://www.vladimirklaus.cz" vkCert.cer
%CS% vkCert.cer vkCert.spc
%PP% -pvk vkCert.pvk -spc vkCert.spc -pfx vkCert.pfx
pause
Vlastní podepsání aplikace pak může proběhnout třeba takto:
@echo off
rem hlavní složka s nástroji
set ToolsRoot="c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Microsoft Azure Data Lake Tools for Visual Studio 2015\2.1.0000.0\CppSDK\SDK\bin\"
rem nástroje
set ST=%ToolsRoot%signtool.exe
set App="d:\Projekty\AUDREYsoftware\GlyphManager2017\Pas\GlyphManager.exe"
echo ---Podepisovani---
%ST% sign /f vkCert.pfx /v %App%
echo.
echo ---Kontrola---
%ST% verify /pa /v %App%
echo.
pause
Stále ale musíte mít na paměti, že jste si certifikát vystavili sami, takže nejde o žádný důvěryhodný podpis. Ovšem pořád lepší, než když aplikace podepsána není vůbec. Navíc principy zde popsané jsou obecné a platné stále, takže poté, co si pořídíte opravdový důvěryhodný certifikát, bude pro vás jeho použití hračkou.
Celá problematika, jednotlivé nástroje, informace okolo bezpečnosti či prolomení SHA1 certifikátů je mnohem širší, proto doporučuji vše nastudovat do větší hloubky. Ale snad tento článek poslouží alespoň jako startovní bod.
Zdroje:
- http://www.pepak.net/programovani/authenticode-jak-podepisovat-programy/
- https://blogs.msdn.microsoft.com/vsnetsetup/2016/03/25/signtool-error-the-signers-certificate-is-not-valid-for-signing/
- https://msdn.microsoft.com/en-us/library/8s9b9yaz(v=vs.110).aspx
- https://msdn.microsoft.com/library/windows/desktop/aa386968.aspx
- https://knowledge.symantec.com/kb/index?page=content&id=SO13755&actp=search&viewlocale=en_US&searchid=1264523460902