- 发送
SOAP消息。请参阅添加安全标头元素中的一般注释。
例如,以下客户端代码对 SOAP 主体和 进行加密:
// Create UsernameToken
set userToken=##class(%SOAP.Security.UsernameToken).SOAP 消息。请参阅添加安全标头元素中的一般注释。例如,以下客户端代码对 SOAP 主体和 进行加密:
// Create UsernameToken
set userToken=##class(%SOAP.Security.UsernameToken).进行加密
要使用 进行加密,请使用以下步骤:
并将其添加到 WS-Security 标头,如创建和添加 中所述。请注意,此步骤还会创建并添加 所基于的 元素。
元素。为此,请调用 %XML.Security.EncryptedData 的 Create() 类方法。在此过程中,请指定以下参数:a. 派生密钥令牌
b. 要加密的项目。省略此参数可加密正文。
c. 指定 元素如何引用 的宏。在此场景中,当前唯一支持的值是 $$$SOAPWSReferenceDerivedKey。
例如,加密 :
set refopt=$$$SOAPWSReferenceDerivedKey
set encryptedData=##class(%XML.Security.EncryptedData).Create(dkenc,userToken,refopt)
或者,加密正文:
set refopt=$$$SOAPWSReferenceDerivedKey
set encryptedData=##class(%XML.Security.HI 各位开发者们,
📅2024年9月23日🕑14:00-15:30🕞,InterSystems将举办线上研讨会,点击🔔此处🔔报名参会。
此次研讨会以“面向未来的数据平台——InterSystems IRIS五大亮点提速数据潜力挖掘与AI应用”为主题,帮助您了解InterSystems IRIS数据平台的五大亮点:
IRIS 支持 WS-SecureConversation 1.4 定义的 元素。可以创建并使用 元素进行加密和签名,作为前三个主题中描述的方法的替代。
通常,会同时执行加密和签名。为简单起见,本主题分别介绍这些任务。有关结合加密和签名的信息,请参阅结合加密和签名。
元素旨在携带发送者和接收者可以独立使用的信息来生成相同的对称密钥。这些方可以使用该对称密钥对 SOAP 消息的指定部分进行加密、签名或同时执行这两种操作。
要生成和使用 ,请执行以下操作:
元素。可以从该实体的请求消息中包含的 X.509 证书中获取公钥。或者可以提前获取它。
P_SHA1 算法从原始对称密钥计算出一个新的对称密钥。这将创建一个引用 元素的 元素。
对这些活动使用不同的对称密钥被认为是一种很好的做法,这样就可以减少用于分析的数据量。
元素和 。在 IRIS 中,派生密钥令牌也可以基于另一个派生密钥令牌。
作为参考,本节描述了后面几节中需要的常见活动。它描述了如何创建 并将其添加到 WS-Security 标头。您可以使用以下步骤或各小节中描述的变体。
%soap.InterSystems IRIS 数据平台作为关系数据库使用时,传统上以行为单位存储数据。现在,由于底层数据结构的灵活性,您也可以按列存储数据。虽然每种选择都有其优点,但在列中存储数据(称为列式存储)可以在数据分析的业务中显著提高各种用例的性能。列存储自2022.2 版的IRIS起做实验功能引入, 2023.1 起正式支持,到目前已经迭代了几个版本。
假设一家公司使用基于行的存储来保存收到的所有订单数据,跟踪订单 ID、订单日期、客户、优先级、状态和总金额等数据,使用行存储可以被示意为下面的图形:

每一行数据在逻辑上对应一个订单,单行中的所有数据在物理上存储在一起。
这种模式便于快速添加或更新订单。订单可以一次添加一个,数据库的每次写入正好对应一行。当发生了订单的事务,除了要更改的行之外,无需访问或更新表中的任何数据。
让我们考虑另外的情况:假设公司想找到每个月的平均销售收入。为此,您只需要两列的信息: 订单日期和总金额。但是,如果使用基于行的存储,则必须检索每个订单的所有数据才能获得此信息。即使在 OrderDate 列上使用了索引,仍需要读取日期范围内每个订单的完整行,才能获得总金额。如果订单数量较多,这样做的效率会非常低。
这就是列式存储的作用所在。数据不是按行存储在一起,而是按列存储在一起。从逻辑上讲,表和数据之间的关联保持不变。改变的只是物理存储方法。
还可以创建隐式 ,这是引用 的快捷方法。在此方法中:
的元素中, 元素指定 Nonce 属性,该属性包含用于 的 nonce 值。这向消息接收者表明派生密钥令牌是隐含的,并且是从引用的令牌派生的。要创建隐式 ,请使用前面描述的一般过程,但有两处更改:
Implied 属性设置为 1。 set dkt.Implied=1
元素添加到 WS-Security 标头元素。使用 的方式与将其包含在消息中的方式完全相同。
的 SHA1 哈希在此变体中(仅适用于 Web 服务),发送者不在消息中包含 元素,而是引用密钥的 SHA1 哈希。Web 服务可以引用在入站消息中收到的 元素。
使用前面的一般程序,但需做以下更改:
2-4 是可选的。.5(不要添加 )。6 中,当您使用 Create() 创建派生密钥令牌时,若要使用从客户端收到的 ,请省略第一个参数。或者,如果您已创建 ,请将其用作第一个参数。指定 $$$SOAPWSReferenceEncryptedKeySHA1
使用向量搜索在 IRIS for Health 上运行的病人相似性比较演示。 使用向量搜索计算相似度,在向量基础上比较不同病人之间的个人属性,如姓名、出生日期、地址等。得分越高,被比较的病人越有可能是同一个人。 本演示程序使用 sentence-transformers model 将文本转换为向量,然后使用 IRIS 向量函数来存储、读取和比较向量。

的规范化方法默认情况下, 元素使用Exclusive XML Canonicalization进行规范化,
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
要使用包容性 XML 规范化来规范化此元素,请执行以下操作:
Set sig.SignedInfo.CanonicalizationMethod.Algorithm=$$$SOAPWSc14n
其中 sig 是 %XML.Security.Signature 的实例。
在这种情况下, 包含以下内容:
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315">
WS-Security 1.1 功能使 Web 客户端能够确保收到的 SOAP 消息是响应 Web 客户端发送的原始请求而生成的。客户端请求通常经过签名,但并非必须如此。在此机制中,Web 服务将 元素添加到安全标头元素,Web 客户端可以检查该 元素。
默认情况下,签名的摘要值是通过 SHA-1 算法计算的,安全标头中的 元素包含如下内容:
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod>
<DigestValue>waSMFeYMruQn9XHx85HqunhMGIA=</DigestValue>
可以为签名指定不同的摘要方法。为此,调用 %XML.Security.Signature 实例的 SetDigestMethod() 方法。对于参数,请使用以下宏之一(包含在 %soap.inc 文件中):
$$$SOAPWSsha1 (the default)-$$$SOAPWSsha256
$$$SOAPWSsha384
$$$SOAPWSsha512
do sig.SetDigestMethod($$$SOAPWSsha256)
默认情况下,签名值是通过 RSA-SHA256 算法计算的,安全标头中的 元素包含如下内容:
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha256"></SignatureMethod>
.要添加在签名的 SAML 断言中使用证书的数字签名,请执行以下操作:
%soap.inc 包含文件,它定义了可能需要使用的宏。 set utoken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
Holder-of-key 方法的 元素创建签名的 SAML 断言。请参阅创建和添加 SAML 令牌。 元素。创建时,使用已签名的 SAML 断言作为 CreateX509() 类方法的第一个参数。例如: set signature=##class(%XML.Security.EncryptedKey).CreateX509(signedassertion)
WS-Security 标头元素。为此,请调用 Web 客户端或 Web 服务的 SecurityOut 属性的 AddSecurityElement() 方法。对于参数,请指定上一步中创建的签名对象。例如: do ..SecurityOut.AddSecurityElement(dsig)
SOAP 消息。此示例显示了对其响应消息进行签名的 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 .本主题介绍如何向 IRIS Web 服务和 Web 客户端发送的 SOAP 消息添加数字签名。
通常,会同时执行加密和签名。为简单起见,本主题仅介绍签名。有关结合加密和签名的信息,请参阅主题结合加密和签名。
主题使用派生密钥令牌进行加密和签名描述了向 SOAP 消息添加数字签名的另一种方法。
可以使用数字签名来检测消息是否被篡改,或者简单地验证消息的某一部分是否确实由所列实体生成。与传统的手工签名一样,数字签名是对文档的附加,只有文档的创建者才能创建,并且不容易伪造。
IRIS 对 SOAP 消息的数字签名的支持基于 WS-Security 1.1。反过来,WS-Security 遵循 XML 签名规范。根据后者的规范,要对 XML 文档进行签名:
元素,其中包含以下信息:此信息可以包含在元素中,或者 元素可以包含对包含 X.509 证书或签名的 SAML 断言的二进制安全令牌的直接引用。在后一种情况下,必须在添加 元素之前将安全令牌添加到消息中。
此信息还可以让收件人验证您是公钥/私钥对的所有者。
以下示例调用 Web 客户端并发送已加密的 。在此示例中,正文未加密。
Set client=##class(XMLEncrSecHeader.Client.XMLEncrSecHeaderSoap).%New()
// Create UsernameToken
set user="_SYSTEM"
set pwd="SYS"
set userToken=##class(%SOAP.Security.UsernameToken).Create(user,pwd)
//get credentials for encryption
set cred = ##class(%SYS.X509Credentials).GetByAlias("servernopassword")
//get EncryptedKey element and add it
set encropt=$$$SOAPWSEncryptNone ; means do not encrypt body
set enckey=##class(%XML.Security.EncryptedKey).本主题介绍如何加密 Web 服务和 Web 客户端发送的消息中的 WS-Security 标头内的元素。(此处描述的工具也可单独使用或与安全标头元素结合使用来加密 SOAP 主体。)
通常,会同时执行加密和签名。为简单起见,本主题仅介绍加密。有关结合加密和签名的信息,请参阅结合加密和签名。
使用派生密钥令牌进行加密和签名主题描述了加密 SOAP 消息部分内容的另一种方法。
与上一主题中显示的加密技术不同,加密 WS-Security 标头元素的过程要求您指定 元素如何连接到相应的 元素。
要加密安全标头元素,请执行以下操作:
%soap.inc 包含文件,它定义了可能需要使用的宏。 set userToken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
SOAP 消息的实体的公钥的凭证集。请参阅以编程方式检索凭证集。 set credset=..SecurityIn.Signature.X509Credentials
请务必检查返回对象的类型,看它是否是 %SYS.X509Credential的实例,如以编程方式检索凭据集中所述。
%XML.要使用签名的 SAML 断言中的证书中包含的公钥进行加密,请执行以下操作:
1–4。Holder-of-key 方法的 元素创建签名的 SAML 断言。请参阅创建和添加 SAML 令牌。 元素。执行此操作时,使用签名的 SAML 断言作为 CreateX509() 类方法的第一个参数。例如: set enckey=##class(%XML.Security.EncryptedKey).CreateX509(signedassertion)
在此示例中,Web 客户端(未显示)发送签名的请求消息,而 Web 服务发送加密响应。
Web 服务从请求消息签名中的客户端证书中获取公钥,并使用该公钥在其响应中添加一个加密的 元素。 元素使用客户端的公钥加密,它包含用于加密响应消息正文的对称密钥。
Web服务如下:
Class XMLEncr.DivideWS Extends %SOAP.WebService
{
Parameter SECURITYIN = "REQUIRE";
Parameter SERVICENAME = "XMLEncryptionDemo";
Parameter NAMESPACE = "http://www. 包含序列化、base-64 编码格式的证书。可以忽略此令牌,而改用标识证书的信息;接收方使用此信息从相应位置检索证书。为此,请使用上述步骤,并进行以下更改:
3 和 4。也就是说,不要添加 。5(创建加密密钥)中,使用步骤 1 中设置的凭据(而不是二进制安全令牌)作为 CreateX509() 的第一个参数。例如: set enckey=##class(%XML.Security.EncryptedKey).CreateX509(credset,,referenceOption)
对于第三个参数(referenceOption),可以指定 元素如何使用证书。
如果指定一个凭据集作为第一个参数(正如我们在此变体中所做的那样),则referenceOption的默认值为$$$SOAPWSReferenceThumbprint。 可以选择指定一个值,如本节所述。 可以使用除$$$SOAPWSReferenceDirect之外的任何值。
X.509 证书的参考选项WS-Security 标头简介部分介绍了在 SOAP 消息中使用证书的一种方法。在该示例中,数字签名由两个标头元素组成:
元素,以序列化的base-64 编码形式携带证书。 元素,带有签名并且包含对二进制安全令牌的直接引用。本主题主要介绍如何手动向 IRIS Web 服务和 IRIS Web 客户端发送的消息中添加安全元素。
以下主题提供了有关特定安全任务的详细信息。
要将安全元素添加到 WS-Security 标头元素,请在 Web 客户端或 Web 服务中使用以下常规过程:
Create() 或 CreateX509() 的方法(具体取决于类)。该实例表示 WS-Security 标头元素之一,例如 or 。Web 服务的 SecurityOut 属性,将每个实例添加到 WS-Security 标头元素。为此,请调用 AddSecurityElement() 方法。SOAP 消息。WS-Security 标头包含在消息中,并包含添加到其中的元素。Web 客户端,SecurityOut 属性保持不变,以便此实例的后续出站消息包含添加的安全标头。如果不希望这样,请将 SecurityOut 属性设置为 null。Web 服务,在第一个出站 SOAP 消息之后,SecurityOut属性会自动设置为null`。当将多个安全元素添加到标头时,按适当的顺序添加安全标头元素非常重要。
本主题介绍如何加密 IRIS Web 服务和 Web 客户端发送的 SOAP 消息正文。
主题“加密安全标头元素”和“使用派生密钥令牌进行加密和签名”描述了如何加密安全标头元素以及加密 SOAP 主体的其他方法。
IRIS 对 SOAP 消息加密的支持基于 WS-Security 1.1。反过来,WS-Security 遵循 XML 加密规范。根据后者规范,要加密 XML 文档:
使用包含内容加密版本的 元素替换文档的这些部分。
可以从该实体的请求消息中包含的 X.509 证书中获取公钥。或者可以提前获取它。
元素中包含加密的对称密钥。 元素直接或间接地提供信息,使接收者能够确定用于解密此元素的密钥。此信息可以包含在 元素中,或者 元素可以包含对包含 X.509 证书或签名的 SAML 断言的二进制安全令牌的直接引用。在后一种情况下,必须在添加 元素之前将安全令牌添加到消息中。
文档可以包含多个 元素,适用于文档的不同加密部分。
其他主题介绍了加密 SOAP 消息部分内容的其他方法。
此示例显示了一个需要密码验证的 Web 服务,以及一个在其请求消息中发送时间戳和用户名令牌的 Web 客户端。
注意:此示例以明文形式发送用户名和密码。
为了使此示例在自己的环境中运行,请首先执行以下操作:
Web 服务所属的 Web 应用程序,将该应用程序配置为仅支持密码验证:Web服务如下:
Class Tokens.DivideWS Extends %SOAP.WebService
{
Parameter SECURITYIN = "REQUIRE";
/// Name of the Web service.
Parameter SERVICENAME = "TokensDemo";
/// SOAP namespace for the Web service
Parameter NAMESPACE = "http://www.myapp.org";
/// Divide arg1 by arg2 and return the result.本主题讨论时间戳和用户令牌。
时间戳是 WS-Security 标头中的 安全元素。严格来说,时间戳不是安全元素。但是,可以使用它来避免重放攻击。时间戳对于自定义日志记录也很有用。
用户名令牌是 WS-Security 标头中的 安全元素;它带有用户名。它还可以带有相应的密码(可选为摘要形式)。通常使用它进行身份验证,即允许 IRIS Web 客户端使用需要密码的 Web 服务。
注意:默认情况下,WS-Security 标头元素以明文形式发送。要保护 中的密码,应该使用 SSL/TLS、加密 (如其他地方所述),或者使用这些技术的某种组合。
要将时间戳添加到 WS-Security 标头元素,请在 Web 客户端或 Web 服务中执行以下操作:
%SOAP.Security.Timestamp的 Create() 类方法。此方法需要一个可选参数(以秒为单位的过期间隔)。默认过期间隔为 300 秒。例如: set ts=##class(%SOAP.Security.Timestamp).Create()
此方法创建 %SOAP.Security.Timestamp 的实例,设置其 Created、Expires 和 TimestampAtEnd 属性的值,并返回该实例。此实例表示 标头元素。
本节提供了一些自定义配置类的示例。
以下配置类包括两种策略选择:使用 WS-Addressing 标头或不使用。
/// PolicyAlternatives.DivideWSConfig
Class PolicyAlternatives.DivideWSConfig Extends %SOAP.Configuration
{
XData service
{
<cfg:configuration xmlns:cfg="http://www.intersystems.com/configuration"
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
xmlns:wsap="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:wsp="http://www.w3.org/ns/ws-policy"
name="service">
<cfg:service classname="PolicyAlternatives. 元素将策略与父 元素指定的 Web 服务或客户端内的特定 Web 方法相关联。 元素包括以下项目:
Attribute or Element |
Purpose |
|---|---|
name |
Web 方法的名称。 |
|
(包括 0 或 1)指定要应用于此 Web 服务或客户端的策略(在操作级别)。指定 WS-Policy 1.2 或 WS-Policy 1.5 策略表达式。指定, , 或不指定。 |
|
(包括 0 或 1)为此 Web 方法指定可选的引用 WS-Policy 1.2 或 WS-Policy 1.5 策略表达式。policyID 属性是对同一配置类中不同 XData 块中定义的本地策略的引用。有关示例,请参阅使用 PolicyReference 的配置。指定 , 或两者都不指定。 |
|
(包括 0 或 1)将策略与 Web 方法的请求消息关联。 |
|
(包括 0 或 1)将策略与 Web 方法的响应消息关联。 |
在 的 子元素中,可以指定 cfg:wsdlElement 属性,该属性指定要将此策略元素附加到 WSDL 的哪个部分。在此上下文中,此属性可以具有以下任意值:
binding”(默认)— 将此策略元素附加到 WSDL 元素。XData 块的详细信息本节介绍 Web 服务或客户端配置类的 XData 块的内容。
, , , and 元素都必须位于以下命名空间中:
"http://www.intersystems.com/configuration"
在本主题中,前缀 cfg 指的是该命名空间。
元素是 XData 块中的根元素。此元素包括以下项目:
| Attribute or Element | Purpose |
|---|---|
name |
(可选)此配置的名称。如果指定,则必须与 XData 块的名称匹配。 |
|
(可选)将策略与 IRIS Web 服务或 Web 客户端关联。 |
元素将策略与 IRIS Web 服务或 Web 客户端关联。此元素包括以下项目:
| Attribute or Element | Purpose |
|---|---|
classname |
(必填) IRIS 网络服务或客户端的完整包和类名。 |
|
(包括 0 或 1)指定要应用于此 Web 服务或客户端的策略(在绑定级别)。指定 WS-Policy 1.2 或 WS-Policy 1.5 策略表达式。指定 , 或不指定。 |
|
(包括 0 或 1)指定要应用于此 Web 服务或客户端(在绑定级别)的策略引用。 |
我使用%SYSTEM.WorkMgr的多进程(.png)
他们的状态是evtw,如果我执行了很多次这样的操作,进程就会越来越多,它会导致服务器卡顿等异常,但是过一会儿他们会消失,留一个.png)
它不会消失。它产生的子进程其实是可以使用
我的问题是如何正确的结束%SYSTEM.WorkMgr产生的子进程,如何避免服务器因此受到影响甚至宕机,为什么他会导致服务器出问题,有什么办法能再使用完成后,把 %SYSTEM.WorkMgr相关的进程正确的快速结束掉
Hi 开发者们,
2024年8月,我们继续💡“中文社区最佳贡献奖”💡活动,截至目前,社区共有成员1900余人,8月新增成员30人。
Hi开发者们,
我们很高兴邀请大家参加我们的新一轮开发者竞赛,此次竞赛致力于创造有用的工具,让开发伙伴们的生活更轻松:
🏆 InterSystems 2024开发者竞赛:开发者工具(Tools) 🏆
欢迎提交有助于加快开发速度、贡献更多定性代码,并有助于使用 InterSystems IRIS 测试、部署、支持或监控您的解决方案的应用程序。
时间:2024年9月9日-29日(美国东部时间)
奖金池:14,000美元
.jpg)
除了 cfg:wsdlElement 属性(前面讨论过)之外,可能还需要在策略元素中的以下元素中添加扩展属性:
(在 or 内)
在此元素中,为 cfg:FindField 和 cfg:FindValue 属性指定一个值,这些值指定用于此令牌的 IRIS 凭证集。
cfg:FindField 属性指定要搜索的字段的名称。通常为 Alias。cfg:FindValue 属性指定该字段的值。如果 cfg:FindField 是 Alias,则这是 IRIS 凭证集的名称。例如:
<sp:X509Token IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never"
cfg:FindField="Alias"
cfg:FindValue="servercred">
<wsp:Policy>
<sp:WssX509V3Token11/>
</wsp:Policy>
</sp:X509Token>
在此元素中,为 cfg:SSLConfiguration 属性指定一个值。
当进程中的数据不需要持久化保存,但又需要用到global的高性能特性时,我们常常将数据保存在临时global中,也就是保存在IRISTEMP/CACHETEMP数据库中。
系统使用 IRISTEMP/CACHETEMP 数据库保存临时的数据,用户也可以进行同样的操作。
关于临时global以及IRISTEMP数据库的更多内容,可以参见文档 Temporary Globals and the IRISTEMP Database
以下情况global作为临时使用:
作为参考,本主题包含有关 IRIS 用于存储 WS-Policy 信息的配置类的详细信息。
要手动创建 WS-Policy 配置类,请创建 %SOAP.Configuration 的子类。在此类中,添加 XData 块,如下所示:
XData service
{
<cfg:configuration xmlns:cfg="http://www.intersystems.com/configuration" name="service">
...
XData 块具有以下一般结构:
XData service
{
<cfg:configuration ...>
<service ...>
<method ...>
<request ...>
<response ...>
...
, , , and 元素均可包含适用于该级别的策略信息。 元素是必需的,但其他元素是可选的。
如果包含策略信息,则该信息要么是策略表达式(即 元素),要么是策略引用(即指向同一配置类中另一个 XData 块中包含的策略的 元素)。以下部分提供了更多详细信息。
请注意, 仅在两个位置受支持:代替配置元素内的 元素或作为 元素的唯一子元素。
✓ 八月有 51 位新成员加入
✓ 所有时间发布了 2,163 篇帖子
✓ 所有时间有 1,975 位成员加入