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
Sauts de ligne remplacés par des \n littéraux
fréquenteLes clés sur plusieurs lignes placées dans des variables d’environnement, des variables de configuration Heroku/Render ou des chaînes YAML se retrouvent souvent sur une seule ligne avec des séquences `\n`.
Clé chiffrée avec un mot de passe absent ou erroné
fréquente`PKey.read(data)` sans le second argument ne peut pas déchiffrer une clé chiffrée ; un mot de passe erroné produit la même erreur, et non une erreur propre au mot de passe.
Pas une clé lisible par OpenSSL
occasionnelleUne clé publique OpenSSH (`ssh-ed25519 AAAA…`), un document JSON JWK, ou un fichier de chaîne de certificats contenant du texte supplémentaire avant le bloc PEM.
Comment corriger l’erreur
- 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.
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))