ubuntu 使用gpg2详解 ## 安装 ```shell apt-get install gnupg2 ``` ## 生成密钥对 ```shell gpg --full-generate-key # 按提示填写即可,生成后,使用命令显示密钥 # 假设我们的用户名输入了haha,邮箱是haha@126.com gpg --list-keys # 输出 pub rsa2048 2020-01-02 [SC] 6CFAA44AC11E041B0181988352FC3xxxxC39FF406 uid [ 绝对 ] haha sub rsa2048 2020-01-02 [E] ``` 注意,这个`haha@126.com`或者`haha`就是用户ID 6CFAA44AC11E041B0181988352FC3xxxxC39FF406 是公钥指纹,将这个指纹告诉你的同事和朋友,使他们在web上导入公钥的时候,可以作为验证的凭证,而不至于错误的使用了伪造的公钥。 此外,验证签名的时候,也会显示这个指纹,做为验证的凭据。 ## 导出公钥 ```shell gpg --armor --output ~/public-key.txt --export haha@126.com ``` 此时在~目录下,会出现公钥public-key.txt ## 导出私钥 同理可以导出私钥,把这两个文件好好保存。以备以后恢复之用。 ```shell gpg --armor --output ~/private-key.txt --export-secret-keys haha@126.com ``` ## 导入私钥 将导出的私钥备份后,当重装系统,就能恢复这对密钥,这非常重要。否则,之前加密的文件可能都无法解密。 ```shell gpg --allow-secret-key-import --import private-key.txt ``` 此时,弹出密码框,输入当时设置的密码。  导入后,输入: ```shell gpg --edit-key 用户ID gpg (GnuPG) 2.2.4; Copyright (C) 2017 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. Secret key is available. ...... ``` 发现`Secret key is available.`,此时可以用私钥*解密*之前加密的文件。 ## 把公钥上传到服务器 为了方便分享,使别人可以使用你的公钥加密,以向你发送密文,可以选择一个公共的服务器,将公钥共享,注意,这个公共服务器并不验证公钥的来源,所以,需要谨慎下载对方的公钥,避免泄密。 ```shell # 6CFAA44AC11E041B0181988352FC3xxxxC39FF406 是公钥指纹,在--list-keys可以查看到 gpg --keyserver hkp://keyserver.ubuntu.com --send-keys 6CFAA44AC11E041B0181988352FC3xxxxC39FF406 ``` ## 此时,所有人可以搜索到公钥 ```shell gpg --keyserver hkp://keyserver.ubuntu.com --search-keys "haha" ``` 截图:  RSA key 后面的那串 52FC38xxxxxxxxx就是这个公钥的ID,可以使用这个ID,从服务器将公钥导入到本地。 ## 下载公钥 ```shell # 首先搜索 haha@126.com,弄清id,然后 gpg --keyserver keyserver.ubuntu.com --recv 52FC3B13C39Fxxx6 # 或者直接通过指纹下载也是可以的 gpg --keyserver keyserver.ubuntu.com --recv 6CFAA44AC11E041B01819xxxxxxxxC39FF406 ``` 此时显示keys: ```shell gpg --list-keys /root/.gnupg/pubring.kbx ------------------------ pub rsa2048 2020-01-02 [SC] 6CFAA44AC11E041B01819883xxxxxxx9FF406 uid [ unknown] haha sub rsa2048 2020-01-02 [E] ``` 可以发现公钥。 但是,这里导入的key被标记为unknown,使用上会有警告,如果能确定这个key的来源,可以信任它。 ```shell gpg --edit-key haha gpg>> trust Please decide how far you trust this user to correctly verify other users' keys (by looking at passports, checking fingerprints from different sources, etc.) 1 = I don't know or won't say 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully 5 = I trust ultimately m = back to the main menu Your decision? 5 ``` ## 加密 ```shell gpg -r haha -o test.txt.gpg -e test.txt # 也可以不指定-o,并指定多个-r,此时,自动生成test.txt.gpg文件 gpg -r haha -r lucy -r amy -e test.txt ``` 导入了公钥后,就可以用公钥加密。test.txt为源文件,test.txt.gpg为加密后的文件 ## 解密 将加密后的文件发给拥有私钥的一方。 ```shell gpg -d -o test.txt test.txt.gpg # 会自动选择机器上合适的密钥 ``` 此时,会要求输入创建密钥对时的保护密码,输入密码后,test.txt文件生成。 ## 签名与验证签名 ### 合并模式 如果只是需要发送一个文本文档,则可以将签名合并在文档之中。 注意,签名的时候使用私钥。 ```shell touch test_sign.txt # 内容 hello world 世界你好 gpg -u haha --clearsign test_sign.txt ``` 此时,生成了一个asc2码编码的签名文件,签名合并在了文件中。 ```shell cat test_sign.txt.asc -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 hello world 世界你好 -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEbPqkSsEeBBsBgZiDUvw7E8Of9AYFAl4Osf4AC ................ lrvTl7xMeh71rsw7dA+uXKkNf1hFsiHbHoIRoj0Ywm8uJYFBlmefmxeFehu0BSWI 48stdynmesTlHBIIvHxUoDaelOVcnw== =b3BC -----END PGP SIGNATURE----- ``` ### 非合并模式 有时,需要把签名文件单独拎出来。此时可以: ```shell gpg -u haha -a -b test_sign.txt ``` 此时,生成的`test_sign.txt.asc`文件中,不包含文件的原文。 ### 验证签名 无论是哪种签名方式,都可以用下面的方法验签. ```shell gpg --verify test_sign.txt.asc 输出: gpg: assuming signed data in 'test_sign.txt' gpg: 签名建立于 2020年01月03日 星期五 11时19分49秒 CST gpg: 使用 RSA 密钥 6CFAA44AC11E041B0xxxxxxxxxFF406 gpg: 完好的签名,来自于“haha ” [绝对] ``` ## nauttilus 插件 ``` sudo apt-get install seahorse-nautilus ``` 来自 大脸猪 写于 2020-01-02 21:36 -- 更新于2020-10-19 13:06 -- 0 条评论