Skip to main content

YubiKey od Yubico – z czym to się je?

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:

https://www.pluralsight.com/blog/software-development/selfcert-create-a-self-signed-certificate-interactively-gui-or-programmatically-in-net

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

  1. 9a — PIV Authentication
  2. 9c — Digital Signature
  3. 9d — Key Management
  4. 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.

markac

Full-stack Web Developer

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.