Windows enterprise developers have two paths for GitHub authentication: SSH keys or HTTPS with Personal Access Tokens. SSH wins on security, but the setup catches people out, particularly when juggling personal and work accounts.
The Single Account Case
For one GitHub account, the process is straightforward. Generate an RSA key via ssh-keygen in PowerShell or Git Bash, add it to ssh-agent, upload the public key to GitHub. OpenSSH ships with Windows 10 and 11, eliminating the PuTTY era. Most enterprise fleets run this natively now.
Test with ssh -T git@github.com. Clone repos using git@github.com:username/repo.git instead of HTTPS. The workflow becomes: generate key, add to agent, upload to GitHub, clone. Done.
Multi-Account Complexity
The real friction appears with multiple accounts. Personal and work GitHub accounts on the same machine require separate SSH keys and a config file at ~/.ssh/config with host aliases. Example:
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_work
Clone work repos using git@github.com-work:org/repo.git. The alias tells SSH which key to use. Inside each repo directory, override Git identity with git config user.email work@example.com to keep commit attribution clean.
Common failures: CRLF line endings in config files (use LF), wrong file names (config.txt instead of config), ssh-agent not running on terminal startup. Git Bash users need ~/.bash_profile to auto-load keys after restart.
The Alternative View
Some teams skip SSH entirely, using HTTPS with PATs. Simpler for single accounts, avoids key rotation headaches, works identically across Windows/Mac/Linux. The trade-off: PATs expire, require secure storage, and lack the "set once, forget" nature of SSH.
For APAC enterprises managing hybrid development teams, SSH remains standard for secure Git workflows. ED25519 keys provide better security than RSA. GitHub hosts 420M+ repositories; getting authentication right at scale matters.
The pattern is clear: single account SSH takes 10 minutes. Multi-account setups take longer but solve real workflow problems. The config file is doing the heavy lifting. Get that right, everything else follows.