如何使用节点创建Pem文件

时间:2019-04-07 00:55:20

标签: php node.js ssl openssl cer

与某些客户需要签署一些其他公司的文档的Web应用程序一起工作时,im给他2个文件 -file1.key -file2.cer 如果我不了解,则文件将使用密码加密,因此用户需要密码

该公司在php中给了我一些示例,并说我需要使用命令来获取私钥

-将* .key转换为* .pem: openssl pkcs8-通知DER-输入llave.key-输出llave.key.pem -passin pass:contrasenia

-将* .cer转换为* .pem: openssl pkcs8-通知DER-输入llave.key-输出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");

但我在Google中使用Nodejs搜索时发现了npm包 节点openssl证书 但是直到现在我还找不到与php“ openssl_get_privatekey”类似的方法

im认为解决方案是使用节点

的加密模块
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'
});

“ privatekey”和“ publickey”应来自文件

感谢您的支持,并为我的英语交流感到抱歉

1 个答案:

答案 0 :(得分:1)

让我猜:您正在构建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

我需要说的是我正在使用Node10.x。它已经有一个Crypto内置库。