Zavolat Další kontakty >
E-mail Kontakty

Aktuálně: Hledáme Python vývojáře pro projekt PPC Robot. Pomáháme organizovat a podporujeme WordCamp Praha 2019.

Vytvoření a použití SSH klíče pro Git ve Windows

Pro svou přednášku “Git a týmová spolupráce„, kterou povedu 10. 10. 2018 v rámci bloku přednášek pro studenty před Plzeňskou soutěží Web Sprint (link), jsem hledal vhodný návod na vygenerování SSH klíče ve Windows. Návodů jsem sice našel hned několik, ale žádný takový, který bych si představoval. Proto vznikl tento článek, který i začátečníky provede nastavením, které prostě funguje.

Například návod na GitHubu popisuje vygenerování pomocí příkazové řádky (Git Bash), které může být pro některé uživatele složité. Klíč pak nebude možné použít v nástrojích, které předpokládají použití klíčů z PuTTY (takovým je například klient SourceTree od Atlassianu).

Další návody popisují pouze vytvoření klíče v PuTTYgen a použití Pageant, takže s takovým klíčem zase nebude umět pracovat celá řada dalších nástrojů příkazové řádky, ani nástroje, které je používají (např. IDE od JetBrains). Článek od Tomáše Fejfara zase mění, jakým způsobem některé nástroje pracují. S tím jsem v minulosti často narazil na různé problémy.

Pojďme si tedy pohodlně vytvořit klíč a vše nastavit tak, aby fungoval všude. Pokud jste nováčci, možná předchozím odstavcům nebudete zcela rozumět. Co je to tedy ten SSH klíč? A proč se tak často mluví o agentech? Já přeci nespolupracoval!

SSH, klíče a agenti

SSH (Secure SHell) je protokol, pomocí kterého můžete vzdáleně spravovat servery, prvky v síti a další hardware. Jeho cílem je hlavně zprostředkovat vzdálený přístup k příkazové řádce (shellu), ale pomocí jeho komunikačních kanálů lze i přenášet soubory, připojovat se k síťovým službám na vzdáleném počítači a mnoho dalšího. Díky všestrannému použití a důrazu na bezpečný přenos dat jej autoři Gitu zvolili jako jednu z možností, jak přistupovat k repostářům na vzdálených strojích.

SSH podporuje celou řadu možností ověření uživatele. Pomineme-li ověřování jménem a heslem, tak nejpoužívanější možností je ověřování pomocí SSH klíče. SSH klíč má dvě části: soukromý klíč a veřejný klíč. Soukromému klíči vždy náleží právě jeden klíč veřejný.

Veřejný klíč dopředu nahrajeme na server, ke kterému se chceme přihlašovat. Má podobu jedné řádky, která vypadá nějak takto:

ssh-rsa AAAAB3NzaC1yc...S1zMNw== Vladimir Smitka

První je typ klíče (je možné použít několik algoritmů, každý má vlastní typ klíče), poté následuje samotný klíč a na konci je volitelný komentář.

V případě Git repositářů hostovaných na GitHubu, GitLabu, Bitbucketu či podobné službě jej stačí vložit do formuláře na webu. Pokud zařizujeme přístup k linuxovému serveru, vložíme jej do souboru .ssh/authorized_keys.

Soukromý klíč střežíme jako oko v hlavě. Nikomu ani ničemu jej neposíláme a ideálně ho máme uložený pod heslem (= zašifrovaný), nebo na zašifrovaném disku. Při ověřování totožnosti nám vzdálený server pošle nějakou náhodou zprávu, kterou soukromým klíčem podepíšeme a podpis zašleme zpět. Vzdálený server použije předem nahraný veřejný klíč k verifikaci podpisu a ověří si tak, že k příslušnému veřejnému klíči máme přístup.

Celé to zní jako komplikovaná procedura, naštěstí však stačí jen příslušnému programu říct, ke má klíč hledat a on celou proceduru provede za nás. Pokud je soukromý klíč chráněný heslem, budeme jej muset samozřejmě zadat, a to při každém připojení.

Pokud se budeme připojovat často (což je v případě Gitu při každé operaci pull/push), můžeme si práci usnadnit použitím SSH agenta. Jde o aplikaci, kterou spustíme na svém počítači po přihlášení.

Agent nám umožňuje do něj načíst klíče, dešifruje je naším heslem a ostatní aplikace jej pak mohou použít k ověřování totožnosti: onu náhodnou zprávu předají agentovi, ten ji podepíše klíčem, který má načtený, a předá zpět. Celá procedura je tak pohodlnější a bezpečnější, protože soukromý klíč zůstane v agentovi.

Ve Windows můžeme použít dva formáty soukromých klíčů:

  • Klíče ve formátu pro OpenSSH – standard na Linuxu, FreeBSD, macOS a podobných systémech. SSH agent se spouští z příkazové řádky příkazem ssh-agent.
  • Klíče ve formátu pro PuTTY – specifické pro Windows, používají je grafické aplikace vycházející z PuTTY. Jako agent se používá grafická aplikace Pageant.

Ačkoliv oba formáty klíčů mohou obsahovat identické informace a lze je mezi sebou volně konvertovat, pro každý se používá jiná sada aplikací (jiný agent, jiný nástroj pro vygenerování klíče, ...) a klientské aplikace v naprosté většině případů umí pracovat jen s jedním typem klíče a komunikovat jen s jedním typem agenta.

To může způsobovat celou řadu problémů - klíč, který bez problémů funguje v příkazové řádce, neumí načíst grafický klient a pokus o připojení skončí chybou. A opačně, takže bychom museli většinou jeden klíč uložit v obou formátech a spouštět oba agenty.

Naštěstí to není potřeba a existuje poměrně snadný způsob, jak klíč načtený v jednom agentovi zpřístupnit pro obě sady aplikací. A navíc bez příkazové řádky!

Postup pro vytvoření SSH klíče a jeho zpřístupnění v celém systému

  1. Pokud ještě nemáte, nainstalujte si Git pro Windows.

  2. Pokud ještě nemáte, nainstalujte si PuTTY (použijte instalátor, který obsahuje i další nástroje - budeme je potřebovat)

    V průběhu instalace zaškrtněte volbu „Associate .PPK files with PuTTYgen and Pageant“ - tato volba umožní spustit agenta a načíst klíč pouhým otevřením souboru klíče.

  3. V Ovládacích panelech > Systém > vlevo Upřesnit nastavení systému > Proměnné prostředí (ve Windows 10 stačí v nabídce start začít psát „Upravit proměnné prostředí systému“) přidejte proměnnou prostředí SSH_AUTH_SOCK s hodnotou
    %USERPROFILE%\.ssh-pageant

    Proměnná udává cestu k souboru, který bude vytvořen pro komunikaci mezi aplikacemi a agentem. Soubor nesmí existovat. %USERPROFILE% bude nahrazeno za cestu k vašemu domovskému adresáři. Můžete použít libovolnou jinou složku, jen musíte mít oprávnění k zápisu. Tuto proměnnou bude potřebovat skript start-ssh-pageant.cmd, který je nastaven v dalším kroku.

  4. Do nabídky Start > Po spuštění přidejte zástupce na
    C:\Program Files\Git\cmd\start-ssh-pageant.cmd
    Cestu upravte podle toho, kam jste nainstalovali Git. Nejjednodušší způsob, jak najít složku Po spuštění, je zmáčknout Windows + R, do dialogového okna Spustit zadat
    shell:startup
    a potvrdit.

    Spuštění tohoto programu zajistí, že aplikace podporující pouze OpenSSH agenta budou moci komunikovat s agentem Pageant.

  5. Změny v proměnných prostředí se projeví až při příštím přihlášení. Proto se nyní odhlašte a zase přihlašte, nebo restartujte počítač.

  6. Spusťte PuTTYgen z nabídky Start a stiskněte tlačítko Generate. Pro vygenerování klíče hýbejte myší - program používá pohyb myši jako jeden ze zdrojů po generování náhodných čísel.

  7. Do Key passphrase a Confirm passphrase zadejte heslo, kterým bude soukromý klíč zašifrován. Bude nutné jej zadat při každém otevření klíče, proto si jej zapamatujte!

  8. Soukromý klíč uložte tlačítkem Save private key. Nástrojem PuTTYgen můžete později i klíč načíst a uložit s jiným heslem nebo v jiném formátu. Výsledný soubor bude mít příponu *.ppk.

  9. Veřejný klíč z textového okna „ key for pasting into OpenSSH authorized_keys file“ si zkopírujte a vložte jej do příslušné služby, ke které chcete tímto klíčem přistupovat. U GitHubu se klíče vkládají v Settings (v nabídce pod Vaším uživatelským obrázkem) > SSH and GPG Keys > New SSH Key. GitLab a Bitbucket mají také správu klíčů v nastavení účtu.

  10. Dvakrát poklikejte na soubor se soukromým klíčem. Spustí se nástroj Pageant a vyzve Vás k zadání hesla. Po jeho spuštění se objeví ikonka v systémové liště, která indikuje, že je Pageant spuštěný. Toto je jediný krok, který bude nutné provést po každém přihlášení.

Nyní je již vše připraveno a Váš SSH klíč bude fungovat jak z grafických programů, tak z příkazové řádky.

Tip:
Pokud používáte správce hesel KeePass, můžete do něj doinstalovat rozšíření KeeAgent. To nahrazuje Pageant a umožňuje klíče načítat z databáze KeePass. Klíč pak nemusí být chráněn heslem, protože je bezpečně uložený jako soubor v databázi hesel.

Komentáře (1)

Přidat komentář

napsáno 15. 10. 14:08
Díky za backlink a doplnění. Fintu s SSH_AUTH_SOCK jsem neznal. S tím by to mohlo pak běžet i ve standardním bashi (tj. ne tom git bashi).