gpt4 book ai didi

javascript - 对于具有样式表处理指令的文档,XAdES 验证失败,引用 URI 为 =""

转载 作者:行者123 更新时间:2023-11-30 19:01:18 25 4
gpt4 key购买 nike

我正在签署的文件看起来像这样。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="CDA_PL_IG_1.3.1.xsl" type="text/xsl"?>
<ClinicalDocument></ClinicalDocument>

我正在使用 xadesjs使用以下代码签署此 XML:

const crypto = new Crypto();
xadesjs.Application.setEngine('NodeJS', crypto);

export async function sign(xml: string, { publicKey, privateKey }: any) {
const hash = 'SHA-1';
const alg = {
name: 'RSASSA-PKCS1-v1_5',
hash
};
const keyDer = pem2der(privateKey.toString());
const key = await crypto.subtle.importKey('pkcs8', keyDer, alg, true, [ 'sign' ]);
const parsed = xadesjs.Parse(xml.trim());
const xadesXml = new xadesjs.SignedXml();
const signature = await xadesXml.Sign(alg, key, parsed, {
signingCertificate: preparePem(publicKey.toString()),
references: [ { uri: '', hash, transforms: [ 'enveloped' ] } ],
x509: [ preparePem(publicKey.toString()) ]
});

parsed.documentElement.appendChild(signature.GetXml()!);
return parsed.toString();
}

function preparePem(pem: string) {
return pem.replace(/-----(BEGIN|END)[\w\d\s]+-----/g, '').replace(/[\r\n]/g, '');
}

function pem2der(pem: string) {
pem = preparePem(pem);
return new Uint8Array(Buffer.from(pem, 'base64')).buffer;
}

只有当我删除 xml 声明和样式表指令时,生成的签名才有效。所以只有签名才能返回正确签名的文档:

<ClinicalDocument></ClinicalDocument>

签名

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="CDA_PL_IG_1.3.1.xsl" type="text/xsl"?>
<ClinicalDocument></ClinicalDocument>

错误消息说没有签署整个文档。

我假设问题出在 URI=""引用。它只签署 <ClinicalDocument>并离开 <?xml version><?xml-stylesheet>没有签名。

我如何签署所有内容?

最佳答案

在签名之前,您需要规范化 (C14N) 文档。我无法对使用 xadesjs 发表评论,但这里有一些一般性建议。

对于 Xades 签名,您需要计算三部分的消息摘要,所有部分都是 C14N 版本。

(1) 完整文档,不包括 ds:Signature元素 - 这为您提供了 URI="" 的摘要值引用。

(2) xades:SignedProperties 的子集元素,它需要从完整文档继承任何命名空间。这给出了 SignedProperties 引用的摘要值。

(3) ds:SignedInfo 的最终子集元素,它再次需要包含继承的命名空间 - 该值间接用于计算签名值。

<?xml version>总是被排除在外。 <?xml-stylesheet>在计算封装签名的摘要值时包括在内(引用 URI=""),但在对两个子集进行 C14N 时排除

计算 C14n 变换并非易事。我将在此处插入我自己的规范化实用程序 SC14N https://www.cryptosys.net/sc14n/ .

您可以按如下方式直接生成摘要值:

sc14n -d -x ds:Signature clindoc.xml
sc14n -d -s xades:SignedProperties clindoc.xml
sc14n -d -s ds:SignedInfo clindoc.xml

要查看 C14N 版输出,请省略 -d 选项

sc14n  -x ds:Signature clindoc.xml
<?xml-stylesheet href="CDA_PL_IG_1.3.1.xsl" type="text/xsl"?>
<ClinicalDocument ...>

请注意 <xml-stylesheet行包含在它自己的一行中。

关于javascript - 对于具有样式表处理指令的文档,XAdES 验证失败,引用 URI 为 ="",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59490769/

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