GPG 签名

GPG 生成公钥并上传,对发布到Maven中央仓库的插件进行签名。

Real name: Renlm
Email address: renlmer@163.com
Comment: Java Code Sign
Gpg passphrase:123654
-----------------------------------
    pub   rsa4096/CDBF34099037F231 2020-12-31 [SC]
        407DAC7D4AD8CF51F52E75DCCDBF34099037F231
    uid                 [ultimate] Renlm (Java Code Sign) <renlmer@163.com>
    sub   rsa4096/8BF4CED7917C5B35 2020-12-31 [E]
    sub   rsa3072/55A00601A8D96AF7 2020-12-31 [S] [expires: 2022-12-31]
    sub   rsa4096/7E6EC2D46B86A3C6 2020-12-31 [S]
-----------------------------------
    sec   rsa4096/9037F231 2020-12-31 [SC]
        407DAC7D4AD8CF51F52E75DCCDBF34099037F231
    uid         [ultimate] Renlm (Java Code Sign) <renlmer@163.com>
    ssb   rsa4096/917C5B35 2020-12-31 [E]
    ssb   rsa3072/A8D96AF7 2020-12-31 [S] [expires: 2022-12-31]
    ssb   rsa4096/6B86A3C6 2020-12-31 [S]
-----------------------------------

生成主密钥

    $ gpg --full-gen-key
        主密钥设置永不过期
        尺寸选最大4096
        记住密码

创建子密钥[S]

    $ gpg --edit-key CDBF34099037F231
    gpg> addKey
    gpg> save

    创建两个签名子秘钥[S],一个2年有效期,一个无限期

    列出公钥:
        $ gpg -k --keyid-format LONG
        /c/Users/renlm-a/.gnupg/pubring.kbx
        -----------------------------------
        pub   rsa4096/CDBF34099037F231 2020-12-31 [SC]
            407DAC7D4AD8CF51F52E75DCCDBF34099037F231
        uid                 [ultimate] Renlm (Java Code Sign) <renlmer@163.com>
        sub   rsa4096/8BF4CED7917C5B35 2020-12-31 [E]
        sub   rsa3072/55A00601A8D96AF7 2020-12-31 [S] [expires: 2022-12-31]
        sub   rsa4096/7E6EC2D46B86A3C6 2020-12-31 [S]

    列出私钥:
        $ gpg -K --keyid-format SHORT
        /c/Users/renlm-a/.gnupg/pubring.kbx
        -----------------------------------
        sec   rsa4096/9037F231 2020-12-31 [SC]
            407DAC7D4AD8CF51F52E75DCCDBF34099037F231
        uid         [ultimate] Renlm (Java Code Sign) <renlmer@163.com>
        ssb   rsa4096/917C5B35 2020-12-31 [E]
        ssb   rsa3072/A8D96AF7 2020-12-31 [S] [expires: 2022-12-31]
        ssb   rsa4096/6B86A3C6 2020-12-31 [S]

    pub:主密钥-公钥
    sub:子秘钥-公钥
    sec:主密钥-私钥
    ssb:子秘钥-私钥

        最重要的主密钥显示:SC("sign"&"certify",代表可以签名和认证其它密钥)
        第一个副密钥显示:E("encrypt",加密)
        第二个副密钥显示:S("sign",签名)

        特性:
            在key id 之后输入!,将强制使用该key
            当多个密钥同时具有某个功能的时候,优先使用最新未吊销的密钥
            公钥、私钥的keyID是相同的,一起被创建,每个公钥对应一个私钥
            一个主密钥可以绑定多个子密钥,平时加密解密使用的都是子密钥,主密钥只有在某些特定的情况下才使用的,比如新建一个子密钥,撤销废除一个子密钥,签名认证别人的密钥等
            正确的使用姿势是导出主私钥备份,删除本机的主私钥,本机只保留子私钥用于日常操作,哪怕子密钥被人盗取,也不影响主密钥,尽最大程度保护你的主密钥

上传GPG公钥

    $ gpg --keyserver hkp://keyserver.ubuntu.com --send-keys CDBF34099037F231

    网站查询:
        查询条件:
            0x + PublicKey

        查询地址:
            https://keyserver.ubuntu.com
                同步可能很慢,如果查不到,过段时间再看
            
            同步较慢,可指定公钥服务器查询:
                $ gpg --keyserver hkp://keyserver.ubuntu.com --search-keys CDBF34099037F231
                gpg: data source: http://162.213.33.9:11371
                (1)     Renlm (Java Code Sign) <renlmer@163.com>
                          4096 bit RSA key CDBF34099037F231, created: 2020-12-31
                Keys 1-1 of 1 for "CDBF34099037F231".  Enter number(s), N)ext, or Q)uit > Q

导出保存

    导出指定密钥的私钥部分(master + subkeys):
        $ gpg --armor --output MyPlugin.pub.asc --export-secret-keys CDBF34099037F231
    
    导出子密钥的私钥部分:
        $ gpg --armor --output MyPlugin.8BF4CED7917C5B35.pub.asc --export-secret-subkeys 8BF4CED7917C5B35!
        $ gpg --armor --output MyPlugin.55A00601A8D96AF7.pub.asc --export-secret-subkeys 55A00601A8D96AF7!
        $ gpg --armor --output MyPlugin.7E6EC2D46B86A3C6.pub.asc --export-secret-subkeys 7E6EC2D46B86A3C6!

    删除密钥:
        $ gpg --delete-secret-and-public-key CDBF34099037F231

导入子秘钥

    $ gpg --import MyPlugin.55A00601A8D96AF7.pub.asc

    查看:
        $ gpg -K --keyid-format LONG
        /c/Users/renlm-a/.gnupg/pubring.kbx
        -----------------------------------
        sec#  rsa4096/CDBF34099037F231 2020-12-31 [SC]
            407DAC7D4AD8CF51F52E75DCCDBF34099037F231
        uid                 [ unknown] Renlm (Java Code Sign) <renlmer@163.com>
        ssb   rsa3072/55A00601A8D96AF7 2020-12-31 [S] [expires: 2022-12-31]

            重要的提示,sec#,这里有一个符号#,标识主私钥不在这个电脑上(它应该已经被放在一个极其、极端、极度安全的地方了)。

            导入的秘钥会显示 [unknown] 状态,使用会报警告:
                gpg: WARNING: This key is not certified with a trusted signature!
            可手动修改证书状态为 [ultimate]
                $ gpg --edit-key CDBF34099037F231
                gpg> trust
                gpg> save

                再次查看即可看到状态变更

导出公钥

    强制指定(加!后缀,否则会导出全部):
        $ gpg --armor --output MyPlugin.55A00601A8D96AF7.pub --export 55A00601A8D96AF7!

导入公钥

    直接导入:
        $ gpg --import MyPlugin.55A00601A8D96AF7.pub
    公钥服务器下载(不完全可信):
        $ gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 55A00601A8D96AF7

签名验证

    签名:
        gpg --output xxx.txt.sig --detach-sign xxx.txt

    验证:
        gpg --verify xxx.txt.sig xxx.txt

吊销子密钥

    导入主密钥(master + subkeys):
        $ gpg --import MyPlugin.pub.asc
        主密钥主要用于生成新的子秘钥,吊销子秘钥

    本地吊销:
        $ gpg --edit-key CDBF34099037F231
        gpg> key 1

        sec  rsa4096/CDBF34099037F231
            created: 2020-12-31  expires: never       usage: SC
            trust: ultimate      validity: ultimate
        ssb* rsa3072/55A00601A8D96AF7
            created: 2020-12-31  expires: 2022-12-31  usage: S
        ssb  rsa4096/8BF4CED7917C5B35
            created: 2020-12-31  expires: never       usage: E
        ssb  rsa4096/7E6EC2D46B86A3C6
            created: 2020-12-31  expires: never       usage: S
        [ultimate] (1). Renlm (Java Code Sign) <renlmer@163.com>

        gpg> revkey
        gpg> save

    再次验证签名:
        $ gpg --verify xxx.txt.sig xxx.txt
        gpg: Signature made 2020年12月31日 10:28:22
        gpg:                using RSA key B00076C64CA8F3966A20D40155A00601A8D96AF7
        gpg: Good signature from "Renlm (Java Code Sign) <renlmer@163.com>" [ultimate]
        gpg: WARNING: This subkey has been revoked by its owner!
        gpg: reason for revocation: Key is no longer used

    公钥服务器同步:
        $ gpg --keyserver hkp://keyserver.ubuntu.com --send-keys CDBF34099037F231