我正在为一些需要签署某些文档的客户使用web应用程序,其他公司会给他2个文件-file1.key-file2.cer,如果我明白,文件是用密码加密的,所以用户需要他的密码
该公司给了我一些php示例,并说我需要使用这样的命令获取私钥
-转换*. key a*. pem: openssl pkcs8-通知DER-llave.key-退出llave.key.pem-通行证:对比
-Conver *.cer to *.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包节点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'
});
“私钥”和“公钥”应该来自文件
谢谢你的支持,很抱歉我的英语不会说
让我猜猜:您正在构建一个 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生成原始字符串和数字符号。密钥和私钥密码:https://solucionfactible . com/sfic/capitulos/Tim brado/sello . JSP # herramientaSello
最后,您可以在以下章节验证您的数字签名:https://solucionfactible.com/sfic/capitulos/timbrado/sello.jsp#herramientaSello
我需要说我正在使用Node 10. x。它已经有一个Crypto内置库。