Guillem Jover wrote:
> Hi!
> 
> A recent dupload improvement to switch from its GnuPG based OpenPGP
> verification hook to use the dpkg OpenPGP multi-backend
> implementation, which as a side effect got rid of a very old code path
> that was ignoring some GnuPG verification failures, resurfaced an old
> known problem with OpenPGP certificates with SHA-1 issues in the
> Debian keyrings.
> 
> Not all of these issues are equally "bad" from a Debian point of view,
> but all are probably bad for the certificate owners, as it might imply
> that people cannot verify signatures made with those certificates. In
> the Debian context that might mean emails, or signatures on artifacts
> such as .dsc or .changes. Depending on the specific problem those
> might even cause rejects from DAK.
> 
> I filed #1100734 against debian-keyring the other day, but to try to
> help people that might get confused by the kind or errors that dupload
> (or dpkg-source --require-valid-signature or dscverify) might be
> emitting (I think dput-ng is strict with its OpenPGP verification and
> should have already been rejecting signatures from those certificates,
> although I think dput might be lenient as dupload used to be and might
> let those through (?)), I've prepared a list of affected certificates
> per keyring, which I'm attaching.
> 
> To check for the exact issues you can use the Sequoia certificate
> linter (from the «sq» package) with something like:
> 
>   $ sq cert lint --cert FINGERPRINT
> 
> To fix your certificate it should (in theory) be enough to do:
> 
>   $ sq cert lint --cert FINGERPRINT --fix | gpg --import
> 
> (Given that Sequoia can transparently read from the GnuPG certstore,
> and talk to gpg-agent.)
> 
> You might want to check the chapter for that at
> <https://book.sequoia-pgp.org/lint.html>. If you'd prefer to use GnuPG
> to fix your certificate, although in a really more tedious way, you can
> follow these instructions instead:
> 
>   
> https://lore.kernel.org/keys/fxotnlhsyl2frp54xtguy7ryrucuwselanazixeax3motyyoo3@7vf7ip6gxyvx/T/#u
> 
> (I'm also attaching the script I used to generate the lists.)
> 
> Thanks,
> Guillem

>       Fingerprint: DF3D96EEB3827820F302665C01817AB0AAF6CDAE
>            UserID: Robert Edmonds <edmo...@debian.org>
>            UserID: Robert Edmonds <edmo...@fsi.io>
>            UserID: Robert Edmonds <edmo...@mycre.ws>

Hello,

I'm not sure this analysis is completely correct. As far as I can tell,
you've flagged my key on the basis of "sq cert lint" reporting the
following output:

    $ sq cert lint --keyring /usr/share/keyrings/debian-keyring.gpg --cert 
01817AB0AAF6CDAE
    Certificate 01817AB0AAF6CDAE, key 292C9BB54A4D3CBA uses a SHA-1-protected 
binding signature.
    Examined 1 certificate.
      0 certificates are invalid and were not linted. (GOOD)
      1 certificate was linted.
      1 of the 1 certificates (100%) has at least one issue. (BAD)
    0 of the linted certificates were revoked.
      0 of the 0 certificates has revocation certificates that are weaker than 
the certificate and should be recreated. (GOOD)
    0 of the linted certificates were expired.
    1 of the non-revoked linted certificate has at least one non-revoked User 
ID:
      0 have at least one User ID protected by SHA-1. (GOOD)
      0 have all User IDs protected by SHA-1. (GOOD)
    1 of the non-revoked linted certificates has at least one non-revoked, live 
subkey:
      1 has at least one non-revoked, live subkey with a binding signature that 
uses SHA-1. (BAD)
    0 of the non-revoked linted certificates have at least one non-revoked, 
live, signing-capable subkey:
      0 certificates have at least one non-revoked, live, signing-capable 
subkey with a strong binding signature, but a backsig that uses SHA-1. (GOOD)

      Error: 1 certificate have at least one issue

Now, key 292C9BB54A4D3CBA is my encryption subkey, not the main key
01817AB0AAF6CDAE that is used for signing and certifying:

    sec  rsa4096/01817AB0AAF6CDAE
         created: 2013-10-03  expires: never       usage: SC
         card-no: 0005 00003A89
         trust: ultimate      validity: ultimate
    ssb  rsa4096/292C9BB54A4D3CBA
         created: 2013-10-03  expires: never       usage: E
         card-no: 0005 00003A89

Since only the encryption subkey is affected, I do not believe this
problem can affect the signatures on my signed .dsc or .changes files.

Here are the raw PGP packets, from a clean sid chroot with gpg and
debian-keyring installed:

    root@7311057f397a:/# gpg --keyring=/usr/share/keyrings/debian-keyring.gpg 
--export-options export-minimal --export 01817AB0AAF6CDAE | gpg --list-packets
    # off=0 ctb=99 tag=6 hlen=3 plen=525
    :public key packet:
        version 4, algo 1, created 1380802569, expires 0
        pkey[0]: [4096 bits]
        pkey[1]: [17 bits]
        keyid: 01817AB0AAF6CDAE
    # off=528 ctb=b4 tag=13 hlen=2 plen=31
    :user ID packet: "Robert Edmonds <edmo...@fsi.io>"
    # off=561 ctb=89 tag=2 hlen=3 plen=543
    :signature packet: algo 1, keyid 01817AB0AAF6CDAE
        version 4, created 1470513048, md5len 0, sigclass 0x30
        digest algo 8, begin of digest fb a2
        hashed subpkt 2 len 4 (sig created 2016-08-06)
        hashed subpkt 29 len 1 (revocation reason 0x20 ())
        subpkt 16 len 8 (issuer key ID 01817AB0AAF6CDAE)
        data: [4095 bits]
    # off=1107 ctb=b4 tag=13 hlen=2 plen=33
    :user ID packet: "Robert Edmonds <edmo...@mycre.ws>"
    # off=1142 ctb=89 tag=2 hlen=3 plen=570
    :signature packet: algo 1, keyid 01817AB0AAF6CDAE
        version 4, created 1408125108, md5len 0, sigclass 0x13
        digest algo 8, begin of digest 5e 8d
        hashed subpkt 27 len 1 (key flags: 03)
        hashed subpkt 30 len 1 (features: 01)
        hashed subpkt 23 len 1 (keyserver preferences: 80)
        hashed subpkt 25 len 1 (primary user ID)
        hashed subpkt 2 len 4 (sig created 2014-08-15)
        hashed subpkt 11 len 4 (pref-sym-algos: 9 8 7 3)
        hashed subpkt 21 len 4 (pref-hash-algos: 10 9 8 11)
        hashed subpkt 22 len 4 (pref-zip-algos: 2 3 1 0)
        subpkt 16 len 8 (issuer key ID 01817AB0AAF6CDAE)
        data: [4096 bits]
    # off=1715 ctb=b4 tag=13 hlen=2 plen=35
    :user ID packet: "Robert Edmonds <edmo...@debian.org>"
    # off=1752 ctb=89 tag=2 hlen=3 plen=567
    :signature packet: algo 1, keyid 01817AB0AAF6CDAE
        version 4, created 1408125126, md5len 0, sigclass 0x13
        digest algo 8, begin of digest cc 62
        hashed subpkt 27 len 1 (key flags: 03)
        hashed subpkt 30 len 1 (features: 01)
        hashed subpkt 23 len 1 (keyserver preferences: 80)
        hashed subpkt 2 len 4 (sig created 2014-08-15)
        hashed subpkt 11 len 4 (pref-sym-algos: 9 8 7 3)
        hashed subpkt 21 len 4 (pref-hash-algos: 10 9 8 11)
        hashed subpkt 22 len 4 (pref-zip-algos: 2 3 1 0)
        subpkt 16 len 8 (issuer key ID 01817AB0AAF6CDAE)
        data: [4095 bits]
    # off=2322 ctb=b9 tag=14 hlen=3 plen=525
    :public sub key packet:
        version 4, algo 1, created 1380802569, expires 0
        pkey[0]: [4096 bits]
        pkey[1]: [17 bits]
        keyid: 292C9BB54A4D3CBA
    # off=2850 ctb=89 tag=2 hlen=3 plen=543
    :signature packet: algo 1, keyid 01817AB0AAF6CDAE
        version 4, created 1380802569, md5len 0, sigclass 0x18
        digest algo 2, begin of digest 1e e4
        hashed subpkt 2 len 4 (sig created 2013-10-03)
        hashed subpkt 27 len 1 (key flags: 0C)
        subpkt 16 len 8 (issuer key ID 01817AB0AAF6CDAE)
        data: [4095 bits]

If I understand correctly, the last packet is the only one with "digest
algo 2" (SHA-1), which is the self-signature on the encryption subkey
(292C9BB54A4D3CBA). All the other signatures are "digest algo 8"
(SHA-256).

By the way, the hash algorithm numbers are registered here:
https://www.iana.org/assignments/openpgp/openpgp.xhtml#openpgp-hash-algorithms.

I do not see any of the verification failures that you demonstrated
downthread on debian-devel when I try to verify a recent upload of mine:

    $ apt source --download-only protobuf-c
    NOTICE: 'protobuf-c' packaging is maintained in the 'Git' version control 
system at:
    https://salsa.debian.org/edmonds/protobuf-c.git
    Please use:
    git clone https://salsa.debian.org/edmonds/protobuf-c.git
    to retrieve the latest (possibly unreleased) updates to the package.
    Need to get 538 kB of source archives.
    Get:1 http://deb.debian.org/debian sid/main protobuf-c 1.5.1-1 (dsc) [2,060 
B]
    Get:2 http://deb.debian.org/debian sid/main protobuf-c 1.5.1-1 (tar) [532 
kB]
    Get:3 http://deb.debian.org/debian sid/main protobuf-c 1.5.1-1 (diff) 
[4,576 B]
    Fetched 538 kB in 0s (8,641 kB/s)
    Download complete and in download only mode

    $ gpgv-sq --keyring /usr/share/keyrings/debian-keyring.gpg 
protobuf-c_1.5.1-1.dsc 1>/dev/null
    gpgv: Signature made Sun Feb  2 00:10:24 2025 -05:00
    gpgv:                using RSA key DF3D96EEB3827820F302665C01817AB0AAF6CDAE
    gpgv: Good signature from "Robert Edmonds <edmo...@mycre.ws>"
    gpgv:                     "Robert Edmonds <edmo...@debian.org>"

    $ dscverify --verbose --no-default-keyrings --keyring 
/usr/share/keyrings/debian-keyring.gpg protobuf-c_1.5.1-1.dsc
    protobuf-c_1.5.1-1.dsc:
    gpg: Signature made Sun 02 Feb 2025 12:10:24 AM EST
    gpg:                using RSA key DF3D96EEB3827820F302665C01817AB0AAF6CDAE
    gpg: Good signature from "Robert Edmonds <edmo...@mycre.ws>" [unknown]
    gpg:                 aka "Robert Edmonds <edmo...@debian.org>" [unknown]
    gpg: WARNING: Using untrusted key!
          Good signature found
       validating protobuf-c_1.5.1.orig.tar.gz
       validating protobuf-c_1.5.1-1.debian.tar.xz
    All files validated successfully.

That makes sense, since only my encryption subkey is affected.

The "gpg --edit-key" instructions on the lore.kernel.org page you
linked did not work for me. (I use an OpenPGP hardware card and have not
investigated Sequoia's support for hardware keys.)

I did find this blog post:

https://blog.bmarwell.de/2020/11/21/fixing-old-sha1-infested-openpgp-keys.html

And the command "gpg --quick-set-expire <key-fingerprint> 0 '*'" listed
on that page worked to replace the self-signature on the encryption
subkey. Now I have the following signature packet with "digest algo 10"
(SHA-512) rather than "digest algo 2" (SHA-1):

    # off=2850 ctb=89 tag=2 hlen=3 plen=566
    :signature packet: algo 1, keyid 01817AB0AAF6CDAE
        version 4, created 1742767476, md5len 0, sigclass 0x18
        digest algo 10, begin of digest 93 60
        hashed subpkt 27 len 1 (key flags: 0C)
        hashed subpkt 33 len 21 (issuer fpr v4 
DF3D96EEB3827820F302665C01817AB0AAF6CDAE)
        hashed subpkt 2 len 4 (sig created 2025-03-23)
        subpkt 16 len 8 (issuer key ID 01817AB0AAF6CDAE)
        data: [4095 bits]

With this new signature, the "sq cert lint" command does not print any
red text to the terminal now.

But, again, this is a self-signature on an encryption subkey and I do
not see how that should affect the verification of signatures made from
the signing key on .dsc, .changes, etc. files.

-- 
Robert Edmonds
edmo...@debian.org

Reply via email to