Estoy almacenando una clave pública en una variable env como una cadena. Esta clave pública es de un archivo .pem. Cuando trato de usarlo en mi código, aparece el siguiente error
error:0909006C:PEM routines:get_name:no start lineProbé lo que otros usuarios sugirieron, convirtiéndolo a base64 y luego usando la clave, pero sigo teniendo el mismo error.
variable env para la clave pública
PUB_KEY='-----BEGIN PUBLIC KEY-----randomgibberish-----END PUBLIC KEY-----'Código para convertirlo a base64
const pubKey = process.env.PUB_KEY const buff = Buffer.from(pubKey).toString('base64'); console.log(buff)Usándolo en el método createPublicKey aquí
crypto.createPublicKey({ key: buff, format: 'pem', });¿Alguna idea de lo que podría estar saliendo mal? AIT
Su código se está rompiendo debido a un salto de línea en las claves públicas.
No es necesario usar base64, le sugiero que use saltos de línea (\n) en el archivo env para almacenar la clave así:
Si suponiendo que su clave es algo como esto:
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlkH/R64I0H1awndlU1w6BseS9 5ygy2v6rwV7BA/xlNGCtWfsQ8UlbJl7fawZ1hgL7H8FcUkGk/RsWB7xRpUeHypnE 8UU2bbhaS+X8Bze2kdoayerb5+YK6kZlyPvmI+WVxksKUEChcKE+t83mqVpnQnO9 TkTXhzvual4cG+WatwIDAQAB -----END PUBLIC KEY-----luego guárdelo así (\n al final de la línea y convirtiéndolo en una cadena completa, puede ver cómo lo he almacenado)
export publicKey = '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlkH/R64I0H1awndlU1w6BseS9\n5ygy2v6rwV7BA/xlNGCtWfsQ8UlbJl7fawZ1hgL7H8FcUkGk/RsWB7xRpUeHypnE\n8UU2bbhaS+X8Bze2kdoayerb5+YK6kZlyPvmI+WVxksKUEChcKE+t83mqVpnQnO9\nTkTXhzvual4cG+WatwIDAQAB\n-----END PUBLIC KEY-----'Y en el uso del código:
const { publicKey } = process.env const originalPublicKey = publicKey.replace(/\\n/g, '\n')Esto hará el trabajo, generará sus claves originales.
const publicKey = '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlkH/R64I0H1awndlU1w6BseS9\n5ygy2v6rwV7BA/xlNGCtWfsQ8UlbJl7fawZ1hgL7H8FcUkGk/RsWB7xRpUeHypnE\n8UU2bbhaS+X8Bze2kdoayerb5+YK6kZlyPvmI+WVxksKUEChcKE+t83mqVpnQnO9\nTkTXhzvual4cG+WatwIDAQAB\n-----END PUBLIC KEY-----' const originalPublicKey = publicKey.replace(/\\n/g, '\n') console.log(originalPublicKey)entonces simplemente puede usar esto en su código.
crypto.createPublicKey({ key: originalPublicKey, format: 'pem', });Avíseme en los comentarios, si tiene algún problema después de esto también.
Su clave parece ser una clave pública codificada con PEM en formato X.509/SPKI. Sin embargo, faltan los saltos de línea. Estos deben configurarse de modo que el encabezado y el pie de página estén en una sola línea. En el cuerpo hay un salto de línea cada 64 caracteres.
Una clave PEM con el formato correcto puede ser procesada directamente por createPublicKey() . La clave se aceptará incluso si faltan los saltos de línea en el cuerpo, pero el encabezado y el pie de página deben estar en líneas diferentes; de lo contrario, se mostrará el mensaje de error publicado: error:0909006C:PEM rutines:get_name:no start line .
Ejemplo:
var crypto = require('crypto') var x509 = `-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAunF5aDa6HCfLMMI/MZLT 5hDk304CU+ypFMFiBjowQdUMQKYHZ+fklB7GpLxCatxYJ/hZ7rjfHH3Klq20/Y1E bYDRopyTSfkrTzPzwsX4Ur/l25CtdQldhHCTMgwf/Ev/buBNobfzdZE+Dhdv5lQw KtjI43lDKvAi5kEet2TFwfJcJrBiRJeEcLfVgWTXGRQn7gngWKykUu5rS83eAU1x H9FLojQfyia89/EykiOO7/3UWwd+MATZ9HLjSx2/Lf3g2jr81eifEmYDlri/OZp4 OhZu+0Bo1LXloCTe+vmIQ2YCX7EatUOuyQMt2Vwx4uV+d/A3DP6PtMGBKpF8St4i GwIDAQAB -----END PUBLIC KEY-----`; // Import var importedPubKey = crypto.createPublicKey({ key: x509, format: 'pem' // default, can also be omitted }); // Export console.log(importedPubKey.export({type: 'spki', format: 'pem'})) La clave también se puede escribir como una sola línea con saltos de línea como secuencias de escape ( \n ), por ejemplo, para encabezado y pie de página en líneas individuales:
var x509 = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAunF5aDa6HCfLMMI/MZLT5hDk304CU+ypFMFiBjowQdUMQKYHZ+fklB7GpLxCatxYJ/hZ7rjfHH3Klq20/Y1EbYDRopyTSfkrTzPzwsX4Ur/l25CtdQldhHCTMgwf/Ev/buBNobfzdZE+Dhdv5lQwKtjI43lDKvAi5kEet2TFwfJcJrBiRJeEcLfVgWTXGRQn7gngWKykUu5rS83eAU1xH9FLojQfyia89/EykiOO7/3UWwd+MATZ9HLjSx2/Lf3g2jr81eifEmYDlri/OZp4OhZu+0Bo1LXloCTe+vmIQ2YCX7EatUOuyQMt2Vwx4uV+d/A3DP6PtMGBKpF8St4iGwIDAQAB\n-----END PUBLIC KEY-----" Todo esto también funciona si la clave se almacena en una variable de entorno (por ejemplo X509ENV ) y se recupera (a través de process.env.X509ENV ) siempre que los saltos de línea se tengan en cuenta correctamente.