Swój klucz YubiKey 4 zakupiłem ponad rok temu.
Do tej pory wykorzystywałem tylko dwa tryby pracy:
- uwierzytelnianie wielopoziomowe 2FA,
- hasło statyczne (Static Password).
Chciałbym jednak używać klucza do czegoś więcej, czyli do:
- podpisywania mojego kodu (Code Signing),
- logowania na serwer VPS.
Dopiero teraz zebrałem się w sobie, przyswoiłem odpowiednią wiedzę w tym zakresie i postanowiłem się nią podzielić.
Artykuł podzielę na dwie części:
- pierwsza, wspólna, dotyczyć będzie konfiguracji klucza;
- następne dotyczyć będą właściwego wykorzystania.
Zaczynamy!
Sterowniki
Po podłączeniu naszego klucza, system Windows powinien automatycznie wykryć nasze urządzenie.
W naszym wypadku wystarczające będzie poprawne wykrycie karty inteligentnej PIV (Personal Identity Verification).
Jeśli wystąpią jakieś problemy, prawdopodobnie wystarczy zainstalować sterowniki (YubiKey Smart Card Minidriver) ze strony producenta:
https://www.yubico.com/products/services-software/download/smart-card-drivers-tools/
Oprogramowanie
Posłużymy się programem YubiKey PIV Manager:
https://developers.yubico.com/yubikey-piv-manager/
Trzeba jednak tutaj zaznaczyć, że producent wycofuje się z tego narzędzia:
This project is no longer under active development. The current focus for PIV related development is on YubiKey Manager (GUI, CLI).
i rekomenduje użycie YubiKey Manager i CLI (Command Line Interface).
Do podpisywania naszego kodu będziemy potrzebowali także narzędzia SignTool, który jest częścią większego pakietu:
https://www.microsoft.com/en-us/download/details.aspx?id=8279
Jeśli posiadasz zainstalowane środowisko Microsoft Visual Studio, narzędzie te powinieneś już posiadać.
Opcjonalnie, polecam nakładkę graficzną SignGUI na SignTool:
https://www.briggsoft.com/signgui.htm
ale nie będziemy jej używać, gdyż wymaga pliku PKCS #12 (.pfx), a my będziemy podpisywać kod kluczem zapisanym na karcie.
Tworzenie certyfikatu
Pierwsze uruchomienie programu wymusza na nas nadanie kodu PIN. Dla testów ustawiłem domyślny, 123456.
Jak widać, nie mamy żadnych certyfikatów. Klikamy przycisk Certificates, a następnie zakładkę Digital Signature:
Czeka nas wybór. Importujemy gotowy certyfikat czy tworzymy nowy? Ja już posiadam certyfikat, którym podpisywałem kod.
Do jego wygenerowania użyłem prawdopodobnie (było to dość dawno) SelfCert:
Import istniejącego certyfikatu
Klikamy Import from file… i wybieramy plik .pfx. Jeśli zostaniemy zapytani o hasło, podajemy je.
Po potwierdzeniu hasła zostałem niemile zaskoczony…
Mój bieżący certyfikat jest za mocny 🙁 OK, będzie to okazja do przetestowania drugiej opcji.
Tworzenie nowego certyfikatu
Klikamy Generate new key… a następnie wypełniamy pola:
- RSA (2048 bits) – pozostawiamy domyślną opcję,
- CN (Common Name) – podałem swoje personalia, domyślnie byłą nazwa użytkownika systemu,
- Expiration date – zostawiłem domyślną datę wygaśnięcia.
Po zatwierdzeniu zostaniemy poproszeni o potwierdzenie kodem PIN:
i gotowe:
Co to są sloty i co oznacza 9c? W kluczu możemy użyć 4 sloty, każdy ma swoje przeznaczenie (zdefiniowane przez NIST: National Institute of Standards and Technology).
- 9a — PIV Authentication
- 9c — Digital Signature
- 9d — Key Management
- 9e — Card Authentication
Sloty są reprezentowane przez zakładki w programie YubiKey PIV Manager.
Co dalej? Eksportujemy nasz certyfikat przez przycisk Export certificate… Swój zapisałem do pliku CodeSigning.crt.
Aby zainstalować wyeksportowany certyfikat w systemie, klikamy na niego dwukrotnie i wybieramy opcję Zainstaluj certyfikat…
Możemy też to zrobić poprzez opcję Zainstaluj certyfikat z menu kontekstowego.
Lepszą lokalizacją do przechowywania certyfikatów będzie Komputer lokalny, jednak ja jestem jedynym użytkownikiem mojego komputera.
Zapamiętaj odcisk palca swojego certyfikatu, będzie on nam później potrzebny:
Zainstalowany certyfikat znajdziesz w Menedżerze certyfikatów (certmgr.exe):
Podpisywanie kodu
Czas przejść do podpisywania kodu, w końcu!
Wyjmujemy i ponownie podłączamy nasz klucz. Bez tej czynności miałem na początku problemy z podpisywaniem kodu.
Otwieramy PoweShell jako Administrator (dla pewności) i wywołujemy komendy:
PS C:\WINDOWS\system32> cd "c:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\" PS C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool> .\signtool sign /debug /sha1 42a2c0bbd721f96d7e21f402b4c957880dc35dac /t http://timestamp.digicert.com c:\Temp\YubiKey\App.exe
Oczywiście podajesz swój odcisk palca i ścieżki. Następnie zostaniemy poproszeni o kod PIN:
Cały log z konsoli:
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. PS C:\WINDOWS\system32> cd "c:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\" PS C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool> .\signtool sign /debug /sha1 42a2c0bbd721f96d7e21f402b4c957880dc35dac /t http://timestamp.digicert.com c:\Temp\YubiKey\App.exe The following certificates were considered: Issued to: 895d8f9e1a701537 Issued by: Token Signing Public Key Expires: Sat Jun 30 00:46:32 2018 SHA1 hash: BA75DCD09351F74CFAA05A029565FFABF42700AF Issued to: Mariusz Kacki Issued by: Mariusz Kacki Expires: Wed Oct 16 11:00:38 2019 SHA1 hash: 42A2C0BBD721F96D7E21F402B4C957880DC35DAC After EKU filter, 1 certs were left. After expiry filter, 1 certs were left. After Hash filter, 1 certs were left. After Private Key filter, 1 certs were left. The following certificate was selected: Issued to: Mariusz Kacki Issued by: Mariusz Kacki Expires: Wed Oct 16 11:00:38 2019 SHA1 hash: 42A2C0BBD721F96D7E21F402B4C957880DC35DAC Done Adding Additional Store Successfully signed: c:\Temp\YubiKey\App.exe Number of files successfully Signed: 1 Number of warnings: 0 Number of errors: 0 PS C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool>
Opcja /debug, której użyłem, pozwoli na analizę ewentualnych błędów.
Sprawdźmy, czy nasza przykładowa aplikacja (App.exe) została poprawnie podpisana:
Weryfikacja certyfikatu
Podpisywanie kodu działa, lecz nasz certyfikat jest niezaufany:
Ten certyfikat główny urzędu certyfikacji nie jest zaufany, ponieważ nie ma go w magazynie zaufanych głównych urzędów certyfikacji.
Nasi ewentualni klienci (odbiorcy programów) musieliby dodać Twój certyfikat do zaufanych (Trusted Root CA).
Przenieśmy zatem dla testu nasz certyfikat przez Menedżer certyfikatów zwykłą metodą wytnij i wklej lub po prostu przeciągając muszką certyfikat:
Ujrzymy komunikat ostrzegawczy:
Potwierdzamy chęć przeniesienia certyfikatu i ponownie sprawdzamy podpis aplikacji:
Podpis cyfrowy jest w porządku.
Udało się 😉 Jednak taki sposób powinniśmy wykorzystywać tylko do testów wewnętrznych, lub w zaufanej grupie.
Jak mówi komunikat, nie ma pewności, że my to my, dlatego powinniśmy utworzyć żądanie certyfikatu CSR (Certificate Signing Request) i wysłać do wybranego zaufanego urzędu certyfikacji, który potwierdzi naszą tożsamość, za odpowiednią kwotę oczywiście 😉
Artykuł pisałem także po nocach (3:00), także jeśli znajdziesz jakieś błędy, masz jakieś sugestie, to zapraszam do dyskusji.
Chciałbym w pełni wykorzystać posiadane narzędzie, jednak podpisywanie za pomocą certyfikatu PFX wydaję się prostszy i bardziej zautomatyzowany.