2021-05-28 10:53:31 -07:00
|
|
|
|
---
|
|
|
|
|
|
eleventyNavigation:
|
|
|
|
|
|
key: SSHKey
|
|
|
|
|
|
title: Adding an SSH key to your account
|
|
|
|
|
|
parent: Security
|
2021-11-21 03:10:17 -08:00
|
|
|
|
order: 20
|
2021-05-28 10:53:31 -07:00
|
|
|
|
---
|
|
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
It is recommended to use one key per client. This means that if you access your Codeberg repository from your home PC,
|
|
|
|
|
|
your laptop and your office PC you should generate separate keys for each machine.
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2022-07-30 16:19:06 -07:00
|
|
|
|
## Generating an SSH key pair
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2021-08-15 16:12:47 -07:00
|
|
|
|
1. Open Terminal on Linux/macOS, or Git Bash on Windows.
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2022-07-30 14:12:43 -07:00
|
|
|
|
2. Paste the text below:
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2024-06-11 00:51:22 -07:00
|
|
|
|
```shell
|
|
|
|
|
|
ssh-keygen -t ed25519 -a 100
|
|
|
|
|
|
```
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2024-06-11 00:51:22 -07:00
|
|
|
|
This will generate a new SSH key.
|
|
|
|
|
|
You can also add a comment to help you identify the client with `-C "comment here"`.
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2024-06-11 00:51:22 -07:00
|
|
|
|
```shell
|
|
|
|
|
|
> Generating public/private ed25519 key pair.
|
|
|
|
|
|
```
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
3. When you're prompted to "Enter a file in which to save the key", press <kbd>Enter</kbd>.
|
|
|
|
|
|
This accepts the default file location:
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2024-06-11 00:51:22 -07:00
|
|
|
|
```shell
|
|
|
|
|
|
> Enter file in which to save the key (/home/knut/.ssh/id_ed25519): [Press enter]
|
|
|
|
|
|
```
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2025-02-22 05:56:25 -08:00
|
|
|
|
If you see that `/home/knut/.ssh/id_ed25519 already exists`, follow these steps:
|
|
|
|
|
|
|
|
|
|
|
|
1. When prompted to overwrite the existing file, type <kbd>n</kbd> to choose not to overwrite.
|
|
|
|
|
|
|
|
|
|
|
|
2. Afterward, re-run the same command:
|
|
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
|
ssh-keygen -t ed25519 -a 100
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
3. This time, enter a new filepath when prompted (e.g., `~/.ssh/id_ed25519_codeberg`) to avoid overwriting the
|
|
|
|
|
|
existing key.
|
2025-02-22 05:56:25 -08:00
|
|
|
|
|
2022-07-30 14:12:43 -07:00
|
|
|
|
4. You will be asked for a passphrase; enter one if you'd like, or leave the prompt empty.
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
Your private key can be protected by a passphrase. This adds a layer of authentication that increases security.
|
|
|
|
|
|
Be aware that this will only be helpful for certain attack scenarios and does not offer 100% protection.
|
|
|
|
|
|
It is recommended to keep your private key safe and - well - private.
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2023-11-28 12:57:37 -08:00
|
|
|
|
### FIDO2 with OpenSSH
|
|
|
|
|
|
|
|
|
|
|
|
1. Connect your security key and open a terminal
|
|
|
|
|
|
|
|
|
|
|
|
2. Paste the text below
|
|
|
|
|
|
|
2024-06-11 00:51:22 -07:00
|
|
|
|
```shell
|
|
|
|
|
|
ssh-keygen -t ed25519-sk
|
|
|
|
|
|
```
|
2023-11-28 12:57:37 -08:00
|
|
|
|
|
|
|
|
|
|
3. If you have set one on your key, you'll be prompted for your FIDO2 PIN. Enter it to continue
|
|
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
4. When you're prompted to "Enter a file in which to save the key", press <kbd>Enter</kbd>.
|
|
|
|
|
|
This accepts the default file location.
|
2023-11-28 12:57:37 -08:00
|
|
|
|
|
|
|
|
|
|
5. You will be asked for a passphrase; enter one if you'd like, or leave the prompt empty.
|
|
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
Keep in mind that now, every time you wish to use Codeberg over SSH, you must have your security key plugged in and will
|
|
|
|
|
|
be prompted to touch it to continue.
|
2023-11-28 12:57:37 -08:00
|
|
|
|
|
2021-05-28 10:53:31 -07:00
|
|
|
|
## Add the SSH key to Codeberg
|
2022-07-30 14:12:43 -07:00
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
1. Copy the SSH key to your clipboard. You must only copy the public key not the private one. You can identify it by the
|
|
|
|
|
|
`.pub` suffix. By default, you can find the public key in `$HOME/.ssh/id_ed25519.pub`.
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2024-06-11 00:51:22 -07:00
|
|
|
|
On Linux you can use `xclip` on the command line. You may need to install it from your package manager.
|
|
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
|
$ xclip -selection clipboard < ~/.ssh/id_ed25519.pub
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
On Windows you can use `clip`.
|
|
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
|
$ clip < ~/.ssh/id_ed25519.pub
|
|
|
|
|
|
```
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2024-06-11 00:51:22 -07:00
|
|
|
|
On macOS you can use `pbcopy`.
|
2021-08-15 16:12:47 -07:00
|
|
|
|
|
2024-06-11 00:51:22 -07:00
|
|
|
|
```shell
|
|
|
|
|
|
$ pbcopy < ~/.ssh/id_ed25519.pub
|
|
|
|
|
|
```
|
2022-07-30 14:12:43 -07:00
|
|
|
|
|
2024-06-11 00:51:22 -07:00
|
|
|
|
These commands will copy the contents of id_ed25519.pub (your SSH public key) to your clipboard.
|
2021-08-15 16:12:47 -07:00
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
> Alternatively you can locate the hidden .ssh folder, open the file in your favorite text editor, and copy it to
|
|
|
|
|
|
> your clipboard.
|
2021-08-15 16:12:47 -07:00
|
|
|
|
|
2021-05-28 10:53:31 -07:00
|
|
|
|
2. Navigate to your user settings
|
2024-11-28 22:12:05 -08:00
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
<img src="/images/security/user-settings.png" alt="User Settings">
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2024-06-11 00:51:22 -07:00
|
|
|
|
3. Go to the section **SSH / GPG Keys** and click on **Add key**.
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
<img src="/images/security/ssh-key/add-ssh-key.png" alt="SSH Key Settings">
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
|
|
|
|
|
4. Give an appropriate name for the key.
|
2024-06-11 00:51:22 -07:00
|
|
|
|
5. Paste your key string into **Content** field.
|
|
|
|
|
|
6. Click the **Add key** button.
|
2021-08-15 16:12:47 -07:00
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
> You can always access your SSH public keys from `https://codeberg.org/username.keys`, substituting in your Codeberg
|
|
|
|
|
|
> username.
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
|
|
|
|
|
## Test the SSH connection
|
2022-07-30 14:12:43 -07:00
|
|
|
|
|
2025-02-22 05:56:25 -08:00
|
|
|
|
If you are using a custom path, add an entry in your `$HOME/.ssh/config` file:
|
|
|
|
|
|
|
|
|
|
|
|
```config
|
|
|
|
|
|
Host codeberg.org
|
|
|
|
|
|
HostName codeberg.org
|
|
|
|
|
|
User git
|
|
|
|
|
|
IdentityFile ~/.ssh/id_ed25519_codeberg
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2021-05-28 10:53:31 -07:00
|
|
|
|
Do this simple test:
|
|
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
|
$ ssh -T git@codeberg.org
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
The output should look like this:
|
|
|
|
|
|
|
2021-08-15 16:12:47 -07:00
|
|
|
|
```text
|
2023-05-30 02:07:14 -07:00
|
|
|
|
Hi there, ____! You've successfully authenticated with the key named ____, but Forgejo does not provide shell access.
|
|
|
|
|
|
If this is unexpected, please log in with password and setup Forgejo under another user.
|
2021-05-28 10:53:31 -07:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
_Note: All Codeberg users share a single Unix user named `git` which is used to check out repositories._
|
|
|
|
|
|
_Depending on the key provided, permission is granted or denied._
|
|
|
|
|
|
_You can check out all repositories with your key which you have permission for._
|
|
|
|
|
|
_You can push code to all repositories where you have write access._
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
2022-03-04 13:17:26 -08:00
|
|
|
|
## Verifying your SSH Key
|
2022-07-30 14:12:43 -07:00
|
|
|
|
|
|
|
|
|
|
Anyone can add a random SSH key; but fortunately, Codeberg provides a mechanism to verify that the key belongs to you.
|
2025-06-14 02:38:21 -07:00
|
|
|
|
Every keypair consists of a public and a private key that are connected to one another.
|
|
|
|
|
|
Using this private key, you can sign the provided message. If the signed message is valid, Codeberg can confirm that the
|
|
|
|
|
|
added key is yours.
|
2022-03-04 13:17:26 -08:00
|
|
|
|
|
|
|
|
|
|
1. Go to the [SSH/GPG Keys tab](https://codeberg.org/user/settings/keys) in your Codeberg settings.
|
2024-06-11 00:51:22 -07:00
|
|
|
|
2. Click on the **Verify** button next to the SSH key you would like to verify.
|
2025-06-14 02:38:21 -07:00
|
|
|
|
3. Codeberg will show a token. Under its text box copy the command, and replace `/path_to_your_private_key` with the
|
|
|
|
|
|
correct path of your private key.
|
2022-07-30 14:12:43 -07:00
|
|
|
|
4. Copy the output, beginning with `-----BEGIN SSH SIGNATURE-----` and ending with `-----END SSH SIGNATURE-----`.
|
2024-06-11 00:51:22 -07:00
|
|
|
|
5. Paste it into the large textbox and click the **Verify** button.
|
2022-03-04 13:17:26 -08:00
|
|
|
|
|
2024-05-16 06:55:48 -07:00
|
|
|
|
## Telling Git about your SSH key
|
|
|
|
|
|
|
|
|
|
|
|
SSH can also be used to sign commits as an alternative for GPG. You can read more about GPG commit signing [here](/security/gpg-key).
|
|
|
|
|
|
|
|
|
|
|
|
{% admonition "note" %}
|
|
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
SSH commit signing is available in Git 2.34 or later.
|
|
|
|
|
|
To update your version of Git,see the [Git](https://git-scm.com/downloads) website.
|
2024-05-16 06:55:48 -07:00
|
|
|
|
|
|
|
|
|
|
{% endadmonition %}
|
|
|
|
|
|
|
|
|
|
|
|
1. Open your terminal.
|
|
|
|
|
|
2. Type `git config --global gpg.format ssh`.
|
2025-06-14 02:38:21 -07:00
|
|
|
|
3. Type `git config --global user.signingKey <PATH TO PUBLIC SSH KEY>`, substituting `<PATH TO PUBLIC SSH KEY>` with the
|
|
|
|
|
|
path to the public key you'd like to use, for example _~/.ssh/id_ed25519.pub_.
|
2024-05-16 06:55:48 -07:00
|
|
|
|
4. Type `git config --global commit.gpgSign true`.
|
|
|
|
|
|
|
2021-05-28 10:53:31 -07:00
|
|
|
|
## Avoid re-typing the passphrase
|
|
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
Assuming you've created a secure key with a passphrase, SSH will prompt you for your passphrase for every connection.
|
|
|
|
|
|
Common desktop environments like macOS or GNOME will offer you to cache your passphrase via an SSH agent.
|
2021-05-28 10:53:31 -07:00
|
|
|
|
|
|
|
|
|
|
If you are working at the command line, you can alternatively do this directly:
|
|
|
|
|
|
|
|
|
|
|
|
```shell
|
2021-05-29 03:36:34 -07:00
|
|
|
|
$ eval $(ssh-agent)
|
2022-07-30 14:12:43 -07:00
|
|
|
|
$ ssh-add # enter your passphrase once, then it is cached.
|
2021-05-28 10:53:31 -07:00
|
|
|
|
```
|
2021-08-15 16:12:47 -07:00
|
|
|
|
|
2022-11-04 14:26:36 -07:00
|
|
|
|
## Changing your repository's transport from HTTPS to SSH
|
2022-10-23 17:19:30 -07:00
|
|
|
|
|
|
|
|
|
|
1. Go to the directory where your repository is located:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
cd /path/to/repository
|
|
|
|
|
|
```
|
2024-06-11 00:51:22 -07:00
|
|
|
|
|
2022-10-23 17:19:30 -07:00
|
|
|
|
2. Look at the existing remotes with `git remote` :
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
git remote -v
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
It will look similar to this:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
origin https://codeberg.org/knut/foobar.git (fetch)
|
|
|
|
|
|
origin https://codeberg.org/knut/foobar.git (push)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
You might be using a different name than `origin` for your repository. If you do, remember to use that different name in the following steps.
|
2024-06-11 00:51:22 -07:00
|
|
|
|
|
2022-10-23 17:19:30 -07:00
|
|
|
|
3. Run `git remote set-url` command followed by the remote name and the remote’s URL:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
git remote set-url <remote-name> <remote-url>
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
For example, to change the URL of `origin` to `git@codeberg.org:knut/foobar.git` you would type:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
git remote set-url origin git@codeberg.org:knut/foobar.git
|
|
|
|
|
|
```
|
2022-10-23 18:07:32 -07:00
|
|
|
|
|
2022-11-04 14:34:40 -07:00
|
|
|
|
Your HTTPS URL used this format: `https://codeberg.org/<user>/<repo>.git`
|
2025-06-14 02:38:21 -07:00
|
|
|
|
The SSH URL uses this format: `git@codeberg.org:<user>/<repo>.git` (optionally with `ssh://` at the beginning like
|
|
|
|
|
|
this: `ssh://git@codeberg.org:<user>/<repo>.git`).
|
2022-11-04 14:34:40 -07:00
|
|
|
|
|
2025-06-14 02:38:21 -07:00
|
|
|
|
Alternatively, you can find the SSH URL by going to your repository page on Codeberg
|
|
|
|
|
|
(for example, going to `https://codeberg.org/knut/foobar`), clicking on SSH in the top right corner and copying the URL.
|
2022-10-23 18:07:32 -07:00
|
|
|
|
|
2022-10-23 17:19:30 -07:00
|
|
|
|
4. Verify that your change was successful:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
git remote -v
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
The output should look like this:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
origin ssh://git@codeberg.org:knut/foobar.git (fetch)
|
|
|
|
|
|
origin ssh://git@codeberg.org:knut/foobar.git (push)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2021-08-15 16:12:47 -07:00
|
|
|
|
> **Attribution**
|
|
|
|
|
|
> This guide is derived from [GitHub Docs](https://docs.github.com), used under CC-BY 4.0.
|