我正在构建一个电子应用程序(带有Ionic),以使用node-signpdf(https://www.npmjs.com/package/node-signpdf)用p12证书对PDF进行数字签名。我遇到了一些问题,例如使用require ('electron').remote
来解决fs
。
我还在OS(MacOS Catalina)中安装了与电子正在使用的节点版本相同的节点版本(Node v12.4.0)。
问题是NPM依赖项之一使用了加密,并且显示为undefined并出现下一个错误:
HomePage.html:39 ERROR TypeError: _crypto.randomBytes is not a function
at Object.ctx.seedFileSync (prng.js:340)
at _reseedSync (prng.js:210)
at Object.ctx.generateSync (prng.js:163)
at Object.ctx.generate (prng.js:80)
at Object.ctx.getBytes (random.js:92)
at _modPow (rsa.js:431)
at Object.push../node_modules/node-forge/lib/rsa.js.pki.rsa.encrypt (rsa.js:501)
at Object.key.sign (rsa.js:1245)
at addSignerInfos (pkcs7.js:534)
at Object.sign (pkcs7.js:377)
我看到的是node-signpdf
使用node-forge
作为依赖项,并且node-forge
以此方式在prng.js
内加载加密货币:
var _crypto = null;
if(forge.util.isNodejs && !forge.options.usePureJavaScript &&
!process.versions['node-webkit']) {
_crypto = require('crypto');
}
我尝试将代码的那部分更改为使用crypto-js或browserfy-crypto(这最后一个甚至没有构建,并且多年未更新),但是我仍然收到上面显示的错误。
编辑1 : 这就是我在服务中实现签名的方式:
public signFile(pathToFile: string, pathToCert: string): void {
const fs = (<any>window).require('fs');
let certBuffer = fs.readFileSync(pathToCert);
let fileBuffer = fs.readFileSync(pathToFile);
fileBuffer = plainAddPlaceholder({
pdfBuffer: fileBuffer,
reason: 'I have reviewed it.',
signatureLength: 1612,
});
const signedPdf = signer.sign(fileBuffer, certBuffer, {passphrase: 'qwertyui'});
}
代码添加占位符以添加签名,问题出在signer.sign
编辑2 :
如果我在控制台中键入以下内容来运行应用程序:require ('crypto')
,我看到了这些方法,因此看起来好像是在全局范围中加载的,问题似乎出在node-forge
的NPM依赖项上
编辑3 :
我已将require('crypto')
更改为window.require('crypto')
并开始工作。但是我认为我必须制作后安装脚本才能对其进行修改。
有更好的方法吗?
-
如何使此加密货币工作正常?我没主意了。也许您可以保留一些?
感谢您的时间!