第二十六章 添加数字签名 - 示例

embedded/2024/11/10 13:50:49/

文章目录

  • 第二十六章 添加数字签名 - 示例
  • 示例
  • 使用带签名的证书的其他方法
    • 变体:使用可识别证书的信息
    • 示例

第二十六章 添加数字签名 - 示例

示例

此示例显示了对其响应消息进行签名的 Web 服务。

为了使此示例在自己的环境中运行,请首先执行以下操作:

  • 为服务器创建证书。
  • 将此证书加载到服务器端的 IRIS 中,创建名为 servercred 的凭证。执行此操作时,还要加载私钥文件并提供其密码(这样 Web 服务在签署其响应消息时就不必提供该密码。)

Web 服务指的是具有此确切名称的 IRIS 凭证集。

Class DSig.DivideWS Extends %SOAP.WebService
{///  Name of the Web service.
Parameter SERVICENAME = "DigitalSignatureDemo";///  SOAP namespace for the Web service
Parameter NAMESPACE = "http://www.myapp.org";/// use in documentation
Method Divide(arg1 As %Numeric = 2, arg2 As %Numeric = 8) As %Numeric [ WebMethod ]
{Do ..SignResponses()Try {Set ans=arg1 / arg2}Catch{Do ..ApplicationError("division error")}Quit ans
}/// use in documentation
/// signs and includes a binary security token
Method SignResponses()
{//Add timestamp because that's commonly doneSet ts=##class(%SOAP.Security.Timestamp).Create()Do ..SecurityOut.AddSecurityElement(ts)//access previously stored server certificate & private key file//no need to use private key file password, because that has been savedSet x509alias = "servercred" Set cred = ##class(%SYS.X509Credentials).GetByAlias(x509alias)set bst=##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(cred)do ..SecurityOut.AddSecurityElement(bst)//Create WS-Security Signature objectSet signature=##class(%XML.Security.Signature).CreateX509(bst)//Add WS-Security Signature object to the outbound messageDo ..SecurityOut.AddSecurityElement(signature)Quit
}///  Create our own method to produce application specific SOAP faults.
Method ApplicationError(detail As %String)
{Set fault=##class(%SOAP.Fault).%New()Set fault.faultcode=$$$FAULTServerSet fault.detail=detailSet fault.faultstring="Application error"// ReturnFault must be called to send the fault to the client.// ReturnFault will not return here.Do ..ReturnFault(fault)
}}

使用带签名的证书的其他方法

在上一节讨论的基本过程中,使用 <BinarySecurityToken> 包含序列化、base-64 编码格式的证书。除了包含证书之外,还可以使用标识证书的信息。或者,可以将证书包含在签名的 SAML 断言中。本节讨论了这些变体。

变体:使用可识别证书的信息

可以包含标识证书的信息,而不是在邮件中包含证书。收件人使用此信息从适当的位置检索证书。为此,请使用上一节中的步骤,并进行以下更改:

  • 跳过步骤 45。也就是说,不要添加 <BinarySecurityToken>
  • 在步骤 6(创建签名)中,使用步骤 1 中设置的凭证(而不是二进制安全令牌)作为 CreateX509() 的第一个参数。例如:
 set dsig=##class(%XML.Security.Signature).CreateX509(credset,,referenceOption)

对于第三个参数(referenceOption),可以指定<Signature> 元素如何使用证书。

如果指定一个凭据集作为第一个参数(正如我们在此变体中所做的那样),则referenceOption的默认值为$$$SOAPWSReferenceThumbprint。 可选地指定一个值,如X.509凭据的参考选项中所述。 您可以使用除$$$SOAPWSReferenceDirect之外的任何值。

示例

此示例是本主题中先前示例的变体。

Method SignResponses()
{//Add timestamp because that's commonly doneSet ts=##class(%SOAP.Security.Timestamp).Create()Do ..SecurityOut.AddSecurityElement(ts)//access previously stored server certificate & private key file//no need to use private key file password, because that has been savedSet x509alias = "servercred" Set cred = ##class(%SYS.X509Credentials).GetByAlias(x509alias)//Create WS-Security Signature objectSet signature=##class(%XML.Security.Signature).CreateX509(cred)//Add WS-Security Signature object to the outbound messageDo ..SecurityOut.AddSecurityElement(signature)Quit
}

在这种情况下,Web 服务发送如下响应消息:

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope [parts omitted]><SOAP-ENV:Header><Security xmlns="[parts omitted]oasis-200401-wss-wssecurity-secext-1.0.xsd"><Timestamp xmlns="[parts omitted]oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-48CEE53E-E6C3-456C-9214-B7D533B2663F"><Created>2010-03-19T14:35:06Z</Created><Expires>2010-03-19T14:40:06Z</Expires></Timestamp><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha256"></SignatureMethod><Reference URI="#Timestamp-48CEE53E-E6C3-456C-9214-B7D533B2663F"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>waSMFeYMruQn9XHx85HqunhMGIA=</DigestValue></Reference><Reference URI="#Body-73F08A5C-0FFD-4FE9-AC15-254423DBA6A2"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>wDCqAzy5bLKKF+Rt0+YV/gxTQws=</DigestValue></Reference></SignedInfo><SignatureValue>j6vtht/[parts omitted]trCQ==</SignatureValue><KeyInfo><SecurityTokenReference xmlns="[parts omitted]oasis-200401-wss-wssecurity-secext-1.0.xsd"><KeyIdentifier EncodingType="[parts omitted]#Base64Binary" ValueType="[parts omitted]#ThumbprintSHA1">WeCnU2sMyOXfHH8CHTLjNTQQnGQ=</KeyIdentifier></SecurityTokenReference></KeyInfo></Signature></Security></SOAP-ENV:Header><SOAP-ENV:Body wsu:Id="Body-73F08A5C-0FFD-4FE9-AC15-254423DBA6A2">[omitted]</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

http://www.ppmy.cn/embedded/112480.html

相关文章

JQuery简介 - 什么是jQuery

jQuery 是一个快速、小巧、功能丰富的 JavaScript 库。它使得 HTML 文档遍历和操作、事件处理、动画和 Ajax 交互对于 Web 开发来说更加简单和快捷。jQuery 设计的宗旨是“write less, do more”&#xff08;写得更少&#xff0c;做得更多&#xff09;&#xff0c;它封装了 Jav…

【深度学习】Pytorch基础

目录 梯度下降算法&#xff08;Gradient Descent&#xff09;代码实现 梯度下降算法&#xff08;Gradient Descent&#xff09; 梯度下降算法在机器学习中应用十分的广泛&#xff0c;不论是在线性回归还是Logistic回归中&#xff0c;它的主要目的是通过迭代找到目标函数的最小…

PHP环境搭建

PHP环境搭建教程 PHP 是一种流行的后端开发语言&#xff0c;用于构建动态网站和 Web 应用程序。在开发和部署 PHP 项目之前&#xff0c;您需要设置一个适当的 PHP 环境。本教程将帮助您在不同操作系统上快速搭建 PHP 环境。 1. 环境准备 1.1 操作系统 本教程将介绍在以下操作…

如何动态获取路由上的参数

如何动态获取路由上的参数 在许多后端框架中&#xff0c;可以通过路由参数来动态获取URL中的参数。下面是一些常见的后端框架的示例代码&#xff1a; 1. Express.js (Node.js) app.get(/users/:userId, (req, res) > {const userId req.params.userId; // 获取路由参数…

【AcWing】【Go】789. 数的范围

AcWing 789. 数的范围 这是一道二分的模板题&#xff0c;来自于AcWing&#xff0c;使用Go语言重新实现一遍C中二分查找算法的模板&#xff0c;代码如下&#xff1a; package mainimport "fmt"func main() {var n, k intfmt.Scanf("%d %d", &n, &…

小程序开发设计-第一个小程序:创建小程序项目④

上一篇文章导航&#xff1a; 小程序开发设计-第一个小程序&#xff1a;安装开发者工具③-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142219152?spm1001.2014.3001.5501 须知&#xff1a;注&#xff1a;不同版本选项有所不同&#xff0c;并无大碍。 一、创…

在Flask中实现日志记录

在Flask中实现日志记录是一个关键的功能&#xff0c;它有助于监控应用的运行情况、调试问题以及记录重要的运行信息。以下是在Flask中实现日志记录的详细步骤和最佳实践&#xff1a; 一、使用Python内置的logging模块 Flask应用通常会使用Python的logging模块来进行日志记录。…

C#迭代器方法和yield用法

一.迭代器方法介绍 可使用foreach循环进行遍历的方法&#xff0c;称为迭代器方法。 迭代器方法使用yield return语句返回元素。 到达yield return语句时&#xff0c;会记住当前在代码中的位置。 下次调用迭代器函数时&#xff0c;将从该位置开始执行。换言之&#xff0c;如果…