• GPG配置、命令、实例与apt-key密钥测试


    环境

    Ubuntu18.04
    gpg version 2.24

    参考文档

    GnuPG

    栗子文档

    阮一峰

    key Management

    简介

    他人用公钥来加密,自己用私钥来解密

    自己用私钥来签名,他人用公钥来验证

    The public key is given out to the world; the private key must be kept a secret. Anyone possessing the public key can encrypt a message so that it can only be read by someone possessing the private key. It's also possible to use a private key to sign a file, not encrypt it. If a private key is used to sign a file, then anyone who has the public key can check that the file was signed by that key. Anyone who doesn't have the private key can't forge such a signature.

    通信流程

    • Say S wants to send a message to G. To do that:
      • S looks for G's public key.
      • S encrypts the message using G's public key.
      • S signs the encrypted message with his own private key.
    • G receives an encrypted signed message. The untrusted email header says it is from S.
      • G looks for S's public key.
      • G verifies the signature using S's public key. Now, G is convinced message is from S.
      • G decrypts message using his own private key.

    The whole scheme relies on the assumption that public keys are trustworthy

    https://security.stackexchange.com/a/133393

    词汇

    简写 含义
    key pair 密钥对(包含两部分)
    primary key [master key] 主密钥(包括主公钥,主私钥)
    public key pub 公钥
    secret key sec 私钥
    sub-key sub 子公钥
    secret sub-key ssb 子私钥
    key fingerprint 密钥指纹

    文件/目录

    /private-keys-v1.d/

    私钥存放的地方

    /pubring.kbx

    以其他格式存放的公钥环,与gpgsm共享

    /trustdb.gpg

    存放信任数据

    /openpgp-revocs.d/

    gpg存储预先生成的吊销证书的目录。文件名对应于相应密钥的OpenPGP指纹。建议备份这些证书

    GnuPG 功能

    • 跟算法有关,有些算法不支持某些功能

    • 有些功能是私钥部分的,例如 认证[C]、签名[S]、解密

      删除私钥部分则无法完成操作

    • 有些功能是公钥部分的,例如 验证签名、加密[E]

      删除私钥部分可以完成操作

      # 解密
      lfp@legion:~$ gpg --homedir ~/.gnupg-test -o ~/bin/a.de.txt --decrypt ~/bin/a.en.txt
      gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
      gpg: 由 4096 位的 RSA 密钥加密,钥匙号为 0x9B690269F3C16E7B、生成于 2020-05-05
            “usmile <usmile@qq.com>”
      gpg: 解密失败:没有秘匙
      # 签名
      lfp@legion:~$ gpg --homedir ~/.gnupg-test --sign ~/bin/test.txt 
      gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
      gpg: no default secret key: 没有秘匙
      gpg: signing failed: 没有秘匙
      

    S: sign

    签名功能

    E: encrypt

    加密功能

    A: authenticate

    作用

    1. 身份验证功能

    2. 在其他协议中用于身份验证,例如SSH TLS

      https://superuser.com/a/1286352

    其他

    1. 只能通过 --expert 选项制作具有该功能的子公钥

    C: certify

    主密钥必备能力,且只有主密钥具有

    作用

    1. 认证具有不同功能的子密钥

    特性

    • 在key id 之后输入!,将强制使用该key

    • 当多个密钥同时具有某个功能的时候,优先使用最新未吊销的密钥

      例如有两个具有[S]的子密钥, 在未指定使用哪个密钥签名的情况下,优先使用最新未被吊销的密钥

    • 密钥的过期时间相当于一个自签名(自己的私钥给公钥签名),公钥可以验证自身的签名

      修改过期时间就会给自己新增加一个自签名(覆盖旧签名,但不删除)

      Updating a key's expiration time

    • 公钥、私钥的keyID是相同的,一起被创建,每个公钥对应一个私钥

    • 一个主密钥可以绑定多个子密钥,平时加密解密使用的都是子密钥,主密钥只有在某些特定的情况下才使用的,比如新建一个子密钥,撤销废除一个子密钥,签名认证别人的密钥等。

      这样设计的好处的是子密钥遗失和泄漏不影响主密钥的信用,只需要撤销废除子密钥,然后再发布到密钥服务器,告诉其它人这个子密钥已经作废了,主密钥的公钥长久积累下来的多人签名认证可以长久保留下来

      如果重建这层信任还要再让别人再签名认证你的新密钥,很麻烦。所以主密钥特别重要的,如果它泄漏了,那这个主密钥下所有子密钥全都报废

    • 正确的使用姿势是导出主私钥备份,删除本机的主私钥,本机只保留子私钥用于日常操作,哪怕子密钥被人盗取,也不影响主密钥,尽最大程度保护你的主密钥。

      https://www.zhihu.com/question/53042506/answer/306354115

    命令

    gpg --armor

    以ASCII 形式输出

    gpg --output

    gpg -o file

    指定输出文件名

    gpg --version

    不能缩写,打印版本和许可信息

    gpg --homedir

    仅在命令行有效

    指定生成的密钥环以及其他数据保存的地方

    默认是~/.gnupg 目录

    mkdir ~/.gnupg-test
    gpg --homedir  ~/gnupg-test
    

    gpg --expert

    允许用户执行某些荒谬或“愚蠢”的事情,例如对已过期或已撤销的密钥进行签名,或某些潜在的不兼容的事情,例如生成异常的密钥类型。这还会禁用有关潜在不兼容操作的某些警告消息。顾名思义,此选项仅适用于专家。如果您不完全了解它允许您执行的操作,请不要进行此操作

    在创建具有身份验证功能[A]的子密钥时需要添加此参数,不加此参数,缺少一些可选项

    gpg --full-gen-key

    可以自定义密钥的参数,具有所有的可选项

    gpg --gen-key

    使用当前默认的参数快速生成密钥

    同时会生成密钥的撤销证书

    生成的主密钥默认具有[SC] 两项功能

    In addition to the key a revocation certificate is created and stored in the ‘openpgp-revocs.d’ directory below the GnuPG home directory

    gpg --list-keys

    gpg -k

    列出公钥,如果没有指定则列出所有

    gpg --list-secret-keys

    gpg -K

    列出私钥,如果没有指定则列出所有

    lfp@legion:~$ gpg --homedir ~/.gnupg-test -k
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    /home/lfp/.gnupg-test/pubring.kbx
    ---------------------------------
    pub   rsa4096/0x5AF8B6B68CC7F785 2020-05-05 [SC]		# 后面没有日期的是永不过期
          密钥指纹 = 0298 F65F 32F5 A7CA D764  A941 5AF8 B6B6 8CC7 F785
    uid                   [ 绝对 ] usmile <usmile@qq.com>
    sub   rsa4096/0x9B690269F3C16E7B 2020-05-05 [E]			   # 后面没有日期的是永不过期
    sub   rsa3072/0x8EF9605115CB7A14 2020-05-05 [S] [有效至:2020-05-12]
    

    gpg --gen-revoke

    为整个密钥(主密钥以及所有子密钥)生成撤销证书,如果仅仅想撤销某个子密钥则通过--edit命令完成

    gpg --gen-revoke keyId --output path/revoke.asc
    

    gpg --edit-key

    gpg --edit-key <keyid>

    编辑该keyid代表的密钥

    gpg --delete-keys

    gpg --delete-keys <key-id>

    从密钥环中删除该密钥的公钥部分,但是需要先删除私钥部分

    gpg --delete-secret-keys

    gpg --delete-secret-keys <key-id>

    从密钥环中删除该密钥的私钥部分,公钥部分还存在

    gpg --delete-secret-and-public-key

    gpg --delete-secret-and-public-key <key-id>

    从密钥环中删除该密钥对,先删除私钥再删除公钥

    gpg --encrypt

    gpg --recipient <uid> --output <file-name_en> --encrypt <file-name>

    gpg --homedir ~/.gnupg-test -r 0x8EF9605115CB7A14 -o ~/bin/a.en.txt --encrypt ~/bin/a.txt

    指定用谁的公钥加密文件,并指定加密后的文件名

    gpg --decrypt

    gpg --output <fine-name_de> --decrypt <file-name_en>

    解密文件,并指定解密后生成的文件名

    gpg --sign

    采用二进制储存,生成[.gpg]文件

    默认情况下选择最新未被吊销的具有[S]功能的密钥

    可以通过--local-user--default-key指定

    gpg --clearsign

    采用ASCII码形式储存,生成[.asc]文件

    gpg --detach-sign

    与文件内容分开存放,生成单独的签名文件[.sig](二进制形式)

    gpg --detach-sign --armor

    生成单独的签名文件[.asc](ASCII码形式)

    gpg --verify

    gpg --verify [.gpg]

    验证签名

    gpg --export

    gpg --homedir ./gnupg-test --export --armor --o public-keys.gpg 0xD93D03C13478D580

    导出所有密钥的公钥部分 (master + subkeys)

    可以指定具体某个密钥

    gpg --export-secret-keys

    gpg --homedir ./gnupg-test --export-secret-keys --armor --o secret-keys.gpg 0xD93D03C13478D580

    导出所有密钥的私钥部分 (master + subkeys)

    gpg --export-secret-subkeys

    gpg --homedir ./gnupg-test --export-secret-subkeys --armor --o secret-subkey_sign.gpg 0x1ED73636975EC6DE!

    导出某个子密钥的私钥部分

    公钥服务器

    hkp(HTTP Keyserver Protocol):http密钥服务器协议

    公钥服务器可以通过交换机制同步新上传的公钥

    公钥服务器没有检查机制,任何人都可以用你的名义上传公钥,所以没有办法保证服务器上的公钥的可靠性

    一般可以通过公钥的指纹来核对,但是指纹也会被伪造

    key server

    hkp://keyserver.ubuntu.com:80
    hkp://keyserver.ubuntu.com
    hkp://pgp.mit.edu:80
    hkps://pgp.mit.edu
    

    配置文件

    默认的配置文件是 ~/.gnupg/gpg.conf~/.gnupg/dirmngr.conf.

    不会自动创建,需要手动创建并添加需要的配置

    Those files are not there by default, create blank files instead, then use gpg(1) and see the FILES section to configure what you want.

    You do not need any sort of default files.

    创建配置文件

    # 创建配置文件
    gpg.conf
    
    # 添加如下内容
    ################################################################################
    # GnuPG View Options
    
    # 显示keyId 16位 16进制数字
    # Select how to display key IDs. "long" is the more accurate (but less 
    # convenient) 16-character key ID. Add an "0x" to include an "0x" at the 
    # beginning of the key ID. 
    keyid-format 0xlong
    
    # 显示指纹标识
    # List all keys with their fingerprints. This is the same output as --list-keys 
    # but with the additional output of a line with the fingerprint. If this 
    # command is given twice, the fingerprints of all secondary keys are listed too.
    with-fingerprint
    
    # 保存退出
    

    生成主密钥

    lfp@legion:~$ mkdir ~/.gnupg-test
    lfp@legion:~$ vim ~/.gnupg-test/gpg.conf
    lfp@legion:~$ gpg --homedir ~/.gnupg-test --expert --full-gen-key
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    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.
    
    gpg: keybox '/home/lfp/.gnupg-test/pubring.kbx' created
    请选择您要使用的密钥种类:
       (1) RSA and RSA (default)
       (2) DSA and Elgamal
       (3) DSA (仅用于签名)
       (4) RSA (仅用于签名)
       (7) DSA (自定义用途)
       (8) RSA (自定义用途)
       (9) ECC and ECC
      (10) ECC (sign only)
      (11) ECC (set your own capabilities)
      (13) Existing key
    您的选择? 8
    
    RSA 密钥可能的操作: 签名 验证 加密 认证 
    目前允许的操作: 签名 验证 加密 
    
       (S) 选择是否用于签名
       (E) 选择是否用于加密
       (A) 选择是否用于认证
       (Q) 已完成
    
    您的选择? s
    
    RSA 密钥可能的操作: 签名 验证 加密 认证 
    目前允许的操作: 验证 加密 
    
       (S) 选择是否用于签名
       (E) 选择是否用于加密
       (A) 选择是否用于认证
       (Q) 已完成
    
    您的选择? e
    
    RSA 密钥可能的操作: 签名 验证 加密 认证 
    目前允许的操作: 验证 
    
       (S) 选择是否用于签名
       (E) 选择是否用于加密
       (A) 选择是否用于认证
       (Q) 已完成
    
    您的选择? q
    RSA 密钥长度应在 1024 位与 4096 位之间。
    您想要用多大的密钥尺寸?(3072) 4096
    您所要求的密钥尺寸是 4096 位
    请设定这把密钥的有效期限。
             0 = 密钥永不过期
          <n>  = 密钥在 n 天后过期
          <n>w = 密钥在 n 周后过期
          <n>m = 密钥在 n 月后过期
          <n>y = 密钥在 n 年后过期
    密钥的有效期限是?(0) 1
    密钥于 2020年05月04日 星期一 19时53分23秒 CST 过期
    以上正确吗?(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>"
    
    真实姓名: usmile
    电子邮件地址: usmile@qq.com
    注释: 
    您选定了这个用户标识:
        “usmile <usmile@qq.com>”
    
    更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? o
    # 此时需要输入一个口令,一定要记住,后面编辑该密钥时需要用到
    我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
    鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
    gpg: /home/lfp/.gnupg-test/trustdb.gpg:建立了信任度数据库
    gpg: 密钥 0x2954C91DEAE3C032 被标记为绝对信任
    gpg: directory '/home/lfp/.gnupg-test/openpgp-revocs.d' created
    gpg: revocation certificate stored as '/home/lfp/.gnupg-test/openpgp-revocs.d/76D139A8F9172972195CF33C2954C91DEAE3C032.rev'
    公钥和私钥已经生成并经签名。
    
    pub   rsa4096/0x2954C91DEAE3C032 2020-05-03 [C] [有效至:2020-05-04]
          密钥指纹 = 76D1 39A8 F917 2972 195C  F33C 2954 C91D EAE3 C032
    uid                              usmile <usmile@qq.com>
    
    

    检查是否成功

    lfp@legion:~$ gpg --homedir ~/.gnupg-test -K
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    gpg: 正在检查信任度数据库
    gpg: marginals needed: 3  completes needed: 1  trust model: pgp
    gpg: 深度:0 有效性:  1 已签名:  0 信任度:0-,0q,0n,0m,0f,1u
    gpg: 下次信任度数据库检查将于 2020-05-04 进行
    /home/lfp/.gnupg-test/pubring.kbx
    ---------------------------------
    sec   rsa4096/0x2954C91DEAE3C032 2020-05-03 [C] [有效至:2020-05-04]
          密钥指纹 = 76D1 39A8 F917 2972 195C  F33C 2954 C91D EAE3 C032
    uid                   [ 绝对 ] usmile <usmile@qq.com>
    
    

    创建子密钥[S]

    lfp@legion:~$ gpg --homedir ~/.gnupg-test --expert --edit-key 0x2954C91DEAE3C032 
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    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.
    
    私钥可用。
    
    sec  rsa4096/0x2954C91DEAE3C032
         创建于:2020-05-03  有效至:2020-05-04  可用于:C   
         信任度:绝对        有效性:绝对
    [ 绝对 ] (1). usmile <usmile@qq.com>
    
    gpg> addkey
    请选择您要使用的密钥种类:
       (3) DSA (仅用于签名)
       (4) RSA (仅用于签名)
       (5) ElGamal (仅用于加密)
       (6) RSA (仅用于加密)
       (7) DSA (自定义用途)
       (8) RSA (自定义用途)
      (10) ECC (sign only)
      (11) ECC (set your own capabilities)
      (12) ECC (encrypt only)
      (13) Existing key
    您的选择? 4
    RSA 密钥长度应在 1024 位与 4096 位之间。
    您想要用多大的密钥尺寸?(3072) 
    您所要求的密钥尺寸是 3072 位
    请设定这把密钥的有效期限。
             0 = 密钥永不过期
          <n>  = 密钥在 n 天后过期
          <n>w = 密钥在 n 周后过期
          <n>m = 密钥在 n 月后过期
          <n>y = 密钥在 n 年后过期
    密钥的有效期限是?(0) 1
    密钥于 2020年05月04日 星期一 19时57分58秒 CST 过期
    以上正确吗?(y/n) y
    真的要建立吗?(y/N) y
    我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
    鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
    
    sec  rsa4096/0x2954C91DEAE3C032
         创建于:2020-05-03  有效至:2020-05-04  可用于:C   
         信任度:绝对        有效性:绝对
    ssb  rsa3072/0x6E3823DE57F89766
         创建于:2020-05-03  有效至:2020-05-04  可用于:S   
    [ 绝对 ] (1). usmile <usmile@qq.com>
    
    # 注意一定要保存才能生效
    gpg> save
    
    

    查看是否创建成功

    lfp@legion:~$ gpg --homedir ~/.gnupg-test -K
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    /home/lfp/.gnupg-test/pubring.kbx
    ---------------------------------
    sec   rsa4096/0x2954C91DEAE3C032 2020-05-03 [C] [有效至:2020-05-04]
          密钥指纹 = 76D1 39A8 F917 2972 195C  F33C 2954 C91D EAE3 C032
    uid                   [ 绝对 ] usmile <usmile@qq.com>
    ssb   rsa3072/0x6E3823DE57F89766 2020-05-03 [S] [有效至:2020-05-04]
    
    lfp@legion:~$ gpg --homedir ~/.gnupg-test -k
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    /home/lfp/.gnupg-test/pubring.kbx
    ---------------------------------
    pub   rsa4096/0x2954C91DEAE3C032 2020-05-03 [C] [有效至:2020-05-04]
          密钥指纹 = 76D1 39A8 F917 2972 195C  F33C 2954 C91D EAE3 C032
    uid                   [ 绝对 ] usmile <usmile@qq.com>
    sub   rsa3072/0x6E3823DE57F89766 2020-05-03 [S] [有效至:2020-05-04]
    
    

    创建子密钥[A]

    lfp@legion:~$ gpg --homedir ~/.gnupg-test --expert --edit-key 0x2954C91DEAE3C032 
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    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.
    
    私钥可用。
    
    sec  rsa4096/0x2954C91DEAE3C032
         创建于:2020-05-03  有效至:2020-05-04  可用于:C   
         信任度:绝对        有效性:绝对
    ssb  rsa3072/0x6E3823DE57F89766
         创建于:2020-05-03  有效至:2020-05-04  可用于:S   
    [ 绝对 ] (1). usmile <usmile@qq.com>
    
    gpg> addkey
    请选择您要使用的密钥种类:
       (3) DSA (仅用于签名)
       (4) RSA (仅用于签名)
       (5) ElGamal (仅用于加密)
       (6) RSA (仅用于加密)
       (7) DSA (自定义用途)
       (8) RSA (自定义用途)
      (10) ECC (sign only)
      (11) ECC (set your own capabilities)
      (12) ECC (encrypt only)
      (13) Existing key
    您的选择? 8
    
    RSA 密钥可能的操作: 签名 加密 认证 
    目前允许的操作: 签名 加密 
    
       (S) 选择是否用于签名
       (E) 选择是否用于加密
       (A) 选择是否用于认证
       (Q) 已完成
    
    您的选择? s
    
    RSA 密钥可能的操作: 签名 加密 认证 
    目前允许的操作: 加密 
    
       (S) 选择是否用于签名
       (E) 选择是否用于加密
       (A) 选择是否用于认证
       (Q) 已完成
    
    您的选择? e
    
    RSA 密钥可能的操作: 签名 加密 认证 
    目前允许的操作: 
    
       (S) 选择是否用于签名
       (E) 选择是否用于加密
       (A) 选择是否用于认证
       (Q) 已完成
    
    您的选择? a
    
    RSA 密钥可能的操作: 签名 加密 认证 
    目前允许的操作: 认证 
    
       (S) 选择是否用于签名
       (E) 选择是否用于加密
       (A) 选择是否用于认证
       (Q) 已完成
    
    您的选择? q
    RSA 密钥长度应在 1024 位与 4096 位之间。
    您想要用多大的密钥尺寸?(3072) 
    您所要求的密钥尺寸是 3072 位
    请设定这把密钥的有效期限。
             0 = 密钥永不过期
          <n>  = 密钥在 n 天后过期
          <n>w = 密钥在 n 周后过期
          <n>m = 密钥在 n 月后过期
          <n>y = 密钥在 n 年后过期
    密钥的有效期限是?(0) 1
    密钥于 2020年05月04日 星期一 19时59分46秒 CST 过期
    以上正确吗?(y/n) y
    真的要建立吗?(y/N) y
    我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
    鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
    
    sec  rsa4096/0x2954C91DEAE3C032
         创建于:2020-05-03  有效至:2020-05-04  可用于:C   
         信任度:绝对        有效性:绝对
    ssb  rsa3072/0x6E3823DE57F89766
         创建于:2020-05-03  有效至:2020-05-04  可用于:S   
    ssb  rsa3072/0x2CA24BFA9B038328
         创建于:2020-05-03  有效至:2020-05-04  可用于:A   
    [ 绝对 ] (1). usmile <usmile@qq.com>
    
    gpg> save
    
    

    查看是否创建成功

    lfp@legion:~$ gpg --homedir ~/.gnupg-test -K
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    /home/lfp/.gnupg-test/pubring.kbx
    ---------------------------------
    sec   rsa4096/0x2954C91DEAE3C032 2020-05-03 [C] [有效至:2020-05-04]
          密钥指纹 = 76D1 39A8 F917 2972 195C  F33C 2954 C91D EAE3 C032
    uid                   [ 绝对 ] usmile <usmile@qq.com>
    ssb   rsa3072/0x6E3823DE57F89766 2020-05-03 [S] [有效至:2020-05-04]
    ssb   rsa3072/0x2CA24BFA9B038328 2020-05-03 [A] [有效至:2020-05-04]
    
    

    添加uid

    lfp@legion:~$ gpg --homedir ~/.gnupg-test --expert --edit-key 0x2954C91DEAE3C032
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    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.
    
    私钥可用。
    
    sec  rsa4096/0x2954C91DEAE3C032
         创建于:2020-05-03  有效至:2020-05-04  可用于:C   
         信任度:绝对        有效性:绝对
    ssb  rsa3072/0x6E3823DE57F89766
         创建于:2020-05-03  有效至:2020-05-04  可用于:S   
    ssb  rsa3072/0x2CA24BFA9B038328
         创建于:2020-05-03  有效至:2020-05-04  可用于:A   
    [ 绝对 ] (1). usmile <usmile@qq.com>
    
    gpg> adduid
    真实姓名: usmile
    电子邮件地址: usmile@wx.com
    注释: 
    您选定了这个用户标识:
        “usmile <usmile@wx.com>”
    
    更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? o
    
    sec  rsa4096/0x2954C91DEAE3C032
         创建于:2020-05-03  有效至:2020-05-04  可用于:C   
         信任度:绝对        有效性:绝对
    ssb  rsa3072/0x6E3823DE57F89766
         创建于:2020-05-03  有效至:2020-05-04  可用于:S   
    ssb  rsa3072/0x2CA24BFA9B038328
         创建于:2020-05-03  有效至:2020-05-04  可用于:A   
    [ 绝对 ] (1)  usmile <usmile@qq.com>
    [ 未知 ] (2). usmile <usmile@wx.com>
    
    # 选择上方 [未知] uid 的编号
    gpg> uid 2
    
    sec  rsa4096/0x2954C91DEAE3C032
         创建于:2020-05-03  有效至:2020-05-04  可用于:C   
         信任度:绝对        有效性:绝对
    ssb  rsa3072/0x6E3823DE57F89766
         创建于:2020-05-03  有效至:2020-05-04  可用于:S   
    ssb  rsa3072/0x2CA24BFA9B038328
         创建于:2020-05-03  有效至:2020-05-04  可用于:A   
    [ 绝对 ] (1)  usmile <usmile@qq.com>
    [ 未知 ] (2)* usmile <usmile@wx.com>
    
    gpg> primary
    
    sec  rsa4096/0x2954C91DEAE3C032
         创建于:2020-05-03  有效至:2020-05-04  可用于:C   
         信任度:绝对        有效性:绝对
    ssb  rsa3072/0x6E3823DE57F89766
         创建于:2020-05-03  有效至:2020-05-04  可用于:S   
    ssb  rsa3072/0x2CA24BFA9B038328
         创建于:2020-05-03  有效至:2020-05-04  可用于:A   
    [ 绝对 ] (1)  usmile <usmile@qq.com>
    [ 未知 ] (2)* usmile <usmile@wx.com>
    
    gpg> save
    
    

    查看是否添加成功

    lfp@legion:~$ gpg --homedir ~/.gnupg-test -K
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    /home/lfp/.gnupg-test/pubring.kbx
    ---------------------------------
    sec   rsa4096/0x2954C91DEAE3C032 2020-05-03 [C] [有效至:2020-05-04]
          密钥指纹 = 76D1 39A8 F917 2972 195C  F33C 2954 C91D EAE3 C032
    uid                   [ 绝对 ] usmile <usmile@wx.com>
    uid                   [ 绝对 ] usmile <usmile@qq.com>
    ssb   rsa3072/0x6E3823DE57F89766 2020-05-03 [S] [有效至:2020-05-04]
    ssb   rsa3072/0x2CA24BFA9B038328 2020-05-03 [A] [有效至:2020-05-04]
    
    

    删除密钥

    删除整个密钥,而非子密钥

    lfp@legion:~$ gpg --homedir ~/.gnupg-test/ -K
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    /home/lfp/.gnupg-test/pubring.kbx
    ---------------------------------
    sec   rsa4096/0x2954C91DEAE3C032 2020-05-03 [C] [已过期:2020-05-04]
          密钥指纹 = 76D1 39A8 F917 2972 195C  F33C 2954 C91D EAE3 C032
    uid                   [已过期] usmile <usmile@wx.com>
    uid                   [已过期] usmile <usmile@qq.com>
    
    sec   rsa4096/0x70105702D00EB8F4 2020-05-04 [C] [已吊销:2020-05-04]
          密钥指纹 = 0B19 E909 EB7D 0060 6615  693F 7010 5702 D00E B8F4
    uid                   [已吊销] usmile <usmile@qq.com>
    # 删除密钥
    lfp@legion:~$ gpg --homedir ~/.gnupg-test/ --delete-secret-and-public-key 0x70105702D00EB8F4
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    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.
    
    
    sec  rsa4096/0x70105702D00EB8F4 2020-05-04 usmile <usmile@qq.com>
    
    要从钥匙环里删除这把密钥吗?(y/N) y
    这是一把私钥!――真的要删除吗?(y/N) y
    pub  rsa4096/0x70105702D00EB8F4 2020-05-04 usmile <usmile@qq.com>
    
    要从钥匙环里删除这把密钥吗?(y/N) y
    # 已经删除
    lfp@legion:~$ gpg --homedir ~/.gnupg-test/ -K
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    /home/lfp/.gnupg-test/pubring.kbx
    ---------------------------------
    sec   rsa4096/0x2954C91DEAE3C032 2020-05-03 [C] [已过期:2020-05-04]
          密钥指纹 = 76D1 39A8 F917 2972 195C  F33C 2954 C91D EAE3 C032
    uid                   [已过期] usmile <usmile@wx.com>
    uid                   [已过期] usmile <usmile@qq.com>
    
    
    

    公私钥单独删除

    # 无法先删除公钥
    lfp@legion:~$ gpg --homedir ~/.gnupg-test/ --delete-keys 0x2954C91DEAE3C032
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    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.
    
    gpg: 公钥“0x2954C91DEAE3C032”有对应的私钥!
    gpg: 请先使用“--delete-secret-keys”选项来删除它。
    
    # 先删除私钥部分才能删除公钥部分
    lfp@legion:~$ gpg --homedir ~/.gnupg-test/ --delete-secret-keys 0x2954C91DEAE3C032
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    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.
    
    
    sec  rsa4096/0x2954C91DEAE3C032 2020-05-03 usmile <usmile@wx.com>
    
    要从钥匙环里删除这把密钥吗?(y/N) y
    这是一把私钥!――真的要删除吗?(y/N) y
    
    

    加密、解密

    lfp@legion:~/bin$ gpg -k
    /home/lfp/.gnupg/pubring.kbx
    ----------------------------
    pub   rsa3072/0x16A3B99FBAC538AE 2020-05-01 [SC] [已吊销:2020-05-04]
          密钥指纹 = 1256 45C3 0AAB 72BB D113  4A5F 16A3 B99F BAC5 38AE
    uid                   [已吊销] lfp1024 <lfp1024@126.com>
    
    pub   rsa4096/0x92C4D0C89EAA7333 2020-05-04 [SC] [有效至:2020-05-05]
          密钥指纹 = C95B 86BC 7919 F706 8CD6  2B08 92C4 D0C8 9EAA 7333
    uid                   [ 绝对 ] usmile <usmile@qq.com>
    sub   rsa4096/0x918087E1E6101F9D 2020-05-04 [E] [有效至:2020-05-05]
    
    lfp@legion:~/bin$ gpg --recipient 0x918087E1E6101F9D --output ~/bin/test.en.txt --encrypt test.txt
    lfp@legion:~/bin$ gpg --decrypt test.en.txt --output test.de.txt
    gpg: Note: '--output' is not considered an option
    usage: gpg [options] --decrypt [filename]
    lfp@legion:~/bin$ gpg --output test.de.txt --decrypt test.en.txt
    gpg: 由 4096 位的 RSA 密钥加密,钥匙号为 0x918087E1E6101F9D、生成于 2020-05-04
          “usmile <usmile@qq.com>”
    
    

    签名

    通过默认配置生成的主密钥具有[SC]两种功能,如果同时存在一个具有[S]功能的子密钥,则会通过子密钥去签名

    实际是通过密钥的私钥部分去签名,然后通过该密钥的公钥部分去验证签名

    # 在当前目录生成一份包含文件内容的签名文件 sign-test.Release.gpg 
    lfp@legion:~$ gpg --homedir ~/.gnupg-test --sign sign-test.Release 
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    
    # 在当前目录生成一份包含文件内容的签名文件 sign-test.Release.asc
    lfp@legion:~$ gpg --homedir ~/.gnupg-test --clearsign sign-test.Release
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    
    # 在当前目录生成一份【不包含】文件内容的签名文件 sign-test.Release.sig
    lfp@legion:~$ gpg --homedir ~/.gnupg-test --detach-sign sign-test.Release
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    
    # 在当前目录生成一份【不包含】文件内容的签名文件 sign-test.Release.asc
    lfp@legion:~$ gpg --homedir ~/.gnupg-test --detach-sign --armor sign-test.Release
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    
    
    # 可以通过 --output 指定路径及文件名,但是需要注意参数的位置,要放在 --sign 之前
    lfp@legion:~$ gpg --homedir ~/.gnupg-test --output ~/bin/sign-test.Release.gpg --sign sign-test.Release
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    lfp@legion:~$ gpg --homedir ~/.gnupg-test --output ~/bin/sign-test.Release.asc --clearsign sign-test.Release
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    
    

    验证

    1. 通过 gpgv 工具
    2. 通过 gpg
    lfp@legion:~$ gpg --homedir ~/.gnupg-test -k
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    /home/lfp/.gnupg-test/pubring.kbx
    ---------------------------------
    pub   rsa4096/0x2954C91DEAE3C032 2020-05-03 [C] [有效至:2020-05-04]
          密钥指纹 = 76D1 39A8 F917 2972 195C  F33C 2954 C91D EAE3 C032
    uid                   [ 绝对 ] usmile <usmile@wx.com>
    uid                   [ 绝对 ] usmile <usmile@qq.com>
    sub   rsa3072/0x6E3823DE57F89766 2020-05-03 [S] [有效至:2020-05-04]
    sub   rsa3072/0x2CA24BFA9B038328 2020-05-03 [A] [有效至:2020-05-04]
    
    # gpgv 需要通过 --keyring 指定密钥环
    lfp@legion:~$ gpgv --keyring ~/.gnupg-test/pubring.kbx sign-test.Release.gpg 
    gpgv: 签名建立于 2020年05月04日 星期一 19时01分58秒 CST
    #  后16位即使用的密钥ID 0x6E3823DE57F89766
    gpgv:                使用 RSA 密钥 92E43802C92A69A4F7B069E86E3823DE57F89766
    gpgv: 完好的签名,来自于“usmile <usmile@wx.com>”
    # 因为有两个uid
    gpgv:                 亦即“usmile <usmile@qq.com>”
    
    # gpg 只需要指出homedir 即可
    # 通过gpg验证可以检查出密钥是否过期
    lfp@legion:~$ gpg --homedir ~/.gnupg-test/ --verify sign-test.Release.gpg 
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    gpg: 签名建立于 2020年05月04日 星期一 19时01分58秒 CST
    gpg:                使用 RSA 密钥 92E43802C92A69A4F7B069E86E3823DE57F89766
    gpg: 完好的签名,来自于“usmile <usmile@wx.com>” [已过期]
    gpg:                 亦即“usmile <usmile@qq.com>” [已过期]
    gpg: 注意:这把密钥已经过期了!
    主钥指纹: 76D1 39A8 F917 2972 195C  F33C 2954 C91D EAE3 C032
         子钥指纹: 92E4 3802 C92A 69A4 F7B0  69E8 6E38 23DE 57F8 9766
    ########################################################################
    
    lfp@legion:~/.gnupg$ gpg -k
    /home/lfp/.gnupg/pubring.kbx
    ----------------------------
    pub   rsa3072/0x16A3B99FBAC538AE 2020-05-01 [SC] [已吊销:2020-05-04]
          密钥指纹 = 1256 45C3 0AAB 72BB D113  4A5F 16A3 B99F BAC5 38AE
    uid                   [已吊销] lfp1024 <lfp1024@126.com>
    # 无法判定密钥的性质
    lfp@legion:~/.gnupg$ gpgv --keyring ~/.gnupg/pubring.kbx ~/bin/test.txt.gpg 
    gpgv: 签名建立于 2020年05月04日 星期一 19时17分25秒 CST
    gpgv:                使用 RSA 密钥 3142022C68CD0B034DBAA5A0CF8C3097514C5331
    gpgv: 完好的签名,来自于“lfp1024 <lfp1024@126.com>”
    
    # 通过gpg验证可以检查出密钥是否被吊销
    lfp@legion:~/.gnupg$ gpg --verify ~/bin/test.txt.gpg 
    gpg: 签名建立于 2020年05月04日 星期一 19时17分25秒 CST
    gpg:                使用 RSA 密钥 3142022C68CD0B034DBAA5A0CF8C3097514C5331
    gpg: 完好的签名,来自于“lfp1024 <lfp1024@126.com>” [绝对]
    gpg: 警告:这把密钥已经被它的持有者吊销了!
    gpg:          这表明这个签名有可能是伪造的。
    gpg: 吊销原因: 密钥不再使用
    主钥指纹: 1256 45C3 0AAB 72BB D113  4A5F 16A3 B99F BAC5 38AE
         子钥指纹: 3142 022C 68CD 0B03 4DBA  A5A0 CF8C 3097 514C 5331
    
    

    通过gpg --keyring验证,测试不行

    # 测试发现,不能正确验证,无法识别密钥
    lfp@legion:~/.gnupg-test$ gpg --keyring ~/.gnupg-test/pubring.kbx --no-default-keyring --verify ~/sign-test.Release.asc
    gpg: assuming signed data in '/home/lfp/sign-test.Release'
    gpg: 签名建立于 2020年05月04日 星期一 21时45分27秒 CST
    gpg:                使用 RSA 密钥 5C886AA3B13C8CD76A453E6517B875E5EB1FA9D1
    gpg: 完好的签名,来自于“usmile <usmile@qq.com>” [未知]
    gpg: 警告:这把密钥未经受信任的签名认证!
    gpg:          没有证据表明这个签名属于它所声称的持有者。
    主钥指纹: 0B19 E909 EB7D 0060 6615  693F 7010 5702 D00E B8F4
         子钥指纹: 5C88 6AA3 B13C 8CD7 6A45  3E65 17B8 75E5 EB1F A9D1
         
    lfp@legion:~/.gnupg-test$ gpg --homedir ~/.gnupg-test/ --verify ~/sign-test.Release.asc
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    gpg: assuming signed data in '/home/lfp/sign-test.Release'
    gpg: 签名建立于 2020年05月04日 星期一 21时45分27秒 CST
    gpg:                使用 RSA 密钥 5C886AA3B13C8CD76A453E6517B875E5EB1FA9D1
    gpg: 完好的签名,来自于“usmile <usmile@qq.com>” [绝对]
    主钥指纹: 0B19 E909 EB7D 0060 6615  693F 7010 5702 D00E B8F4
         子钥指纹: 5C88 6AA3 B13C 8CD7 6A45  3E65 17B8 75E5 EB1F A9D1
    
    

    吊销整个密钥

    生成吊销证书

    # 生成吊销证书
    # 通过 --output 配置项指定生成文件目录及名称,注意顺序在前
    lfp@legion:~$ gpg --homedir ~/.gnupg-test/ --output ~/.gnupg-test/rev.asc --gen-revoke 0x70105702D00EB8F4
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    
    sec  rsa4096/0x70105702D00EB8F4 2020-05-04 usmile <usmile@qq.com>
    
    要为这把密钥建立一份吊销证书吗?(y/N) y
    请选择吊销的原因:
      0 = 未指定原因
      1 = 密钥已泄漏
      2 = 密钥被替换
      3 = 密钥不再使用
      Q = 取消
    (也许您会想要在这里选择 1)
    您的决定是什么? 3
    请输入描述(可选);以空白行结束:
    > 
    吊销原因:密钥不再使用
    (不给定描述)
    这样可以吗? (y/N) y
    已强行使用 ASCII 封装过的输出。
    已建立吊销证书。
    
    请把这个文件转移到一个可隐藏起来的介质(如软盘)上;如果坏人能够取得这
    份证书的话,那么他就能让您的密钥无法继续使用。把这份凭证打印出来再藏
    到安全的地方也是很好的方法,以免您的保存媒体损毁而无法读取。但是千万
    小心:您的机器上的打印系统可能会在打印过程中把这些数据临时在某个其他
    人也能够看得到的地方!
    
    

    导入吊销证书

    # 导入并吊销整个密钥
    lfp@legion:~$ gpg --homedir ~/.gnupg-test/ --import ~/.gnupg-test/rev.asc 
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    gpg: 密钥 0x70105702D00EB8F4:“usmile <usmile@qq.com>”吊销证书已被导入
    gpg: 合计被处理的数量:1
    gpg:    新的密钥吊销:1
    gpg: marginals needed: 3  completes needed: 1  trust model: pgp
    gpg: 深度:0 有效性:  2 已签名:  0 信任度:0-,0q,0n,0m,0f,2u
    gpg: 下次信任度数据库检查将于 2020-05-06 进行
    
    使用预先生成的吊销证书
    lfp@legion:~$ gpg -k
    /home/lfp/.gnupg/pubring.kbx
    ----------------------------
    pub   rsa3072/0x16A3B99FBAC538AE 2020-05-01 [SC] [已吊销:2020-05-04]
          密钥指纹 = 1256 45C3 0AAB 72BB D113  4A5F 16A3 B99F BAC5 38AE
    uid                   [已吊销] lfp1024 <lfp1024@126.com>
    
    pub   rsa4096/0x92C4D0C89EAA7333 2020-05-04 [SC] [有效至:2020-05-05]
          密钥指纹 = C95B 86BC 7919 F706 8CD6  2B08 92C4 D0C8 9EAA 7333
    uid                   [ 绝对 ] usmile <usmile@qq.com>
    sub   rsa4096/0x918087E1E6101F9D 2020-05-04 [E] [有效至:2020-05-05]
    # 找不到。。。
    lfp@legion:~$ gpg --import ~/.gnupg/openpgp-revocs.d/C95B86BC7919F7068CD62B0892C4D0C89EAA7333.rev 
    gpg: 找不到有效的 OpenPGP 数据。
    gpg: 合计被处理的数量:0
    
    

    上传至公钥服务器

    # Search your key on the key-server
    gpg --keyserver <服务器地址> --search-keys <key-ID>
    # Send the revoked key to the key-server
    gpg --keyserver <服务器地址> --send-keys <key-ID>
    

    https://superuser.com/questions/1526283/how-to-revoke-a-gpg-key-and-upload-in-gpg-server

    吊销子密钥

    吊销某个uid同理,用uid 1选定某个uid,通过revuid吊销

    -delkey 只删除密钥的公共部分,如果已经上传到公钥服务器,则需要使用-revkey吊销并上传公钥服务器

    https://www.gnupg.org/gph/en/manual/c235.html

    lfp@legion:~/.gnupg-test$ gpg --homedir ~/.gnupg-test/ --expert --edit-key 0x70105702D00EB8F4
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    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.
    
    私钥可用。
    
    sec  rsa4096/0x70105702D00EB8F4
         创建于:2020-05-04  有效至:2020-05-06  可用于:C   
         信任度:绝对        有效性:绝对
    ssb  rsa3072/0x17B875E5EB1FA9D1
         创建于:2020-05-04  有效至:2020-05-06  可用于:S   
    [ 绝对 ] (1). usmile <usmile@qq.com>
    
    # 选定某个子密钥,下标从1开始
    gpg> key 1
    
    sec  rsa4096/0x70105702D00EB8F4
         创建于:2020-05-04  有效至:2020-05-06  可用于:C   
         信任度:绝对        有效性:绝对
    # 选定该子密钥
    ssb* rsa3072/0x17B875E5EB1FA9D1
         创建于:2020-05-04  有效至:2020-05-06  可用于:S   
    [ 绝对 ] (1). usmile <usmile@qq.com>
    
    gpg> revkey
    您真的要吊销这把子钥吗?(y/N) y
    请选择吊销的原因:
      0 = 未指定原因
      1 = 密钥已泄漏
      2 = 密钥被替换
      3 = 密钥不再使用
      Q = 取消
    您的决定是什么? 3
    请输入描述(可选);以空白行结束:
    > 
    吊销原因:密钥不再使用
    (不给定描述)
    这样可以吗? (y/N) y
    
    sec  rsa4096/0x70105702D00EB8F4
         创建于:2020-05-04  有效至:2020-05-06  可用于:C   
         信任度:绝对        有效性:绝对
    The following key was revoked on 2020-05-04 by RSA key 0x70105702D00EB8F4 usmile <usmile@qq.com>
    ssb  rsa3072/0x17B875E5EB1FA9D1
         创建于:2020-05-04  已吊销:2020-05-04  可用于:S   
    [ 绝对 ] (1). usmile <usmile@qq.com>
    
    gpg>  save
    
    

    apt-key测试

    测试apt-key保存的密钥

    终端执行apt-key list的时候会列出apt密钥环中保存的密钥,包括/etc/apt/trusted.gpg以及/etc/apt/trusted.gpg.d/中的密钥
    发现公钥具有[SC]功能,而[C]功能具有认证子密钥的能力,怎么能公开呢?测试如下

    查看第三方密钥

    lfp@legion:/etc/apt/trusted.gpg.d$ gpg sogou-archive-keyring.gpg 
    gpg: WARNING: no command supplied.  Trying to guess what you mean ...
    pub   rsa4096/0xD259B7555E1D3C58 2014-04-09 [SC]
          密钥指纹 = 6CE3 5A4E BAB6 7609 4476  BE7C D259 B755 5E1D 3C58
    uid                             Ubuntu Kylin Archive Automatic Signing Key <council@ubuntukylin.com>
    sub   rsa4096/0xFED969A4DF6E30B5 2014-04-09 [E]
    

    导出到文件

    lfp@legion:~$ apt-key export 0xD259B7555E1D3C58 > ~/sogou-pub.asc
    Warning: apt-key output should not be parsed (stdout is not a terminal)
    

    导入本地gpg密钥环

    lfp@legion:~$ gpg --homedir ~/.gnupg-test --import ~/sogou-pub.asc 
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    gpg: 密钥 0xD259B7555E1D3C58:公钥“Ubuntu Kylin Archive Automatic Signing Key <council@ubuntukylin.com>”已导入
    gpg: 合计被处理的数量:1
    gpg:               已导入:1
    # 查看
    lfp@legion:~$ gpg --homedir ~/.gnupg-test -k
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    /home/lfp/.gnupg-test/pubring.kbx
    ---------------------------------
    pub   rsa4096/0x5AF8B6B68CC7F785 2020-05-05 [SC]
          密钥指纹 = 0298 F65F 32F5 A7CA D764  A941 5AF8 B6B6 8CC7 F785
    uid                   [ 绝对 ] usmile <usmile@qq.com>
    sub   rsa4096/0x9B690269F3C16E7B 2020-05-05 [E]
    # 导入成功
    pub   rsa4096/0xD259B7555E1D3C58 2014-04-09 [SC]
          密钥指纹 = 6CE3 5A4E BAB6 7609 4476  BE7C D259 B755 5E1D 3C58
    uid                   [ 未知 ] Ubuntu Kylin Archive Automatic Signing Key <council@ubuntukylin.com>
    sub   rsa4096/0xFED969A4DF6E30B5 2014-04-09 [E]
    

    编辑该密钥

    发现虽然公钥显示[SC],但是缺少私钥部分,没有认证[C]权限

    lfp@legion:~$ gpg --homedir ~/.gnupg-test --expert --edit-key 0xD259B7555E1D3C58
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    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.
    
    
    pub  rsa4096/0xD259B7555E1D3C58
         创建于:2014-04-09  有效至:永不过期       可用于:SC  
         信任度:未知        有效性:未知
    sub  rsa4096/0xFED969A4DF6E30B5
         创建于:2014-04-09  有效至:永不过期       可用于:E   
    [ 未知 ] (1). Ubuntu Kylin Archive Automatic Signing Key <council@ubuntukylin.com>
    
    gpg> addkey
    要有私钥才能这么做。
    
    gpg> adduid
    要有私钥才能这么做。
    
    gpg> revkey
    要有私钥才能这么做。
    
    gpg> expire
    要有私钥才能这么做。
    
    gpg> quit
    

    测试子密钥过期/吊销后的验证功能

    因为apt管理的本地密钥过期之后出现无法验证签名的情况

    本地测试无法通过--edit-key expire立刻将子密钥过期,所以测试将一把子密钥吊销

    步骤

    1. 使用默认子密钥签名一个文件

      同时生成两个具有[S]功能的子密钥

      测试无法通过'--default-key' 指定使用哪个密钥签名

      默认选择最新生成的具有[S]功能的有效密钥签名

    2. 将该子密钥吊销

    3. 用具有[S]功能的其他子密钥验证

    结果

    # 此时仍有一把具有[S]功能的子密钥
    lfp@legion:~$ gpg --homedir ~/.gnupg-test --verify ~/a.txt.asc
    gpg: WARNING: unsafe permissions on homedir '/home/lfp/.gnupg-test'
    gpg: 签名建立于 2020年05月07日 星期四 18时43分49秒 CST
    gpg:                使用 RSA 密钥 200AA10D5E17D1CAD1FF9B1FCCA5416788D7F49C
    gpg: 完好的签名,来自于“usmile <usmile@qq.com>” [绝对]
    gpg: 警告:这把子钥已经被它的持有者吊销了!
    gpg: 吊销原因: 密钥不再使用
    主钥指纹: FABD 2A75 6CF5 983C 9655  7FA0 0FC1 D26E D395 4622
         子钥指纹: 200A A10D 5E17 D1CA D1FF  9B1F CCA5 4167 88D7 F49C
    gpg: WARNING: not a detached signature; file '/home/lfp/a.txt' was NOT verified!
    
    

    gpgv

    gpgv 是一个 OpenPGP 签名验证工具,没有配置文件,只有简单的选项

    gpgv 默认所有的密钥都是可信赖的,不会检查其是否过期或被吊销

    This program is actually a stripped-down version of gpg which is only able to check
    signatures. It is somewhat smaller than the fully-blown gpg and uses a different (and
    simpler) way to check that the public keys used to make the signature are valid. There are
    no configuration files and only a few options are implemented.
    gpgv assumes that all keys in the keyring are trustworthy. That does also mean that it
    does not check for expired or revoked keys

    选项

    -v

    显示更多验证信息

    --keyring file

    • file 可以是 trustedkeys.kbx 或 trustedkeys.gpg

    指定用来验证的密钥环

    格式

    gpgv pgpfile

    • pgpfile 包含数据的签名文件

    用来验证包含数据的签名

    lfp@legion:~$ gpgv --keyring [~/.gnupg-test/pubring.kbx] [sign-test.Release.gpg ]
    

    gpgv sigfile [datafile]

    • sigfile 签名文件

    • datafile 数据文件,如果不指定,则会把 sigfile 后缀(.asc .sig .sign)去掉,当做数据文件

      例如谷歌

      签名文件 dl.google.com_linux_chrome_deb_dists_stable_Release.gpg

      数据文件 dl.google.com_linux_chrome_deb_dists_stable_Release

    用来验证不包含数据的签名(签名文件和数据文件分离)

    lfp@legion:/var/lib/apt/lists$ gpgv --keyring [/etc/apt/trusted.gpg ] [dl.google.com_linux_chrome_deb_dists_stable_Release.gpg] [dl.google.com_linux_chrome_deb_dists_stable_Release]
    

    其他用途

    git

    对commit进行签名

    -----END-----
    有不正确的地方,欢迎留言指正,谢谢大佬!

  • 相关阅读:
    Django admin的一些有用定制
    django后台中如何在result_list内优雅的显示及使用过滤器?
    DataFrame 的函数
    pandas的替换和部分替换(replace)
    HTML5中的Web Notification桌面右下角通知功能的实现
    sqlalchemy 实现select for update
    SQLAlchemy 使用经验 (查询 事务 锁表)
    concat()
    某数据防泄漏 越权修改管理员密码
    齐治堡垒机 远程命令执行漏洞[CNVD-2019-20835]
  • 原文地址:https://www.cnblogs.com/usmile/p/12873604.html
Copyright © 2020-2023  润新知