安装GPG:
关于Debian及其衍生品:
sudo apt-get install gnupg2
在OS X上:
GPGTools为OS X提供了最简单的GPG实现。否则,js brew install gnupg2
如果你有Homebrew,你可以运行。
在其他操作系统上,此过程应该相当清楚。GPG可能已经安装,但如果不安装,快速的互联网搜索应该会为您提供所需的说明。
打开命令提示符并执行:
gpg2 --gen-key
当系统提示您选择所需的密钥类型时,请选择(1) RSA and RSA
。
当要求输入密钥时,请键入4096
。如果您想将密钥存储在YubiKey Neo或某些智能卡上,则可能限制为2048位密钥大小,因此请确保您了解设备的限制(如果适用)。
选择您认为适合此密钥的有效期。在该日期之后,密钥将不再起作用,因此请谨慎选择。
输入您的全名,电子邮件地址和评论(如果需要)。选择O
'好'。
在仔细查看特工后,输入一个长而安全的密码短语,用于加密本地存储中的密钥。在计算机生成密钥对的同时,将其写入您知道的物理安全的地方。
完成此操作后,您的输出应类似于以下内容:
$ 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进行身份验证,我们需要生成第二个用于身份验证的子项。
在命令提示符或终端中,键入:
gpg2 --expert --edit-key key-id
替换key-id
为密钥生成过程中的八个字符的字符串输出。这将在以开头的行中找到pub
。在上面的示例中,ID为71735D23
。
在新gpg>
提示符下,输入:
addkey
出现提示时,输入您的密码。
当询问您想要的键类型时,请选择:(8) RSA (set your own capabilities)
。
输入S
以关闭“签名”操作。
输入E
以关闭“加密”操作。
输入A
以切换“验证”操作。现在输出应该包含Current allowed actions: Authenticate
,该行没有任何其他内容。
输入Q
继续。
当要求输入密钥时,请选择4096
。第一部分中的步骤4适用相同的限制,因此请确保您的卡/ YubiKey可以支持此密钥大小。
像以前一样输入到期日期。你可能应该保持与第一个相同。如果您选择较低的到期日期,您的主私钥将继续运行,但您的SSH身份验证将在此日期中断。
如果您确定输入的所有信息都是正确的,请y
在Really create? (y/N)
提示符下输入以完成此过程。
创建密钥后,输入quit
以退出gpg提示符,并y
在提示符处保存更改。
您的终端现在应该如下所示:
$ 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
警告 如果您无法备份或以其他方式保护密钥,则任何硬件故障都将导致您无法使用此密钥访问您的Linode。如果您通过SSH锁定密码访问权限,则需要使用Lish重新获得访问权限。
如果出现问题,您应该始终备份私钥,并最终锁定所有需要它的东西。如果您需要在新计算机上重新启动,此私钥以及本指南中的说明将足以让您的设置再次运行。
使用以下命令在~/.gnupg
下备份文件夹,替换USB_DEVICE
为设备名称:
cp -r ~/.gnupg/ /Volumes/USB_DEVICE/
这假设您安装了一个存储设备/Volumes/USB\_DEVICE/
。不同的操作系统可能对此路径使用不同的命名约定。您可以放心地忽略Operation not supported on socket
输入此命令时出现的任何警告。
备份您的私钥,替换key-id
为私钥的八个字符的密钥ID:
gpg2 -a --export-secret-key key-id >> /Volumes/USB\_DEVICE/key-id.master.key
备份子项,替换key-id为每个子项的八个字符的密钥ID:
gpg2 -a --export-secret-subkeys key-id >> /Volumes/USB\_DEVICE/<key id>.sub.key
如果发生了不好的事情而你丢失了密钥,你可以通过~/.gnupg用你的副本覆盖目录来重新导入它们,并使用:
gpg2 --allow-secret-key-import --import key-file
请务必替换key-file
每个文件的位置。
如果您正在使用VM或脱机计算机,则还需要导出您的公钥以便稍后重新导入:
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 -m82
。ykpersonalise
可以通过包管理器安装。
假设您已经配置了您的卡/ YubiKey(此处称为“GPG设备”)所有者信息。强烈建议您在开始本节之前保护您的卡。
注意 其中一些命令可能会要求输入PIN或管理员PIN。通常是默认PIN,通常
123456
是默认的管理员PIN12345678
。如果这些不起作用,请联系制造商或查看在线文档。
插入设备并执行:
gpg2 --card-editadminpasswd
启用管理员命令:
admin
输入密码更改菜单:
passwd
选择,将密码更改为您的设备2 - unblock PIN
。这将取消阻止您的PIN,并提示您更改它。每次要访问GPG密钥时都需要此PIN(例如,每次使用SSH进行身份验证时),并且限制为8个字符。
通过选择更改管理员PIN 3 - change Admin PIN
。此PIN是进行管理更改所必需的,如步骤2中所示,并且限制为6个字符。为了获得最佳安全性,请勿将此PIN存储在数字位置,因为日常使用YubiKey不需要。
通过选择Q
然后键入退出这些菜单quit
。
作为参考,您的窗口应类似于以下内容。这个例子缩写为:
$ 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:
gpg2 --edit-key key-idtogglekey 2请记住,如果您有更多子键,则应根据需要更改此命令。
切换到私钥编辑器:
toggle
仅选择身份验证子项:
key 2
转移钥匙:
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
以退出此菜单。
毕竟,您的输出应类似于以下内容:
$ 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密钥并插入相应的GPG设备。如果您的本地计算机上没有GPG,请安装GPG(例如,如果您在VM上执行了上述所有步骤)。
编辑~/.bash\_profile
文件(或类似的shell启动文件)以包括:
Linux
〜/.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
〜/ .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
:
〜/ .gnupg / GPG-agent.conf
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
write-env-file ~/.gpg-agent-info
如果您使用的是OS X以及之前安装的GPGTools,您还可以添加以下行:
pinentry-program /usr/local/MacGPG2/libexec/pinentry-mac.app/Contents/MacOS/pinentry-mac
这允许您使用GPGTools提供的PIN输入程序。
重新启动GPG代理:
sudo killall gpg-agent
gpg-agent --daemon --write-env-file ~/.gpg-agent-info --enable-ssh-support
source ~/.gpg-agent-info
前面几节中的步骤将获取您的GPG密钥并通过SSH管道,以便它们可用于身份验证。此过程的结果是您已创建新的RSA公钥以用于SSH身份验证。
在本地计算机上,提取公钥:
ssh-add -L
您应该看到长输出的字母数字字符。如果您看到The agent has no identities
,请尝试从上面重新启动GPG代理的步骤。
复制整个输出字符串,包括ssh-rsa
。如果您看到多个字符串开头ssh-rsa
,请复制以其结尾的字符串cardno:
。它可能看起来像这样:
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:
scp ~/gpg-key.pub you@yoursite.net:/home/you/.ssh/gpg-key.pub
登录您的Linode并将密钥附加到authorized_hosts
文件:
ssh you@yoursite.net "echo cat ~/.ssh/gpg-key.pub >> ~/.ssh/authorized\_keys"
你完成了!断开连接,所有新登录现在应该使用您的GPG密钥而不是密码。此SSH密钥还可以与GitHub,Bitbucket,其他基于SSH的版本控制系统或其他任何接受SSH密钥的地方一起使用。