前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用GPG密钥进行SSH身份验证

如何使用GPG密钥进行SSH身份验证

作者头像
evildickman
发布2018-09-04 11:16:26
8.6K1
发布2018-09-04 11:16:26

安装GPG:

关于Debian及其衍生品:

代码语言:txt
复制
sudo apt-get install gnupg2

在OS X上:

GPGTools为OS X提供了最简单的GPG实现。否则,js brew install gnupg2如果你有Homebrew,你可以运行。

在其他操作系统上,此过程应该相当清楚。GPG可能已经安装,但如果不安装,快速的互联网搜索应该会为您提供所需的说明。

打开命令提示符并执行:

代码语言:txt
复制
gpg2 --gen-key

当系统提示您选择所需的密钥类型时,请选择(1) RSA and RSA

当要求输入密钥时,请键入4096。如果您想将密钥存储在YubiKey Neo或某些智能卡上,则可能限制为2048位密钥大小,因此请确保您了解设备的限制(如果适用)。

选择您认为适合此密钥的有效期。在该日期之后,密钥将不再起作用,因此请谨慎选择。

输入您的全名,电子邮件地址和评论(如果需要)。选择O'好'。

在仔细查看特工后,输入一个长而安全的密码短语,用于加密本地存储中的密钥。在计算机生成密钥对的同时,将其写入您知道的物理安全的地方。

完成此操作后,您的输出应类似于以下内容:

代码语言:txt
复制
$ gpg2 --gen-key
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Sun Apr  9 18:27:05 2017 AEST
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: Your Name
Email address: you@yoursite.net
Comment: Test for GPG -> SSH
You selected this USER-ID:
    "Your Name (Test for GPG -> SSH) <you@yoursite.net>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy.
gpg: key 71735D23 marked as ultimately trusted
public and secret key created and signed.

pub   4096R/71735D23 2016-04-09 [expires: 2017-04-09]
      Key fingerprint = 4B63 8069 E016 F6E9 35BA  24B9 FFDD B2DF 7173 5D23
uid       [ultimate] Your Name (Test for GPG -> SSH) <you@yoursite.net>
sub   4096R/693C5635 2016-04-09 [expires: 2017-04-09]

此过程创建了一个主GPG密钥和一个用于加密消息和文件的子项。要使用SSH进行身份验证,我们需要生成第二个用于身份验证的子项。

生成身份验证子项

在命令提示符或终端中,键入:

代码语言:txt
复制
gpg2 --expert --edit-key key-id

替换key-id为密钥生成过程中的八个字符的字符串输出。这将在以开头的行中找到pub。在上面的示例中,ID为71735D23

在新gpg>提示符下,输入:

代码语言:txt
复制
addkey

出现提示时,输入您的密码。

当询问您想要的键类型时,请选择:(8) RSA (set your own capabilities)

输入S以关闭“签名”操作。

输入E以关闭“加密”操作。

输入A以切换“验证”操作。现在输出应该包含Current allowed actions: Authenticate,该行没有任何其他内容。

输入Q继续。

当要求输入密钥时,请选择4096。第一部分中的步骤4适用相同的限制,因此请确保您的卡/ YubiKey可以支持此密钥大小。

像以前一样输入到期日期。你可能应该保持与第一个相同。如果您选择较低的到期日期,您的主私钥将继续运行,但您的SSH身份验证将在此日期中断。

如果您确定输入的所有信息都是正确的,请yReally create? (y/N)提示符下输入以完成此过程。

创建密钥后,输入quit以退出gpg提示符,并y在提示符处保存更改。

您的终端现在应该如下所示:

代码语言:txt
复制
$ gpg2 --expert --edit-key 71735D23

Secret key is available.

pub  4096R/71735D23  created: 2016-04-09  expires: 2017-04-09  usage: SC
                 trust: ultimate      validity: ultimate
sub  4096R/693C5635  created: 2016-04-09  expires: 2017-04-09  usage: E
ultimate. (1). Your Name (Test for GPG -> SSH) you@yoursite.net

gpg> addkey
Key is protected.

You need a passphrase to unlock the secret key for
user: "Your Name (Test for GPG -> SSH) you@yoursite.net"
4096-bit RSA key, ID 71735D23, created 2016-04-09

Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
Your selection? 8

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished
   
Your selection? S

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Encrypt
   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished
   
Your selection? E

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions:
   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished
   
Your selection? A

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Authenticate

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished
   
Your selection? Q
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
     0 = key does not expire
  <n>  = key expires in n days
  <n>w = key expires in n weeks
  <n>m = key expires in n months
  <n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Sun Apr  9 18:49:58 2017 AEST
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy.

pub  4096R/71735D23  created: 2016-04-09  expires: 2017-04-09  usage: SC
                 trust: ultimate      validity: ultimate
sub  4096R/693C5635  created: 2016-04-09  expires: 2017-04-09  usage: E
sub  4096R/48B9C23C  created: 2016-04-09  expires: 2017-04-09  usage: A
ultimate. (1). Your Name (Test for GPG -> SSH) you@yoursite.net

gpg> quit
Save changes? (y/N) y

保护您的GPG密钥

警告 如果您无法备份或以其他方式保护密钥,则任何硬件故障都将导致您无法使用此密钥访问您的Linode。如果您通过SSH锁定密码访问权限,则需要使用Lish重新获得访问权限。

如果出现问题,您应该始终备份私钥,并最终锁定所有需要它的东西。如果您需要在新计算机上重新启动,此私钥以及本指南中的说明将足以让您的设置再次运行。

使用以下命令在~/.gnupg下备份文件夹,替换USB_DEVICE为设备名称:

代码语言:txt
复制
cp -r ~/.gnupg/ /Volumes/USB_DEVICE/

这假设您安装了一个存储设备/Volumes/USB\_DEVICE/。不同的操作系统可能对此路径使用不同的命名约定。您可以放心地忽略Operation not supported on socket输入此命令时出现的任何警告。

备份您的私钥,替换key-id为私钥的八个字符的密钥ID:

代码语言:txt
复制
gpg2 -a --export-secret-key key-id >> /Volumes/USB\_DEVICE/key-id.master.key

备份子项,替换key-id为每个子项的八个字符的密钥ID:

代码语言:txt
复制
gpg2 -a --export-secret-subkeys key-id >> /Volumes/USB\_DEVICE/<key id>.sub.key

如果发生了不好的事情而你丢失了密钥,你可以通过~/.gnupg用你的副本覆盖目录来重新导入它们,并使用:

代码语言:txt
复制
gpg2 --allow-secret-key-import --import key-file

请务必替换key-file每个文件的位置。

导出您的公钥

如果您正在使用VM或脱机计算机,则还需要导出您的公钥以便稍后重新导入:

代码语言:txt
复制
gpg2 -a --export key-id >> /Volumes/USB_DEVICE/key-id.public.key

请务必key-id使用您自己的密钥ID 替换。

您可以使用非常方便的gpg2 --import key-file命令重新导入它。

将您的密钥移动到智能卡或YubiKey(可选)

注意 如果您使用的是全新的YubiKey,则需要先启用OpenPGP卡/ CCID模式。这可以通过YubiKey个性化工具或运行来完成ykpersonalise -m82ykpersonalise可以通过包管理器安装。

保护您的卡

假设您已经配置了您的卡/ YubiKey(此处称为“GPG设备”)所有者信息。强烈建议您在开始本节之前保护您的卡。

注意 其中一些命令可能会要求输入PIN或管理员PIN。通常是默认PIN,通常123456是默认的管理员PIN 12345678。如果这些不起作用,请联系制造商或查看在线文档。

插入设备并执行:

代码语言:txt
复制
gpg2 --card-editadminpasswd

启用管理员命令:

代码语言:txt
复制
admin

输入密码更改菜单:

代码语言:txt
复制
passwd

选择,将密码更改为您的设备2 - unblock PIN。这将取消阻止您的PIN,并提示您更改它。每次要访问GPG密钥时都需要此PIN(例如,每次使用SSH进行身份验证时),并且限制为8个字符。

通过选择更改管理员PIN 3 - change Admin PIN。此PIN是进行管理更改所必需的,如步骤2中所示,并且限制为6个字符。为了获得最佳安全性,请勿将此PIN存储在数字位置,因为日常使用YubiKey不需要。

通过选择Q然后键入退出这些菜单quit

作为参考,您的窗口应类似于以下内容。这个例子缩写为:

代码语言:txt
复制
$ gpg2 --card-edit
gpg/card> admin
Admin commands are allowed

gpg/card> passwd
gpg: OpenPGP card no. D0000000000000000000000000000000 detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 1
PIN changed.
Your selection? 3
PIN changed.
Your selection? q

gpg/card> quit

转移您的子密钥

从正常的命令提示符输入密钥编辑菜单,替换key-id为您自己的密钥ID:

代码语言:txt
复制
gpg2 --edit-key key-idtogglekey 2请记住,如果您有更多子键,则应根据需要更改此命令。

切换到私钥编辑器:

代码语言:txt
复制
toggle

仅选择身份验证子项:

代码语言:txt
复制
key 2

转移钥匙:

代码语言:txt
复制
keytocardgpg -a --export-secret-subkeys key-id >> /Volumes/USB_DEVICE/key-id.stubs.gpg

请务必替换您自己的密钥ID key-id。您可以gpg2 --import <stub file>在私人计算机上使用普通帐户重新导入这些内容。

选择(3) Authentication key将密钥存储在设备的第三个插槽中。如果这不是一个选项,请确保您已选择相应的子项。

输入您的密码。

键入save以退出此菜单。

  1. 如果您正在使用VM或脱机计算机,请导出子项存根(指针,以便GPG知道您的子项在设备上):

毕竟,您的输出应类似于以下内容:

代码语言:txt
复制
$ gpg2 --edit-key 71735D23

Secret key is available.

pub  4096R/71735D23  created: 2016-04-09  expires: 2017-04-09  usage: SC
                           trust: ultimate      validity: ultimate
sub  4096R/693C5635  created: 2016-04-09  expires: 2017-04-09  usage: E
sub  4096R/48B9C23C  created: 2016-04-09  expires: 2017-04-09  usage: A
ultimate Your Name <you#yoursite.net>

gpg> toggle

sec  4096R/71735D23  created: 2016-04-09  expires: 2017-04-09
ssb  4096R/693C5635  created: 2016-04-09  expires: never
ssb  4096R/48B9C23C  created: 2016-04-09  expires: never
(1) Your Name <you#yoursite.net>

gpg> key 2

sec  4096R/71735D23  created: 2016-04-09  expires: 2017-04-09
ssb  4096R/693C5635  created: 2016-04-09  expires: never
ssb* 4096R/48B9C23C  created: 2016-04-09  expires: never
(1) Your Name <you#yoursite.net>
gpg> keytocard

Signature key ....: none
Encryption key....: none
Authentication key: none

Please select where to store the key:
   (3) Authentication key
Your selection? 3

You need a passphrase to unlock the secret key for
user: "Your Name <you#yoursite.net>"
4096-bit RSA key, ID 71735D23, created 2016-04-09

gpg> save

恭喜您已成功将身份验证子密钥传输到设备。

警告 如果您没有使用VM或脱机计算机,请备份私钥的本地副本,删除它们,并确保其余的密钥仍在卡上。

提供您的GPG密钥而不是SSH密钥

在本节中,我们将配置您的本地计算机,以便GPG和SSH之间的连接正常工作。

返回本地计算机,导入所有相应的GPG密钥并插入相应的GPG设备。如果您的本地计算机上没有GPG,请安装GPG(例如,如果您在VM上执行了上述所有步骤)。

编辑~/.bash\_profile文件(或类似的shell启动文件)以包括:

Linux

代码语言:txt
复制
〜/.bash_profile

if  -f "${HOME}/.gpg-agent-info" ; then
      source "${HOME}/.gpg-agent-info" 
        export GPG\\_AGENT\\_INFO        
        export SSH\\_AUTH\\_SOCK        
        export SSH\\_AGENT\\_PID 
else     
    eval $( gpg-agent --daemon --write-env-file ~/.gpg-agent-info )
fi

OS X

代码语言:txt
复制
〜/ .bash_profile

 [ -f ~/.gpg-agent-info ] && source ~/.gpg-agent-info 
 if  [ -S "${GPG_AGENT_INFO%%:*}" ]; then     
     export GPG_AGENT_INFO     
     export SSH_AUTH_SOCK     
     export SSH_AGENT_PID 
 else     
     eval $( gpg-agent --daemon --write-env-file ~/.gpg-agent-info ) 
 fi 

这可确保SSH可以“查看”您的GPG密钥并根据需要自动启动gpg-agent

编辑或创建

~/.gnupg/gpg-agent.conf

代码语言:txt
复制
〜/ .gnupg / GPG-agent.conf

default-cache-ttl 600 
max-cache-ttl 7200 
enable-ssh-support 
write-env-file ~/.gpg-agent-info

如果您使用的是OS X以及之前安装的GPGTools,您还可以添加以下行:

代码语言:txt
复制
pinentry-program /usr/local/MacGPG2/libexec/pinentry-mac.app/Contents/MacOS/pinentry-mac

这允许您使用GPGTools提供的PIN输入程序。

重新启动GPG代理:

代码语言:txt
复制
sudo killall gpg-agent 
gpg-agent --daemon --write-env-file ~/.gpg-agent-info --enable-ssh-support 
source ~/.gpg-agent-info

将新密钥添加到您的Linode

前面几节中的步骤将获取您的GPG密钥并通过SSH管道,以便它们可用于身份验证。此过程的结果是您已创建新的RSA公钥以用于SSH身份验证。

在本地计算机上,提取公钥:

代码语言:txt
复制
ssh-add -L

您应该看到长输出的字母数字字符。如果您看到The agent has no identities,请尝试从上面重新启动GPG代理的步骤。

复制整个输出字符串,包括ssh-rsa。如果您看到多个字符串开头ssh-rsa,请复制以其结尾的字符串cardno:。它可能看起来像这样:

代码语言:txt
复制
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDxAZn1IQ2cBxIbgwksWOfkAMKKLa3cUYMkbQBaR9Nw4CfoLs8xiu0Kb8oN4JH6p+E4C1MrlmFQuMZbVzs9JseV2pe6kw0xKQgLINopyF6letzCOEzPH7THicxyQc35vMIa8JTAMU6X3hpzzSUVSQGKDljj+c4XayTZCVQVg2Yqc67Vdm+4q4OQCU7Fns73KWmqwsdYtuyk74yPWjAvKkEaW7I9d3TLKVI8LLdzC6FoP2jJyGEoqxWEf2yL0eWelmJi/ikLJFSdXvdVCzvyI3dTeNqEdaisKQ0SJ7W0ysH1Os2hYyxBazWonMYI/T8Sh9J21xcWGmBumFTIcsbLEP17tojR4ttFq69ebtJIMkbPo0e+u4gWdvM44MyWsDm8jkKDuqNcduGIhF0dFY57niq4TEv5+Yvya2gwqBS4ttq/NlUAseL4zAcaP+kpDae4GMiRXwpFAiKA3ctn6/gf5QLvcAHMz62ASHeo9gG9t6n0eGUzBD/lv0qMsaYgmxfgIpqoU6Sr1w2EVp8TYjIVAaO/96Kljb2v9mB+0/BTO7gxJicxUNYQLOhEYdMnbr0bFNAG93hlUiq5eGTTG7nn1mre2OHWyGB8fZN9EukbMeFicgFTxgl3ddQawjn1Qb6u//ZpSCD++IH4HQCjz1fI9r+yZ+6CqfUrM0PI+dwAfcL4pw== cardno:000500001BDE

将其粘贴到新文件中(例如~/gpg-key.pub)并保存。

将文件复制到您的Linode:

代码语言:txt
复制
scp ~/gpg-key.pub you@yoursite.net:/home/you/.ssh/gpg-key.pub

登录您的Linode并将密钥附加到authorized_hosts文件:

代码语言:txt
复制
ssh you@yoursite.net "echo cat ~/.ssh/gpg-key.pub >> ~/.ssh/authorized\_keys"

你完成了!断开连接,所有新登录现在应该使用您的GPG密钥而不是密码。此SSH密钥还可以与GitHub,Bitbucket,其他基于SSH的版本控制系统或其他任何接受SSH密钥的地方一起使用。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 生成身份验证子项
  • 保护您的GPG密钥
  • 导出您的公钥
    • 保护您的卡
      • 转移您的子密钥
      • 提供您的GPG密钥而不是SSH密钥
      • 将新密钥添加到您的Linode
      相关产品与服务
      多因子身份认证
      多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档