Subject: Using principal wildcards in gpg.ssh.allowedSignersFile

From: Matthias Maier <[email-masked]>
Date: Fri, 17 Dec 2021 00:20:59 -0600

Dear all,

I am experimenting with git version 2.34.1 (and OpenSSH 8.8_p1) a bit
trying to set up a repository with SSH signatures for commits instead of
pgp. I have also tested the current "git next" branch.

The straight-forward setup (by having an "allowed_signers" file
naming individual e-mails and pubkeys) works as anticipated.

However, when trying to combine this with an SSH certificate authority
(which would be the use case I have in mind) I am not able to use an
e-mail wildcard in the "allowed_signers" file but have to specify full
e-mails instead. This, unfortunately, defeats a bit the purpose of
having an SSH certificate authority in the first place...

The corresponding low-level openssh facilities all seem to work
(including an e-mail wildcard in the ALLOWED SIGNERS file and
$ ssh-keygen -Y find-principals extracting the right e-mail).

I have attached full details how to reproduce below.

Can someone shed some light on this one?

Best,
Matthias

Steps to reproduce:

====================
Set up a minimal CA:
====================

  $ mkdir /tmp/signing-test
  $ cd /tmp/signing-test

A)  Set up two test pubkeys:

  $ ssh-keygen -t ed25519 -C "ca key" -f id_ca
  [...]
  $ ssh-keygen -t ed25519 -C "user key" -f id_user
  [...]

B)  Sign user key creating an SSH certificate:

  $ ssh-keygen -s id_ca -I "user key" -n "[email-masked]" id_user.pub
  Signed user key id_user-cert.pub: id "user key" serial 0 for [email-masked] valid forever

  $ ssh-keygen -L -f id_user-cert.pub
  id_user-cert.pub:
        Type: [email-masked] user certificate
        Public key: ED25519-CERT SHA256:noSSfVeVlrYi6vGgK+jRPvyBnIV4ccVA0iW4IXYdXDQ
        Signing CA: ED25519 SHA256:gix8Iux4j9Uf5fyTPdXbO/7EaLbpnhBczW3jw+2DHnw (using ssh-ed25519)
        Key ID: "user key"
        Principals:
                [email-masked]
  [...]

C)  Create allowed signers file:

  $ (printf [email-masked] cert-authority,namespaces="file,git" '; cat id_ca.pub) > allowed_signers

  ! Important: I used a wild card "[email-masked]" for the principal!

D) Test setup:

  $ echo this is some random text > test.txt
  $ ssh-keygen -Y sign -f id_user-cert.pub -n file test.txt
  Signing file test.txt
  Write signature to test.txt.sig
  
  $ ssh-keygen -Y find-principals -f allowed_signers -n file -s test.txt.sig
  [email-masked]

  $ ssh-keygen -Y verify -f allowed_signers -I "[email-masked]" -n file -s test.txt.sig < test.txt
  Good "file" signature for [email-masked] with ED25519-CERT key SHA256:noSSfVeVlrYi6vGgK+jRPvyBnIV4ccVA0iW4IXYdXDQ

=======================
Set up a git repository
=======================

E) Set up an empty repository somewhere
  
  $ cd /tmp
  $ git init signing-test-repo
  $ cd signing-test-repo
  
  and modify .git/config to look like this:

        [core]
                repositoryformatversion = 0
                filemode = true
                bare = false
                logallrefupdates = true
        [commit]
                gpgsign = true
        [user]
                signingkey = /tmp/signing-test/id_user-cert.pub
        [gpg]
                format = ssh
        [gpg "ssh"]
                allowedSignersFile = /tmp/signing-test/allowed_signers

F) make a commit

  $ git commit -a --allow-empty -m "my shiny new ssh key signed commit"

  $ git log --show-signature
  Good "git" signature with ED25519-CERT key SHA256:noSSfVeVlrYi6vGgK+jRPvyBnIV4ccVA0iW4IXYdXDQ
  /tmp/signing-test/allowed_signers:1: no valid principals found
  No principal matched.
  Author: Matthias Maier <[email-masked]>
  Date:   Mon Dec 13 23:51:03 2021 -0600

G) modify allowd_signers entry to read "[email-masked]" instead of the wildcard "[email-masked]":

  $ git log --show-signature
  Good "git" signature for [email-masked] with ED25519-CERT key SHA256:noSSfVeVlrYi6vGgK+jRPvyBnIV4ccVA0iW4IXYdXDQ
  Author: Matthias Maier <[email-masked]>
  Date:   Mon Dec 13 23:51:03 2021 -0600