chinaport-data-signature icon indicating copy to clipboard operation
chinaport-data-signature copied to clipboard

往海关发送自己拼接的加签后报文,是否需要过一遍C14N再发

Open Pecolyte opened this issue 1 year ago • 2 comments

XML报文加签获取信息成功后,自己拼接了加签报文。自己提取了Signature后验签没通过。过了遍c14n后再提取Signature验签就通过了。那是否往海关发之前整体报文需要过一遍c14n?

Pecolyte avatar Aug 12 '22 11:08 Pecolyte

  • 使用chinaport-data-signature加签的返回结果直接上游业务程序中使用,在待加签XML报文中缺什么补什么,不建议做任何修改,chinaport-data-signature加签的返回结果不需要使用使用C14N格式化,“拼接好的待加签XML报文”加签之前是什么就是什么;
  • 上游开发者可以使用XML格式化的类库把“待加签XML报文”格式化好,然后将格式化后“待加签XML报文”传给chinaport-data-signature加签服务,之后拿到接口返回结果解析填充“待加签XML报文”即可,返回数据不建议随便修改,修改后的大概率验签失败。
  • 如果u-key自身问题导致chinaport-data-signature加签失败,可以配置加签失败的邮件通知提醒

Weasley-J avatar Aug 12 '22 12:08 Weasley-J

感谢解答,折腾了好几天终于搞通了,把踩的坑说下吧

  • 最后加签完的报文转成字符串后,如果<ds:Signature>元素前后都有换行、缩进的话,送去加签的原始报文在最后的</ceb:CEB507Message>的上一行也必须添加对应的一行换行和缩进。 总之原则就是把<ds:Signature>...</ds:Signature>整个删除(不要删除尖括号外的任何换行空格等字符)后,得到的报文与传入加签的标准化原文完全一致。不一致会导致Digest对不上。

  • 之前使用的XML工具类有问题,我用的报文在第一行ceb:CEBXXXMessage中有一个guid属性: <ceb:CEB507Message xmlns:ceb="http://www.chinaport.gov.cn/ceb" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" guid="CEB507_HNZB_MLFT_20220810173726_0620" version="1.0"> 用工具类转换Document时这个属性被搞到了前面 <ceb:CEB507Message guid="CEB507_HNZB_MLFT_20220810173726_0620" version="1.0" xmlns:ceb="http://www.chinaport.gov.cn/ceb" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 传参加签的时候中间转换Document时这个又被搞回到了后面,结果就是Digest对不上。

  • 转换过程中<ds:SignedInfo>标签的属性(xmlns:cebxmlns:dsxmlns:xsi)问题 送给U盾加签的报文中手动添加了上述属性,然而最终报文中没有添加,导致验签时自动添加的这些属性顺序与手动添加的不同,从而导致SignatureValue对不上。 另:跟踪发现在getSignatureValueBeforeSend方法中,如果不先调用一遍Canonicalizer.canonicalize()传入transform过的数据的话。之后获取Node后的再调用canonicalizeSubtree方法会在输出中把xmlns:cebxmlns:ceb重复添加一遍,比较神奇。

另:调试过程中用了一个第三方的校验页面,挺有帮助的

Pecolyte avatar Aug 17 '22 08:08 Pecolyte