gpt4 book ai didi

php - 如何使用 Node 创建 pem 文件

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:27 25 4
gpt4 key购买 nike

我正在为一些需要签署一些文件的客户使用 Web 应用程序,其他公司给他 2 个文件- file1.key- file2.cer如果我理解,那么文件是用密码加密的,所以用户需要他的密码

公司给我一些 php 的例子,说我需要用这样的命令获取私钥

-将 *.key 转换成 *.pem:openssl pkcs8 -inform DER -in llave.key -out llave.key.pem -passin pass:contrasenia

-将 *.cer 转换为 *.pem:openssl pkcs8 -inform DER -in llave.key -out llave.key.pem -passin pass:contrasenia

但是对于最终用户我不能要求他“运行这个命令”最终用户需要指明他的密码

公司给我一些php代码

$private_file="c:/firma/llave_carlos.key.pem";
$public_file="c:/firma/cert_carlos.cer.pem";
$private_key = openssl_get_privatekey(file_get_contents($private_file));
exito = openssl_sign($cadena_original,$Firma,$private_key, OPENSSL_ALGO_SHA256);
openssl_free_key($private_key);
$public_key = openssl_pkey_get_public(file_get_contents($public_file));
$PubData = openssl_pkey_get_details($public_key);
$result = openssl_verify($cadena_original, $Firma, $public_key, "sha256WithRSAEncryption");

但是我正在使用 Nodejs 在谷歌搜索我找到了 npm 包 Node -openssl-cert但直到现在我还找不到与 php "openssl_get_privatekey"类似的方法

我认为解决方案是使用来自 Node 的加密模块

const crypto = require('crypto');

const { privateKey, publicKey } = crypto.generateKeyPairSync('ec', {
namedCurve: 'sect239k1'
});

const sign = crypto.createSign('SHA256');
sign.write('some data to sign');
sign.end();
const signature = sign.sign(privateKey, 'hex');

const verify = crypto.createVerify('SHA256');
verify.write('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature));

但我的问题是这一行

const { privateKey, publicKey } = crypto.generateKeyPairSync('ec', {
namedCurve: 'sect239k1'
});

“私钥”和“公钥”应该来自文件

感谢您的支持,抱歉我不会说英语

最佳答案

让我猜猜:您正在构建一个 CFDI 3.3 并尝试对原始字符串进行签名以获得数字签名。我遇到了同样的问题,搜索了很多,下载了很多 Node 库,你的进步真的帮助了我,所以我可以集成一个只使用加密库的解决方案,这里是:

首先,确保原串没问题(那是我第一个问题,原串错了),可以用这个工具:https://solucionfactible.com/sfic/capitulos/timbrado/cadena_original.jsp#herramientaCO

检查原始字符串后,您需要使用 SHA256 对原始字符串进行签名,在这里您可以找到我为此编写的函数:

const privateKey   = "./EKU9003173C9.key.pem" //Note that I converted the .key to .key.pem
const firmarCadena = cadena => {
let prvKey = fs.readFileSync( privateKey )
var signerObject = crypto.createSign("SHA256")
signerObject.update( cadena )
let signature = signerObject.sign( prvKey, "base64" )
return signature
}

您还可以检查此工具,以便比较您获得的值和必须获得的值。它使用 .xml、.key 和私钥密码生成原始字符串和数字签名:https://solucionfactible.com/sfic/capitulos/timbrado/sello.jsp#herramientaSello

最后,您可以在“Verificador de sello digital (verificador de firma)”部分验证您的数字签名:https://solucionfactible.com/sfic/capitulos/timbrado/sello.jsp#herramientaSello

我需要说明一下,我使用的是 Node 10.x。它已经有一个 Crypto 内置库。

关于php - 如何使用 Node 创建 pem 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55554750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com