As chaves privadas nunca expiram. Somente chaves públicas fazem. Caso contrário, o mundo nunca perceberia a expiração, já que (esperançosamente) o mundo nunca vê as chaves privadas.
Para a parte importante, há apenas uma maneira, de modo que salva 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ê precisa tomar uma decisão sobre a extensão da validade vs. a substituição da (s) subchave (s). Substituí-los fornece segurança de encaminhamento limitada (limitada a prazos bastante grandes). Se isso for 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 key 1
duas vezes para selecionar e desmarcar, pois 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 faz sentido apenas se você tiver uma chave principal offline (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 (para as novas assinaturas de chave ou para as novas chaves). A substituição torna a chave um pouco maior, mas isso não é um problema.
Se você usar cartões inteligentes (ou planeja fazer isso), ter mais chaves (criptografia) cria um certo inconveniente (um cartão com a nova chave não pode descriptografar dados antigos).
gpg> expire Need the secret key to do this.
Alguma idéia de como contornar isso?