如何使用GPG加密和签名邮件

介绍

GPG或GNU Privacy Guard是一种公钥加密实现。这允许在各方之间安全地传输信息,并且可以用于验证消息的来源是真实的。

在本教程中,我们将讨论GPG如何工作以及如何实现它。我们将使用Ubuntu 16.04服务器进行此演示,但也将包含其他发行版的说明。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器

公钥加密的工作原理

许多用户面临的一个问题是如何安全地进行通信并验证他们正在与之交谈的一方的身份。试图回答这个问题的许多方案,至少在某些时候,需要通过不安全的媒介传输密码或其他识别凭证。

确保只有目标方可以阅读

为了解决这个问题,GPG依赖于一种称为公钥加密的安全概念。可以将传输的加密和解密阶段分成两个单独的部分。这样,只要您保护解密部分,就可以自由地分发加密部分。

这将允许由任何人创建和加密的单向消息传输,但仅由指定用户(具有私有解密密钥的用户)解密。如果双方创建公钥/私钥对并互相提供公共加密密钥,则它们都可以相互加密消息。

因此,在这种情况下,每个方都有自己的私钥和其他用户的公钥。

验证发件人的身份

该系统的另一个好处是消息的发送者可以用他们的私钥“签名”消息。接收器具有的公钥可用于验证签名实际上是由所指示的用户发送的。

设置GPG密钥

默认情况下,GPG安装在大多数发行版中。

如果由于任何原因未在UbuntuDebian上安装GPG,您可以通过输入以下内容来更新本地repo索引并安装它:

$ sudo apt-get update
$ sudo apt-get install gnupg

CentOS上,您可以通过输入以下内容来安装GPG:

$ sudo yum install gnupg2

要开始使用GPG加密通信,您需要创建密钥对。您可以通过发出以下命令来执行此操作:

$ gpg --gen-key

这将带您完成一些可以配置密钥的问题:

  • 请选择您想要的密钥类型:(1)RSA和RSA(默认)
  • 你想要什么密钥?4096
  • 密钥有效吗?1y(1年后过期。如果您只是测试,您可能希望首次使用类似“3”的数字创建短期密钥。)
  • 它是否正确?y
  • 真实姓名:在此处输入你的真实姓名
  • 电子邮件地址:your_email@address.com
  • 注释:可在您的签名中显示的可选注释
  • 改变(N)ame,(C)omment,(E)mail 或(O)kay /(Q)uit?O
  • 输入密码:在此处输入安全密码(大写和小写,数字,符号)

此时,gpg将使用熵生成密钥。 熵描述了系统中存在的不可预测性和不确定性的数量。 GPG需要此熵来生成一组安全的密钥。

此过程可能需要很长时间,具体取决于系统的活动程度和所选的密钥大小。

创建吊销证书

如果存在安全漏洞或者您丢失了密钥,您需要设置一种使密钥对无效的方法。使用GPG软件可以轻松实现此目的。

这应该在您完成密钥对后立即完成,而不是在您需要密钥对时完成。必须提前生成此吊销密钥,并将其保存在安全的独立位置,以防计算机受到危害或无法运行。要生成吊销密钥,请输入:

$ gpg --output ~/revocation.crt --gen-revoke your_email@address.com

系统将要求您确认撤销密钥的创建,然后提示其被撤销的原因。如果将来使用撤销,则其他用户可以看到此信息。您可以选择任何可用选项,但由于这是提前完成的,因此您将无法获得具体信息。通常,为每个可能的方案创建撤销证书以获得最大的灵活性是个好主意。

之后,您将被要求提供评论,最后确认选择。在创建吊销证书之前,您需要输入GPG密钥的密码才能确认您的身份。撤销证书将写入由--output标志指定的文件(在我们的示例中为revocation.crt):

Output
Revocation certificate created.
​
Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!

您应该立即限制生成的证书文件的权限,以防止未经授权的访问:

$ chmod 600 ~/revocation.crt

撤销证书必须保持安全,以便其他用户无法撤销您的密钥。如消息所述,您应该考虑将证书备份到其他计算机并将其打印出来,只要您能够正确保护它。

如何导入其他用户的公钥

如果你不能接受你希望与之沟通的人的其他公钥,那么GPG将毫无用处。

您可以通过各种方式导入某人的公钥。如果您从文本文件中的某个人那里获得了公钥,GPG可以使用以下命令导入它:

$ gpg --import name_of_pub_key_file

您希望与之通信的人也可能已将其密钥上载到公钥服务器。这些服务器用于存放来自世界各地的人们的公钥。

MIT公钥服务器是一种流行的密钥服务器,它将其信息与各种其他服务器同步。您可以通过在Web浏览器中访问,按姓名或电子邮件地址搜索人员:

https://pgp.mit.edu/

您还可以通过输入以下内容在GPG中搜索密钥服务器:

$ gpg --keyserver pgp.mit.edu  --search-keys search_parameters

您可以使用此方法按名称或电子邮件地址进行搜索。您可以按照提示导入找到的密钥。

如何验证和签署密钥

虽然您可以自由分发生成的公钥文件,并且人们可以使用它以安全的方式与您联系,但重要的是能够相信密钥属于您在初始公钥传输期间所做的操作。

验证其他人的身份

你怎么知道给你公钥的人就是他们说的那个人?在某些情况下,这可能很简单。您可能正坐在笔记本电脑打开和更换钥匙的人旁边。这应该是一种非常安全的方式来识别您正在接收正确的合法密钥。

但是在许多其他情况下,这种个人接触是不可能的。您可能不会亲自了解另一方,或者您可能与物理距离分开。如果您不想通过不安全的渠道进行通信,那么验证公钥可能会有问题。

幸运的是,您可以简单地比较从这些密钥派生的“指纹”,而不是验证双方的整个公钥。这将为您提供合理的保证,即您使用相同的公钥信息。

您可以通过输入以下内容获取公钥的指纹:

$ gpg --fingerprint your_email@address.com
Output
pub   4096R/311B1F84 2013-10-04
​
      Key fingerprint = CB9E C70F 2421 AF06 7D72  F980 8287 6A15 311B 1F84
​
uid                  Test User test.user@address.com
​
sub   4096R/8822A56A 2013-10-04
​

这将产生一个更易于管理的数字串来进行比较。您可以将此字符串与此人本身或与有权访问该人的其他人进行比较。

签下他们的密钥

签署密钥会告诉您的软件您信任您提供的密钥,并且您已验证它与相关人员相关联。

要签署您导入的密钥,只需输入:

$ gpg --sign-key email@example.com

当您签署密钥时,这意味着您确认您信任该人是他们声称的人。这可以帮助其他人决定是否也信任那个人。如果有人信任你,并且他们看到你签署了这个人的钥匙,他们也可能更信任他们的身份。

您应该允许持有签名密钥的人通过将签名密钥发送回来来取得您的信任。您可以通过输入以下命令来完成此操作:

$ gpg --output ~/signed.key --export --armor email@example.com

您将不得不再次输入密码。之后,将显示由您签名的公钥。发送给他们,这样他们就可以在与他人互动时获得“批准印章”。

当他们收到这个新的签名密钥时,他们可以导入它,将您生成的签名信息添加到他们的GPG数据库中。他们可以通过输入以下内容来执行:

$ gpg --import ~/signed.key

他们现在可以向其他人证明您相信他们的身份是正确的。

如何使您的公钥高度可用

由于公钥加密的设计方式,如果未知的人拥有您的公钥,就不会发生任何恶意攻击。

考虑到这一点,将公钥公开提供可能是有益的。然后,人们可以找到您的信息,以便在您第一次互动时安全地向您发送消息。

您可以通过GPG系统向其发送公钥:

$ gpg --output ~/mygpg.key --armor --export your_email@address.com
Output
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)
​
 
mQINBFJPCuABEACiog/sInjg0O2SqgmG1T8n9FroSTdN74uGsRMHHAOuAmGLsTse
9oxeLQpN+r75Ko39RVE88dRcW710fPY0+fjSXBKhpN+raRMUKJp4AX9BJd00YA/4
EpD+8cDK4DuLlLdn1x0q41VUsznXrnMpQedRmAL9f9bL6pbLTJhaKeorTokTvdn6
5VT3pb2o+jr6NETaUxd99ZG/osPar9tNThVLIIzG1nDabcTFbMB+w7wOJuhXyTLQ
JBU9xmavTM71PfV6Pkh4j1pfWImXc1D8dS+jcvKeXInBfm2XZsfOCesk12YnK3Nc
u1Xe1lxzSt7Cegum4S/YuxmYoh462oGZ7FA4Cr2lvAPVpO9zmgQ8JITXiqYg2wB3
. . .

然后,您可以通过适当的媒介将此文件发送给另一方。

如果要将密钥发布到密钥服务器,可以通过大多数服务器站点上可用的表单手动执行。

另一种选择是通过GPG接口完成此操作。输入以下命令查找密钥ID:

$ gpg --list-keys your_email@address.com

下面输出中突出显示的部分是密钥ID(如果您不确定要使用哪一个,请查找左侧栏中的pub)。这是引用内部软件密钥的简短方法。

Output
pub   4096R/311B1F84 2013-10-04
uid                  Test User test.user@address.com
sub   4096R/8822A56A 2013-10-04

要将密钥上传到某个密钥服务器,您可以使用以下命令:

$ gpg --send-keys --keyserver pgp.mit.edu key_id

密钥将上传到指定的服务器。之后,它可能会分发给世界各地的其他密钥服务器。

使用GPG加密和解密消息

与对方共享密钥后,您可以轻松地加密和解密邮件。

加密消息

您可以使用GPG的“--encrypt”标志加密消息。基本语句是:

$ gpg --encrypt --sign --armor -r person@email.com name_of_file

这会使用收件人的公钥对邮件进行加密,使用您自己的私钥对其进行签名,以保证邮件来自您,并以文本格式而不是原始字节输出邮件。文件名将与输入文件名相同,但扩展名为.asc

如果您希望能够读取加密的邮件,则应该包含第二个“-r”收件人和您自己的电子邮件地址。这是因为消息将使用每个人的公钥加密,并且只能使用关联的私钥解密。

因此,如果它仅使用另一方的公钥加密,您将无法再次查看该消息,除非您以某种方式获取其私钥。将您自己添加为第二个收件人会分两次加密邮件,每个收件人一个。

解密消息

收到消息后,只需在消息文件上调用GPG:

$ gpg file_name.asc

软件会在必要时提示您。

如果不是文件,而是将消息作为原始文本流,则可以在gpg不带任何参数的输入后复制并粘贴它。您可以按“CTRL-D”表示消息的结束,GPG将为您解密。

关键维护

您可能需要定期使用许多过程来管理密钥数据库。

要列出您从其他人那里获得的可用GPG密钥,您可以发出以下命令:

$ gpg --list-keys

如果您依赖从公钥服务器提取的信息,您的关键信息可能会过时。您不希望依赖已撤销的密钥,因为这意味着您信任可能受到攻击的密钥。

您可以通过以下方式更新密钥信息:

$ gpg --refresh-keys

这将从密钥服务器获取新信息。

您可以使用以下方法从特定密钥服务器提取信息:

$ gpg --keyserver key_server --refresh-keys

如果在密钥服务器上找不到任何密钥,您可能会收到错误消息。

结论

正确使用GPG可以帮助您保护与不同人的通信。特别是在处理敏感信息时,以及处理常规日常消息时特别有用。

由于监控程序可以标记某些加密通信的方式,因此建议对所有内容使用加密,而不仅仅是“秘密”数据。这将使人们更难以知道您何时发送重要数据还是只是发送友好的问候。

如果您在生产环境使用,我还是建议您直接使用云关系型数据库,云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL 数据库引擎,并针对数据库引擎的性能进行了优化。云关系型数据库是一种高度可用的托管服务,提供容灾、备份、恢复、监控、迁移等数据库运维全套解决方案,可将您从耗时的数据库管理任务中解放出来,让您有更多时间专注于您的应用和业务。

更多Linux教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Use GPG to Encrypt and Sign Messages 》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JAVA烂猪皮

HTTPS之TLS性能调优

HTTPS(HTTP over SSL)是以安全为目标的 HTTP 通道,可以理解为 HTTP + SSL/TLS,即在 HTTP 下加入 SSL/TLS 层作...

28730
来自专栏运维技术迷

成功安装SSL证书

昨天看老谢博客搞了一个SSL,一年才6块钱,然后就按捺不住去了淘宝。经过跟衡天的配合,今天上午终于可以完成了。以后,那一把绿色的小锁也会出现在我的网站上面了。不...

79070
来自专栏全沾开发(huā)

记一个node实现的图形验证码从0到1

记一个node实现的图形验证码从0到1 最近做了一个项目,需要用到给用户发送短信验证码,短信必然走的是第三方的服务。。 so 每一条...

32670
来自专栏魏艾斯博客www.vpsss.net

腾讯云 CDN 续期 Let’s Encrypt 证书的操作过程

今天要说的是腾讯云 CDN 续期 Let’s Encrypt 证书的操作过程,常来的朋友都知道魏艾斯博客放在腾讯云了(点我打开抢 3 折特惠),同时还用了腾讯云...

56310
来自专栏源码之家

使用神器快速破解Zend及ionCube加密的php文件

2.4K40
来自专栏前端儿

HTTPS 概述

HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机...

27520
来自专栏禹都一只猫博客

certbot免费SSL证书申请部署

32430
来自专栏一名合格java开发的自我修养

HTTP协议下保证密码不被获取更健壮方式

说到在http协议下用户登录如何保证密码安全这个问题:     小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把...

13620
来自专栏阮一峰的网络日志

HTTPS的七个误解(译文)

我使用的工具主要有两个,在Firefox中是Firebug,在IE中是Fiddler。但是,一直听别人说,付费软件HttpWatch是这方面最好的工具。

21520
来自专栏一体化运维管控平台

HTTPS 证书配置一劳永逸

HTTPS 是在 HTTP 协议基础之上加了一层 SSL/TLS 安全认证机制,原理功能概括一句即客户端和服务端在非对称密钥通讯中交换临时对称密钥进行的加密数据...

1.5K70

扫码关注云+社区

领取腾讯云代金券