Message d’erreur
Failed to read asymmetric key
Node.js crypto — e.g. code ERR_OSSL_ASN1_WRONG_TAG
Ce que cela signifie
createPublicKey() (ou tout appel qui prend une clé publique en DER, comme crypto.verify()) a reçu des octets dont la structure ASN.1 ne correspond pas au type que vous avez déclaré, par exemple type: "spki" alors que les octets sont en réalité une clé privée EC SEC1. OpenSSL a poussé l’analyse assez loin pour savoir que les tags sont incorrects, puis s’est arrêté. (createPrivateKey() et un PEM mal étiqueté signalent le même genre de non-concordance dans les termes propres à OpenSSL, comme « error:068000A8:asn1 encoding routines::wrong tag ».) Le code associé (ERR_OSSL_ASN1_WRONG_TAG et ses variantes) nomme la non-concordance au niveau ASN.1. Contrairement à l’erreur « unsupported » du décodeur (DECODER routines), qui signifie que rien d’analysable n’a été trouvé, celle-ci signifie que les octets avaient manifestement une structure qui ne convient pas au type déclaré.
Pourquoi cela se produit
Le type déclaré ne correspond pas aux octets
fréquenteDans l’univers DER, il existe plusieurs conteneurs : SPKI pour les clés publiques, PKCS#8 pour les clés privées, SEC1 pour les anciennes clés privées EC, PKCS#1 pour les anciennes clés RSA. Déclarer type: "spki" pour une clé privée SEC1 ou PKCS#8, ou pour un certificat entier, fait échouer immédiatement la vérification des tags.
Base64 non décodé, ou décodé deux fois
fréquentePasser du texte base64 avec format: "der" (OpenSSL analyse alors de l’ASCII comme de l’ASN.1) ou appliquer Buffer.from(pem, "base64") à un PEM complet avec ses lignes d’en-tête produisent tous deux une bouillie d’octets aux tags incorrects.
Un point EC brut au lieu d’une structure de clé
occasionnelleLes 65 octets d’un point non compressé (0x04‖X‖Y) ne sont pas du DER : c’est la charge utile qui se trouve à l’intérieur d’une structure SPKI. Les passer directement à createPublicKey échoue ; il faut les envelopper, ou les importer en JWK ou au format raw de WebCrypto.
Comment corriger l’erreur
- 1.
Identifier la structure, puis la déclarer correctement
asn1parse affiche la structure externe. Une structure SPKI commence par une SEQUENCE contenant un AlgorithmIdentifier ; PKCS#8 commence par une version INTEGER 0 ; les clés EC SEC1, par INTEGER 1.
bash openssl asn1parse -inform der -in key.der | head -5 - 2.
Aligner les options de Node sur le conteneur
Une fois le conteneur connu, la correspondance est mécanique.
js // SPKI public key createPublicKey({ key: der, format: "der", type: "spki" }); // PKCS#8 private key createPrivateKey({ key: der, format: "der", type: "pkcs8" }); // SEC1 (BEGIN EC PRIVATE KEY) private key createPrivateKey({ key: der, format: "der", type: "sec1" }); - 3.
Convertir les anciens conteneurs une fois pour toutes, à la frontière du système
Standardisez le stockage sur PKCS#8/SPKI pour que le code applicatif n’ait jamais à deviner.
bash openssl pkey -in legacy-ec.pem -out key-pkcs8.pem # any private → PKCS#8 openssl pkey -in key-pkcs8.pem -pubout -out pub-spki.pem # derive SPKI public