Aller au contenu
ecdsa.com
Ruby openssl gemRuby

Message d’erreur

Could not parse PKey (OpenSSL::PKey::PKeyError)

Également affiché sous la forme

  • OpenSSL::PKey::PKeyError: Could not parse PKey
  • Neither PUB key nor PRIV key (OpenSSL::PKey::RSAError)
  • invalid curve name (OpenSSL::PKey::ECError)

Si l’erreur n’est pas interceptée, Ruby affiche « …: Could not parse PKey (OpenSSL::PKey::PKeyError) ». Les constructeurs propres à chaque classe lèvent `OpenSSL::PKey::RSAError` / `ECError` avec leurs propres textes.

Ruby openssl gem — OpenSSL::PKey.read / OpenSSL::PKey::RSA.new / OpenSSL::PKey::EC.new

Ce que cela signifie

`OpenSSL::PKey.read` a essayé tous les formats de clé que connaît OpenSSL (PEM et DER, clés publiques et privées, chiffrées avec le mot de passe fourni), et aucun n’a fonctionné. Ruby ne transmet pas le motif précis d’OpenSSL : le même texte couvre donc un PEM altéré, une phrase de passe erronée et des données qui ne sont pas du tout une clé. Les constructeurs propres à un algorithme échouent de la même façon : `RSA.new` avec « Neither PUB key nor PRIV key », `EC.new` avec « invalid curve name » (il traite une entrée illisible comme un nom de courbe).

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Rétablir les sauts de ligne et vérifier ce qui a été chargé

    Reconvertissez les séquences `\n` en sauts de ligne, lisez la clé une seule fois au démarrage, et contrôlez par une assertion son type et le fait qu’elle soit privée ou non.

    ruby
    pem = ENV.fetch("JWT_PUBLIC_KEY").gsub("\\n", "\n")   # restore real newlines
    key = OpenSSL::PKey.read(pem)
    raise "expected a public EC key" if key.private? || !key.is_a?(OpenSSL::PKey::EC)
  2. 2.

    Stocker les clés multilignes là où elles restent intactes

    Les credentials chiffrés de Rails ou un fichier secret monté conservent le PEM à l’identique, contrairement aux variables d’environnement sur une seule ligne.

    ruby
    # Rails: keep multi-line keys in encrypted credentials instead of ENV
    # bin/rails credentials:edit
    #   jwt:
    #     public_key: |
    #       -----BEGIN PUBLIC KEY-----
    #       ...
    key = OpenSSL::PKey.read(Rails.application.credentials.dig(:jwt, :public_key))

Erreurs associées

Parcourir toute la base de données des erreurs de signature