签名SOAP消息–生成封装的XML签名

数字签名是使数字内容真实可信的一种广泛使用的机制。 通过为某些内容生成数字签名,我们可以让另一方能够验证该内容。 通过此验证,它可以保证在我们签名后不会更改。 通过这个示例,我将分享如何为SOAP信封生成签名。 但是,这当然也适用于任何其他内容签名。

在这里,我将签名

  • SOAP信封本身
  • 一个附件
  • 将签名放在SOAP标头中

通过将签名放置在也由签名签名的SOAP标头中,这成为封装签名的演示。

信封签名

我正在使用Apache Santuario库进行签名。 以下是我使用的代码段。 我已经在此处共享了完整的示例以供下载 。

public static void main(String unused[]) throws Exception {String keystoreType = "JKS";String keystoreFile = "src/main/resources/PushpalankaKeystore.jks";String keystorePass = "pushpalanka";String privateKeyAlias = "pushpalanka";String privateKeyPass = "pushpalanka";String certificateAlias = "pushpalanka";File signatureFile = new File("src/main/resources/signature.xml");Element element = null;String BaseURI = signatureFile.toURI().toURL().toString();//SOAP envelope to be signedFile attachmentFile = new File("src/main/resources/sample.xml");//get the private key used to sign, from the keystoreKeyStore ks = KeyStore.getInstance(keystoreType);FileInputStream fis = new FileInputStream(keystoreFile);ks.load(fis, keystorePass.toCharArray());PrivateKey privateKey =(PrivateKey) ks.getKey(privateKeyAlias, privateKeyPass.toCharArray());//create basic structure of signaturejavax.xml.parsers.DocumentBuilderFactory dbf =javax.xml.parsers.DocumentBuilderFactory.newInstance();dbf.setNamespaceAware(true);DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(attachmentFile);XMLSignature sig =new XMLSignature(doc, BaseURI, XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1);//optional, but betterelement = doc.getDocumentElement();element.normalize();element.getElementsByTagName("soap:Header").item(0).appendChild(sig.getElement());{Transforms transforms = new Transforms(doc);transforms.addTransform(Transforms.TRANSFORM_C14N_OMIT_COMMENTS);//Sign the content of SOAP Envelopesig.addDocument("", transforms, Constants.ALGO_ID_DIGEST_SHA1);//Adding the attachment to be signedsig.addDocument("../resources/attachment.xml", transforms, Constants.ALGO_ID_DIGEST_SHA1);}//Signing procedure{X509Certificate cert =(X509Certificate) ks.getCertificate(certificateAlias);sig.addKeyInfo(cert);sig.addKeyInfo(cert.getPublicKey());sig.sign(privateKey);}//write signature to fileFileOutputStream f = new FileOutputStream(signatureFile);XMLUtils.outputDOMc14nWithComments(doc, f);f.close();}

首先,它读入用于签名的私钥。 要为您自己创建密钥对, 这篇文章会有所帮助。 然后,它创建了签名,并添加了SOAP消息和附件作为要签名的文档。 最后,它执行签名并将签名的文档写入文件。

签名的SOAP消息如下所示。

<soap:Envelope xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:pj="http://www.pjxml.org/namespaces/messageHeader"xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"><soap:Header><pj:MessageHeader pj:version="1.0" soap:mustUnderstand="1"><pj:From><pj:PartyId pj:type="ABCDE">FUN</pj:PartyId></pj:From><pj:To><pj:PartyId pj:type="ABCDE">PARTY</pj:PartyId></pj:To><pj:CPAId>uri:www.pjxml.org/socialService/Ping</pj:CPAId><pj:ConversationId>FUN PARTY FUN 59c64t0087fg3kfs000003n9</pj:ConversationId><pj:Service>uri:www.pjxml.org/socialService/</pj:Service><pj:Action>Ping</pj:Action><pj:MessageData><pj:MessageId>FUN 59c64t0087fg3kfs000003n9</pj:MessageId><pj:Timestamp>2013-10-22T17:12:20</pj:Timestamp></pj:MessageData></pj:MessageHeader><pj:Via pj:id="59c64t0087fg3ki6000003na" pj:syncReply="False" pj:version="1.0"soap:actor="http://schemas.xmlsoap.org/soap/actor/next" soap:mustUnderstand="1"><pj:Service>uri:www.pjxml.org/socialService/</pj:Service><pj:Action>Ping</pj:Action></pj:Via><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:SignedInfo><ds:CanonicalizationMethodAlgorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></ds:CanonicalizationMethod><ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></ds:SignatureMethod><ds:Reference URI=""><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod><ds:DigestValue>9RXY9kp/Klx36gd4BULvST4qffI=</ds:DigestValue></ds:Reference><ds:Reference URI="../resources/attachment.xml"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod><ds:DigestValue>3JcccO8+0bCUUR3EJxGJKJ+Wrbc=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>d0hBQLIvZ4fwUZlrsDLDZojvwK2DVaznrvSoA/JTjnS7XZ5oMplN9  THX4xzZap3+WhXwI2xMr3GKO................x7u+PQz1UepcbKY3BsO8jB3dxWN6r+F4qTyWa+xwOFxqLj546WX35f8zT4GLdiJI5oiYeo1YPLFFqTrwg==</ds:SignatureValue><ds:KeyInfo><ds:X509Data><ds:X509Certificate>                MIIDjTCCAnWgAwIBAgIEeotzFjANBgkqhkiG9w0BAQsFADB3MQswCQYDVQQGEwJMSzEQMA4GA1UE...............qXfD/eY+XeIDyMQocRqTpcJIm8OneZ8vbMNQrxsRInxq+DsG+C92b</ds:X509Certificate></ds:X509Data><ds:KeyValue><ds:RSAKeyValue><ds:Modulus>k5y0amGgOQ2O/St0Kc2/xye80tX2fDEKs2YOlM/zCknL8VgK0CbAKVAwvJoycQL9mGRkPDmbitHe............StGofmsoKURzo8hofYEn41rGsq5wCuqJhhHYGDrPpFcuJiuI3SeXgcMtBnMwsIaKv2uHaPRbNX31WEuabuv6Q==</ds:Modulus><ds:Exponent>AQAB</ds:Exponent></ds:RSAKeyValue></ds:KeyValue></ds:KeyInfo></ds:Signature></soap:Header><soap:Body><pr:GetPriceResponse xmlns:pr="http://www.pushpalankajaya.com/prices"><pr:Price>1.90</pr:Price></pr:GetPriceResponse></soap:Body>
</soap:Envelope>

在下一篇文章中,让我们看看如何验证此签名,以便我们可以保证签名的文档不会更改。

干杯!

参考: 签署SOAP消息–由我们的JCG合作伙伴 Pushpalanka在Pushpalanka的Blog博客上生成的信封XML签名 。

翻译自: https://www.javacodegeeks.com/2014/03/signing-soap-messages-generation-of-enveloped-xml-signatures.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019 The 19th Zhejiang University Programming Contest

感想&#xff1a; 今天三个人的状态比昨天计院校赛的状态要好很多&#xff0c;然而三个人都慢热体质导致签到题wa了很多发。最后虽然跟大家题数一样(6题)&#xff0c;然而输在罚时。 只能说&#xff0c;水题还是刷得少&#xff0c;看到签到都没灵感实在不应该。 题目链接&#…

openvas安装和基本使用

OpenVAS是开放式漏洞评估系统&#xff0c;也可以说它是一个包含着相关工具的网络扫描器。OpenVAS是开放式漏洞评估系统&#xff0c;也可以说它是一个包含着相关工具的网络扫描器。其核心部件是一个服务器&#xff0c;包括一套网络漏洞测试程序&#xff0c;可以检测远程系统和应…

修改mysql编码方式centos_CentOS下修改mysql数据库编码为UTF-8(附mysql开启远程链接和开放3306端口)...

楼主在配置好linux云服务器的jdk,tomcat,mysql后&#xff0c;当要开始部署项目是&#xff0c;忽然意识到一个很严重的问题&#xff0c;那就是数据库的编码问题&#xff0c;自安装完成后并未修改数据库的额编码。。。。下面就来讲说linux下修改mysql的编码问题吧。。有一个问题网…

srtvlet filter

Filter&#xff0c;过滤器&#xff0c;顾名思义&#xff0c;即是对数据等的过滤&#xff0c;预处理过程。为什么要引入过滤器呢&#xff1f;在平常访问网站的时候&#xff0c;有时候发一些敏感的信息&#xff0c;发出后显示时 就会将敏感信息用*等字符替代&#xff0c;这就是用…

mysql怎么合并行_mysql怎么合并行

mysql合并行的方法&#xff1a;使用函数【GROUP_CONCAT()】&#xff0c;代码为【SELECT am.activeId,GROUP_CONCAT(m.modelName SEPARATOR ‘,’) modelName】。【相关学习推荐&#xff1a;mysql学习】mysql合并行的方法&#xff1a;一个字段可能对应多条数据&#xff0c;用mys…

将旧项目从Ant迁移到Maven的4个简单步骤

一段时间以来&#xff0c;我们一直在考虑将构建从蚂蚁移植到Maven。 它发生在上个月&#xff0c;实际上比我们预期的要简单。 根据我的经验&#xff0c;这里简要介绍了我们遵循的步骤。 我们的应用程序是一个具有多个框架和技术的企业Web应用程序构建&#xff0c;并作为单个WAR…

折腾Java设计模式之建造者模式

博文原址&#xff1a;折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, allowing the same construction process to create various representations. 将复杂对象的构造与其表现分离&#xff0c;允许相同的构…

python小甲鱼练习题答案_小甲鱼Python第 013讲元组:戴上了枷锁的列表 | 课后测试题及参考答案...

测试题&#xff1a;0. 请用一句话描述什么是列表&#xff1f;再用一句话描述什么是元组&#xff1f;列表&#xff1a;一个大仓库&#xff0c;可以随时往里面添加和删除任何东西。元祖&#xff1a;封闭的列表&#xff0c;一旦定义&#xff0c;就不可改变(不能添加、删除或修改)1…

Vue--- 一点车项目

一点车项目 cli脚手架 组件化 数据交互路由指向存入数据库 前端页面 cli脚手架的安装与搭建 创建对应包 页面组件化编辑 &#xff08;共享组件&#xff1a;摘取出来一模一样的组件重用&#xff09;&#xff08;私有组件:在自己的组件写入 引入共享组件&#xff09; 数据交…

设计模式:模式或反模式,这就是问题

我最近遇到了Wiki页面“ Anti-pattern” &#xff0c;其中包含详尽的反模式列表。 其中一些对我来说很明显。 他们中的一些让我想了一下&#xff0c;其他的让我想了更多。 然后&#xff0c;我开始在页面上查找反模式“ singleton”&#xff0c;但找不到。 &#xff08;文本搜索…

Redis的散列类型

Redis是采用字典结构以key-value的形式存储数据的&#xff0c;在散列类型&#xff08;所谓的hash&#xff09;中的value也是一种字典结构。如果用关系表结构去理解&#xff0c;就是key为对象&#xff0c;value是属性和属性值。如下图&#xff1a; 所以使用散列&#xff08;hash…

easy html css tree 简单的HTML css导航树

code: show: 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

Java实现并发线程中线程范围内共享数据

---恢复内容开始--- 利用Map&#xff0c;HashMap键值对的数据结构&#xff0c;实现并发线程中线程范围内数据共享。 package cn.qy.heima2;import java.util.HashMap; import java.util.Map; import java.util.Random;public class ThreadScopeShareData {private static int …

18.11.16-高等数学-曲率计算

11.16 转载于:https://www.cnblogs.com/coder211/p/10005502.html

springboot干什么的_Spring Boot 项目的这些文件都是干啥用的?

上一讲我们用官网包或者 IDE 工具&#xff0c;快速构建了 Spring Boot 应用&#xff0c;并且看到了第一个程序的运行结果&#xff1a;Hello World&#xff01;本文我们了解下 Spring Boot 的目录结构&#xff0c;了解一个事物&#xff0c;清楚了它的结构&#xff0c;明白了内部…

微信小程序开发——点击按钮退出小程序的实现

微信小程序官方是没有提供退出的API的&#xff0c;但是在navigator这个组件中&#xff0c;是有退出这个功能的&#xff1a; 详情参考官方文档&#xff1a;navigator。 示例代码&#xff1a; 1 <navigator open-type"exit" target"miniProgram">关闭小…

使用RequestHandlerRetryAdvice重试Web服务操作

1.引言 有时在调用Web服务时&#xff0c;我们可能有兴趣在发生错误的情况下重试该操作。 使用Spring Integration时&#xff0c;我们可以使用RequestHandlerRetryAdvice类实现此功能。 此类将使我们在放弃并引发异常之前重试指定次数的操作。 这篇文章将向您展示如何完成此任务…

ASP.NET MVC如何做一个简单的非法登录拦截

摘要&#xff1a;做网站的时候&#xff0c;经常碰到这种问题&#xff0c;一个没登录的用户&#xff0c;却可以通过localhost:23244/Main/Index的方式进入到网站的内部&#xff0c;查看网站的信息。我们知道&#xff0c;这是极不安全的&#xff0c;那么如何对这样的操作进行拦截…

无法创建java虚拟机_创建java虚拟机失败的解决方法

创建java虚拟机失败的解决方法解决问题的步骤&#xff1a;1、从eclipse文件夹中打开eclipse.ini文件2、修改–launcher.XXMaxPermSize属性3、将值改为512m即可配置文件格式&#xff1a;-startupplugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar--launcher.libra…

java 泛型嵌套泛型_Java泛型嵌套

package com.study.generics;//泛型的嵌套使用public class GenericsDemo06 {public static void main(String []args) {GenericsComputer computer new GenericsComputer("联想笔记本电脑","联想");GenericsPeople people new GenericsPeople(computer)…