chinaport-data-signature
chinaport-data-signature copied to clipboard
往海关发送自己拼接的加签后报文,是否需要过一遍C14N再发
XML报文加签获取信息成功后,自己拼接了加签报文。自己提取了Signature后验签没通过。过了遍c14n后再提取Signature验签就通过了。那是否往海关发之前整体报文需要过一遍c14n?
- 使用
chinaport-data-signature
加签的返回结果直接上游业务程序中使用,在待加签XML报文中缺什么补什么,不建议做任何修改,chinaport-data-signature
加签的返回结果不需要使用使用C14N格式化,“拼接好的待加签XML报文”加签之前是什么就是什么; - 上游开发者可以使用XML格式化的类库把“待加签XML报文”格式化好,然后将格式化后“待加签XML报文”传给
chinaport-data-signature
加签服务,之后拿到接口返回结果解析填充“待加签XML报文”即可,返回数据不建议随便修改,修改后的大概率验签失败。 - 如果
u-key
自身问题导致chinaport-data-signature
加签失败,可以配置加签失败的邮件通知提醒
感谢解答,折腾了好几天终于搞通了,把踩的坑说下吧
-
最后加签完的报文转成字符串后,如果
<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:ceb
、xmlns:ds
、xmlns:xsi
)问题 送给U盾加签的报文中手动添加了上述属性,然而最终报文中没有添加,导致验签时自动添加的这些属性顺序与手动添加的不同,从而导致SignatureValue
对不上。 另:跟踪发现在getSignatureValueBeforeSend
方法中,如果不先调用一遍Canonicalizer.canonicalize()
传入transform
过的数据的话。之后获取Node
后的再调用canonicalizeSubtree
方法会在输出中把xmlns:ceb
和xmlns:ceb
重复添加一遍,比较神奇。
另:调试过程中用了一个第三方的校验页面,挺有帮助的