can I share my SSH keys between WSL and Windows?
I'm trying to move from using Powershell to Bash on Windows (Windows Subsystem for Linux or WSL). For the purpose of using GIT, I've set up my SSH keys in C:/Users/User/.ssh
. I then logged into Bash, and created a symlink ln -s /mnt/c/Users/User/.ssh/ ~/.ssh/
in order to (in theory) use the same ssh keys from both shells.
When running git, however, I always get an error: Bad owner or permissions on /home/user/.ssh/config
. What am I doing wrong?
What am I doing wrong?
SSH requires sane permissions on the private keys and you are not able to achieve that while symlinking to different filesystem (windows). The manual page for ssh
explains that quite clearly:
~/.ssh/id_rsa
Contains the private key for authentication. These files contain sensitive data and should be readable by the user but not accessible by others (read/write/execute). ssh will simply ignore a private key file if it is accessible by others.
You can most probably copy the private keys and set appropriate permissions, if you want to "share the keys".
You need to mount your windows filesystem using the DrvFS
file system with the metadata
option which allows Linux permissions to coexist with Windows files by storing them in file metadata.
sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata
This will allow you to use your SSH Keys across both Operating Systems.
Further reading: https://blogs.msdn.microsoft.com/commandline/2018/01/12/chmod-chown-wsl-improvements/
And yet more reading on how to configure WSL
to apply this setting everytime it starts:
https://blogs.msdn.microsoft.com/commandline/2018/02/07/automatically-configuring-wsl/
To build on @ChadT's helpful answer, here's what worked for me.
Open your distro, and create or modify the /etc/wsl.conf
file to include the automount
options below:
$ cat /etc/wsl.conf
[automount]
options = "metadata,umask=022,fmask=111"
These options ensure that files in the mounted system are given proper user and group ownership, and that they have sensible default permissions (as opposed to everything getting 777
).
Close the distro, wait about 10 seconds for the background subsystem to stop running, and reopen the distro.
Navigate to your mounted C: drive at /mnt/c/Users/<user>
, and set the proper permissions on the .ssh
directory and key files, as required by SSH:
$ cd /mnt/c/Users/<user>
$ chmod 700 .ssh
$ chmod 600 .ssh/id_rsa
$ chmod 644 .ssh/id_rsa.pub
Finally, navigate to your distro's home drive, backup or remove any existing .ssh
directory, and create a symlink back to your C: drive's .ssh
directory:
$ cd ~
$ mv .ssh .ssh_orig
$ ln -s /mnt/c/Users/plw1845/.ssh/ .ssh
You should now be able to fully share your Windows SSH config, hosts, and keys with your WSL distro, while maintaining them in a single place.