DN42的GPG和SSH秘钥对生成与部署

使用 GPG/PGP 密钥进行身份验证

Github官方就有一份关于生成新 GPG 密钥,下面我也会将详细步骤罗列出来。

GPG密钥对生成

1.首先安装gnupg,这是gpg命令行工具。

  • yum install gnupg -y
    • 当然有可能会有以下提示,那就代表系统已经自带安装好gpg命令行工具了。
      软件包 gnupg2-2.0.22-5.el7_5.x86_64 已安装并且是最新版本 无须任何处理

2.生成 GPG 密钥对。 由于 GPG 有多个版本因此有几
种不同的生成方式。

  • 如果使用的是2.1.17或更高版本,请使用以下命令生成密钥对。
    • gpg --full-generate-key
  • 如果使用的不是版本 2.1.17 或更高版本,gpg --full-generate-key 命令不起作用,请使用以下命令生成。
    • gpg --default-new-key-algo rsa4096 --gen-key
  • 如果在某些系统环境中,例如我在Centos7的时候,上述两条命令都不可用,就使用我以下方法生成秘钥对。
    • gpg --gen-key

3.在提示时,指定要生成的密钥类型,或按 Enter 键接受默认值。

4.在提示时,指定要生成的密钥大小,可输入4096或按 Enter 键接受默认值。

5.输入密钥的有效时长。 如果直接按 Enter 键将默认指定该密钥不会过期。 除非你需要过期日期,否则我们建议接受此默认值。

6.按照提示输入名字、邮箱。

7.验证您的选择是否正确,如果正确请输入一个O然后回车。

8.需要创建一个密码来保护私钥,输入两次相同密码后即可。

以下是我的完整创建过程,仅供参考,请勿复制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[root@sea-node-jvav ~]# gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥种类:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
您的选择? 1
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)4096
您所要求的密钥尺寸是 4096 位
请设定这把密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)
密钥永远不会过期
以上正确吗?(y/n)y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

真实姓名:jiajie.lei
电子邮件地址:leijiajie.ljj@qq.com
注释:
您选定了这个用户标识:
“jiajie.lei <leijiajie.ljj@qq.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?O
您需要一个密码来保护您的私钥。

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
agpg: 密钥 8D0***98 被标记为绝对信任
公钥和私钥已经生成并经签名。
添加秘钥对到DN42的Gitea

1.输入命令输出GPG密钥长ID,例如我的长ID是D20A584D8D024498

1
2
3
4
5
6
[root@sea-node-jvav ~]# gpg --list-secret-keys --keyid-format=long
/root/.gnupg/secring.gpg
------------------------
sec 4096R/D20A584D8D024498 2023-08-02
uid jiajie.lei <leijiajie.ljj@qq.com>
ssb 4096R/E4D68679C8A0C5D8 2023-08-02

2.获取GPG秘钥,输入以下命令,注意:结尾的D20A584D8D024498需要替换成自己实际生成的长ID

  • gpg --armor --export D20A584D8D024498

3.复制以 —–BEGIN PGP PUBLIC KEY BLOCK—– 开头并以 —–END PGP PUBLIC KEY BLOCK—– 结尾的 GPG 密钥。

4.打开https://git.dn42.dev/user/settings/keys,在管理GPG秘钥中添加秘钥,粘贴上面复制的整段GPG秘钥到秘钥内容输入框,然后点击增加秘钥。

5.在新增加的秘钥右侧点击验证按钮,这时候网页会自动生成一条echo开头 –detach-sig结尾的命令,复制整条命令到生成密钥的机器上执行。

  • 执行之后,正常会让你输入生成秘钥时候的创建的密码然后就可以了,但也有可能没有输入密码的提示直接出现下面情况

    1
    2
    3
    4
    5
    6
    7
    8
    [root@sea-node-jvav ~]# echo "100cf527eb8aa473340f2697a75d6f8a4fef38efb9fecb458e4ef58b45e36ec4" | gpg -a --default-key D20A584D8D024498 --detach-sig

    您需要输入密码,才能解开这个用户的私钥:“jiajie.lei <leijiajie.ljj@qq.com>”
    4096 位的 RSA 密钥,钥匙号 8D024498,建立于 2023-08-02

    gpg: 用户取消
    gpg: no default secret key: 操作已取消
    gpg: signing failed: 操作已取消
  • 我的解决办法是,直接执行gpg --detach-sign,这时候会让你输入密码,输入之后可能会一直卡着没有下一步,等待1分钟左右按ctrl+c之后再按照第5步即可输出验证秘钥,如果还是卡主可以继续尝试这一步操作,并等待时间久一点再ctrl+c退出。

6.将输出的签名复制到网页的GPG增强签名输入框中并点击验证。

7.显示GPG 密钥 D20A584D8D024498 已被验证,添加gpg秘钥到DN42的Gitea已完成。

输出密钥指纹
  1. 输入命令,输出密钥指纹。

    • gpg --list-secret-keys --keyid-format=long --fingerprint
      1
      2
      3
      4
      5
      6
      7
      [root@sea-node-jvav ~]# gpg --list-secret-keys --keyid-format=long --fingerprint
      /root/.gnupg/secring.gpg
      ------------------------
      sec 4096R/D20A584D8D024498 2023-08-02
      密钥指纹 = 59DF 8CEB ACDD 920D FC3E E3CE D20A 584D 8D02 4498
      uid jiajie.lei <leijiajie.ljj@qq.com>
      ssb 4096R/E4D68679C8A0C5D8 2023-08-02
  2. 将密钥指纹上传到公共查询服务器

    • gpg --keyserver hkp://keyserver.ubuntu.com --send-key [密钥指纹]
  3. 然后将密钥指纹填写到刚刚新建的MNT文件的 auth 项中,格式如 pgp-fingerprint [密钥指纹]

使用SSH秘钥进行身份认证

1.使用SSH秘钥认证要比上面的GPG简单得多,我们只需要在Linux或者Mac OS下直接运行ssh-keygen -t ed25519即可,当然你也可以使用rsa的秘钥。
2. 提示Enter file in which to save the key (/root/.ssh/id_ed25519):,正常选择默认位置存放秘钥,直接回车即可。
3. 提示Enter passphrase (empty for no passphrase): ,自行创建密码,输入两次相同即可。

复制SSH秘钥到DN42的Gitea认证
  1. 找到秘钥打开并复制,打开ed25519或rsa .pub结尾的文件,按照你创建的类型选择打开
    • 如果在创建时候没有自定义位置的话,默认存放在/root/.ssh/
      1
      2
      3
      [root@gzten-node-jvav ~]# cd /root/.ssh/
      [root@gzten-node-jvav .ssh]# ls
      authorized_keys id_ed25519 id_ed25519.pub id_rsa id_rsa.pub known_hosts
  2. 复制ssh-ed25519或ssh-rsa开头的一整段秘钥,到https://git.dn42.dev/user/settings/keys,管理SSH秘钥->增加秘钥->秘钥内容输入框。
  3. 在新增加的秘钥右侧点击验证按钮,这时候网页会自动生成一条echo开头 /path_to_your_privkey结尾的命令,复制整条命令到你生成秘钥的机器上。
  4. 将/path_to_your_privkey修改为自己机器放秘钥的地方,例如我的就在/root/.ssh/id_ed25519.pub,然后回车执行。
  • 有可能会出现unknown option -- Y错误,这可能是ssh-keygen版本太低导致的,执行ssh -V查看版本,如果输出低于OpenSSH_9.0p1, OpenSSL 1.0.2k-fips 26 Jan 2017,就无法使用该功能需要升级版本,
    可参考文章centos7.9离线升级ssh9.0,或者自行搜索ssh升级9.0。
  1. 执行之后需要输入密码,之后会输出一个签名,将—–BEGIN SSH SIGNATURE—– —–END SSH SIGNATURE—–结尾的整一段签名复制到验证框中,点击验证。
  2. 显示 SSH 密钥 'SHA256:L0usFG1ba6YaUvAVUEKirSCFzkUpSS4FPJsI1r71Ciw' 已被验证。,证明秘钥添加完成。
添加SSH秘钥到文件
  1. 打开/root/.ssh目录下生成的.pub结尾的公钥,然后将整段秘钥填写到刚刚新建的MNT文件的 auth 项中,格式如 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFxVANr+Srl3UtSy/ArUEV/ZveLH0kSaOkGV0FGC4aby leijiajie.ljj@qq.com

完成上述步骤后,您可以继续进行DN42注册部署流程。传送门


DN42的GPG和SSH秘钥对生成与部署
https://www.ljjserver.cn/2023/08/02/DN42的GPG和SSH秘钥对生成与部署/
作者
樱落散华
发布于
2023年8月2日
许可协议