As chaves privadas nunca expiram. Apenas chaves públicas. Caso contrário, o mundo nunca notaria a expiração como (esperançosamente) o mundo nunca vê as chaves privadas.
Para a parte importante, há apenas uma maneira, de modo que economiza uma discussão sobre prós e contras.
Você precisa estender a validade da chave principal:
gpg --edit-key 0x12345678
gpg> expire
...
gpg> save
Você tem que tomar uma decisão sobre a extensão da validade de vs. substituir a (s) sub-chave (s). Substituí-los dá-lhe uma segurança limitada (limitada a períodos de tempo bastante grandes). Se isso é importante para você, você deve ter subchaves (separadas) para criptografia e assinatura (o padrão é apenas para criptografia).
gpg --edit-key 0x12345678
gpg> key 1
gpg> expire
...
gpg> key 1
gpg> key 2
gpg> expire
...
gpg> save
Você precisa de key 1
duas vezes para selecionar e cancelar a seleção porque pode estender a validade de apenas uma chave por vez.
Você também pode decidir estender a validade, a menos que tenha algum motivo para supor que a chave foi comprometida. Não jogar fora todo o certificado em caso de comprometimento só faz sentido se você tiver uma chave principal off-line (que IMHO é a única maneira razoável de usar o OpenPGP de qualquer maneira).
Os usuários do seu certificado precisam obter sua versão atualizada de qualquer maneira (seja para as novas assinaturas de chave ou para a (s) nova (s) chave (s)). Substituir torna a chave um pouco maior, mas isso não é um problema.
Se você usar smartcards (ou planeja fazê-lo), ter mais chaves (criptografia) cria um certo inconveniente (um cartão com a nova chave não pode descriptografar dados antigos).