第五十五章 安全元素的详细信息 - 详情
本节讨论在消息头中用作 子元素的 元素。当以这种方式使用 时,可以在签名之前执行加密。以下显示了此元素的一个示例:
详情
在每个 元素中,URI 属性指向消息中其他位置的 元素的 Id 属性。
使用顶级 元素时, 的详细信息有所不同,如下所示:
| Scenario | ||
|---|---|---|
| Includes |
Does not include | |
| Top-level |
Does not include | Includes |
本节讨论在消息头中用作 子元素的 元素。当以这种方式使用 时,可以在签名之前执行加密。以下显示了此元素的一个示例:
在每个 元素中,URI 属性指向消息中其他位置的 元素的 Id 属性。
使用顶级 元素时, 的详细信息有所不同,如下所示:
| Scenario | ||
|---|---|---|
| Includes |
Does not include | |
| Top-level |
Does not include | Includes |
的目的是携带发送者和接收者可以独立使用的信息来生成相同的对称密钥。这些方可以使用该对称密钥对 SOAP 消息的相关部分进行加密、解密、签名和签名验证。
以下显示了部分示例:
<DerivedKeyToken xmlns="[parts omitted]ws-secureconversation/200512"
xmlns:wsc="[parts omitted]ws-secureconversation/200512"
wsu:Id="Enc-943C6673-E3F3-48E4-AA24-A7F82CCF6511">
<SecurityTokenReference xmlns="[parts omitted]oasis-200401-wss-wssecurity-secext-1.0.xsd">
<Reference URI="#Id-658202BF-239A-4A8C-A100-BB25579F366B"></Reference>
</SecurityTokenReference>
<Nonce>GbjRvVNrPtHs0zo/w9Ne0w==</Nonce>
</DerivedKeyToken>
一个将文件转换成Studio导出的xml格式的工具
通过此工具可以将本地文件转换成xml格式文件,然后通过Studio导入到服务器中,而不再需要其他工具将文件传至服务器。
下面以为ensemble2016自带的一个示例界面增加背景图为例。
http://localhost:57772/csp/samples/cinema/Cinema.csp
.png)
确定此示例界面的Web应用程序为:/csp/samples
选择本地电脑要作为背景图的图片
想要放到cinema下,故相对于web应用程序的路径为:cinema
想要将文件命名为:search_bg.jpg
然后修改下Search.csp的样式代码,就可以使用此背景图了
工具地址:
如何启用SSL协议,并能够在使用DBeaver连接时捕获SSL协议交互流量?
如果方便的话,能否提供一个假数据的ssl包?
非常感谢
的目的是携带可由消息接收者验证的数字签名。可以使用数字签名来检测消息更改,或者只是验证消息的某个部分是否确实由列出的实体生成。与传统的手写签名一样,数字签名是对文档的附加,只能由文档的创建者创建,并且不易伪造。
以下显示了部分示例:
<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">
<Reference URI="#SecurityToken-411A262D-990E-49F3-8D12-7D7E56E15081"
ValueType="[parts omitted]oasis-200401-wss-x509-token-profile-1.0#X509v3">
</Reference>
</SecurityTokenReference>
</KeyInfo>
</Signature>
的作用是携带加密数据,部分示例如下:
<EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#"
Id="Enc-143BBBAA-B75D-49EB-86AC-B414D818109F"
Type="http://www.w3.org/2001/04/xmlenc#Content">
<EncryptionMethod Algorithm="[parts omitted]#aes128-cbc"></EncryptionMethod>
<CipherData>
<CipherValue>MLwR6hvKE0gon[parts omitted]8njiQ==</CipherValue>
</CipherData>
</EncryptedData>
该元素的各部分如下:
Id 是元素的唯一标识符。 IRIS 会自动生成此标识符。MLwR6hvKE0gon[parts divided]8njiQ== 为加密数据。该元素的各部分如下:
在 IRIS 中,可以指定密钥传输算法(由 的 Algorithm 属性显示)。请参阅指定密钥传输算法。
IRIS 中, 包含 ,其具有以下形式之一:
WS-Security 标头中较早位置的 的引用,如前面的示例所示。在这两种情况下,相应的公钥都用于加密此 元素中携带的对称密钥。
如果加密使用顶级 元素,则省略此元素;请参阅 。
WtE[parts divided]bSyvg== 即为加密后的对称密钥。Id 属性。根据使用的技术,可能不包含此元素。可以通过顶级 元素链接 和相应的 ;请参阅 。
<EncryptedKey> 元素应包含在 <Security> 中,位于其使用的任何 <BinarySecurityToken> 之后,以及引用它的所有 <EncryptedData> 和 <DerivedKeyToken> 元素之前。
本主题讨论 SOAP 消息中较常见的安全元素,特别是 IRIS Web 服务和客户端可以发送的变体。此信息旨在帮助那些不经常使用 SOAP 的人重温记忆。此处的详细信息也可能有助于故障排除。
的目的是携带消息中其他元素使用的安全凭证,供消息接收者使用。安全凭证以序列化、编码的形式携带。以下显示了部分示例:
<BinarySecurityToken wsu:Id="SecurityToken-4EC1997A-AD6B-48E3-9E91-8D50C8EA3B53"
EncodingType="[parts omitted]#Base64Binary"
ValueType="[parts omitted]#X509v3">
MIICnDCCAYQ[parts omitted]ngHKNhh
</BinarySecurityToken>
该元素的各部分如下:
Id 是此令牌的唯一标识符,包含该标识符以便此消息中的其他元素可以引用此令牌。如有必要, IRIS 会自动生成此标识符。EncodingType 表示用于生成 <`BinarySecurityToken>IRIS中使用的唯一编码是base-64` 编码。本节讨论 IRIS Web 服务和 Web 客户端中可能出现的与安全相关的错误:
IRIS Web 服务或客户端,则可能尚未配置为识别 WS-Security 标头。在这种情况下,当您尝试执行 Web 方法时,会收到如下一般错误:<ZSOAP>zInvokeClient+269^%SOAP.WebClient.1
将以下内容添加到Web服务或客户端并重新编译:
Parameter SECURITYIN="REQUIRE";
这种一般错误也可能是由于错误地调用 方法(例如,在 Web 方法没有返回值时引用返回值)造成的。
如果使用 ,则此项不适用。
ERROR #6454: No supported policy alternative in configuration
Policy.Client.Demo1SoapConfig:service
本主题提供信息来帮助识别 IRIS 中 SOAP 安全问题的原因。
有关与安全无关的问题的信息,请参阅 IRIS 中的 问题故障排除。
要解决 SOAP 问题,通常需要以下信息:
WSDL 及其引用的所有外部文档。| Option | Usable with SSL/TLS? | Shows HTTP headers? | Comments |
|---|---|---|---|
| IRIS SOAP log | Yes | No | 对于安全错误,此日志显示的详细信息比 SOAP 故障中包含的更多。 |
| Web Gateway trace | Yes | Yes | 对于使用 MTOM(MIME 附件)的 SOAP 消息问题,查看 HTTP 标头至关重要。 |
| Third-party tracing tools | No | Depends on the tool | 一些跟踪工具还显示较低级别的详细信息,例如实际发送的数据包,这在进行故障排除时至关重要。 |
这 中的 SOAP 问题故障排除中进行了讨论。
SOAP 客户端会使用 `HTTP 身份验证,请注意,可以启用身份验证的日志记录;请参阅提供登录凭据。正确处理故障也非常有用,这样就可以收到最好的信息。请参阅
要添加带有 (其中包含 元素)的 ,请执行以下操作:
%SYS.X509Credentials 的实例。或者使用与签署断言时使用的相同凭证集。
SAML 断言对象的 Subject 属性的 NameID 属性。AddEncryptedKeyConfirmation() 方法。method AddEncryptedKeyConfirmation(credentials As %X509.Credentials) as %Status
对于参数,请使用之前创建的 %SYS.X509Credentials实例。
BinarySecret 作为密钥持有者要添加以 作为 Holder-of-key 的 ,请执行以下操作:
SAML 断言时,请按如下方式创建签名:其中断言是 SAML 断言。请注意,在此场景中使用 方法。 引用选项创建对 断言的引用。
Create() 方法:set binsec=##class(%SOAP.WST.BinarySecret).Create()
对于 ,请使用在上一步中创建的 。
开发者社区的成员,大家好!
我们都喜欢编码,但我们应该时不时地放下代码去锻炼身体! InterSystems 步行挑战将帮助您恢复精力、增强体质。 历史悠久的 Salt Road 在几个世纪以前连接起欧洲,沿着这条传奇的贸易路线,踏上从吕贝克到吕讷堡的虚拟赛道。
赢取跑步机、智能手表和奖牌等精美礼品。
👟🚶🧑🦼系紧鞋带,放下工作,更好地编码! 🔋💻💪
📅日期:9 月 23 日 - 10 月 20 日(可能有变动)
想加入吗? 详细信息如下。
要将 元素添加到 %SAML.Assertion 实例,执行以下操作:
%SAML.Subject 的新实例。Subject 属性设置为等于此实例。要将 元素添加到的 %SAML.Assertion 实例,请使用以下某个小节中的步骤。
Holder-of-key要使用 Holder-of-key 方法添加 ,请执行以下操作:
%SYS.X509Credentials 的实例。或者使用与签署断言时使用的相同凭证集。
要创建令牌,调用 的 类方法。例如:
set bst=##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(credset)
其中 是在上一步中创建的凭证集。
要将此令牌添加到 WS-Security 标头元素,请调用 客户端或 Web 服务的 属性的 方法。
包含序列化、base-64 编码格式的证书。可以忽略此令牌,而改用标识证书的信息;接收方使用此信息从相应位置检索证书。为此,请使用上述步骤,并进行以下更改:
2 和 3。也就是说,不要创建和添加 .。 set assertion=##class(%SAML.Assertion).CreateX509(credset,referenceOption)
对于 referenceOption,可选择指定一个值,如 X.509 凭证的参考选项中所述。可以使用除 $$$SOAPWSReferenceDirect 之外的任意值。
如果指定凭证集作为第一个参数(正如我们在这个变体中所做的那样),则默认引用选项是证书的指纹。
要创建未签名的 断言,请使用上述步骤,并进行以下更改:
1、 和 。也就是说,不要创建和添加 .。CreateX509()。此方法不带参数。例如: set assertion=##class(%SAML.Assertion).Create()
此方法返回 的一个实例。 会自动设置此实例的 和 属性。S 属性为空。
本主题描述如何将SAML 令牌添加到 WS-Security 标头元素。
另请参阅 %SAML.Assertion 的类参考和相关类。
未实现完整的 支持。 IRIS 中的 SAML 支持仅指 中的 支持中列出的详细信息。
借助 支持,可以将 令牌添加到 标头元素。
可以选择将此 令牌用作签名或加密的密钥材料。如果这样做, 将遵循 令牌配置文件规范。密钥材料来自 断言的 <SubjectConfirmation> 元素(带有 方法)和 <SubjectConfirmationData> 或 <KeyInfoConfirmationData>(带有 <KeyInfo> 子元素)。
或者,可以使用 方法添加 <SubjectConfirmation>;在这种情况下,主题不包含密钥。为了保护这种情况下断言,建议您添加从消息签名到 令牌的安全令牌引用。
要创建 SAML 令牌并将其添加到出站 消息,可以使用此处的基本过程或小节中描述的变体。
%soap.inc 包含文件,它定义了可能需要使用的宏。%SYS.X509Credentials 的实例,如以编程方式检索凭据集中所述。此 凭证集必须包含自己的证书。例如:
Set x509alias = "servercred"
Set pwd = "mypassword"
Set credset = ##class(%SYS.X509Credentials).GetByAlias(x509alias,pwd)
本演示程序用于展示如何采用自定义FHIR profile来验证数据合规性。自定义FHIR实施指南基于FHIR R4版本开发,在本例中实现了对Organization资源的扩展并用于验证数据的合规性。
FHIRValidation
├─ ExampleIG
│ ├─ ig.ini
│ ├─ input
│ │ ├─ fsh
│ │ │ ├─ alias.fsh
│ │ │ ├─ codesystems.fsh
│ │ │ ├─ organization.fsh
│ │ │ └─ valuesets.fsh
│ │ └─ pagecontent
│ │ └─ index.md
│ └─ sushi-config.yaml
├─ README.md
├─ README_zh.md
├─ TestCases
│ └─ FHIR Profile-based Validation testcases.postman_collection.json
├─ docker-compose.yml
└─ image-iris
├─ Dockerfile
└─ src
├─ FullIG
├─ IGPackages
│ ├─ hl7.fhir.uv.extensions.r4#5.1.0.tgz
│ ├─ hl7.terminology.r4#6.0.2.tgz
│ └─ package.tgz
└─ init
└─ init.sh
WS-ReliableMessaging 标头进行签名可以通过以下任一方式签署 WS-ReliableMessaging 标头。
SecurityContextToken 对标头进行签名如果还使用 WS-SecureConversation,则 Web 客户端的 SecurityContextToken 属性包含一个对称密钥,可以使用该密钥对 标头元素进行签名。为此,请在调用 实例的 方法,并将 属性作为参数传递:
do createsequence.AddSTR(client.SecurityContextToken)
在调用 之前执行此操作。
还可以使用与签署消息其余部分相同的方式签署 标头。为此,在调用 的 或 方法时,将值 添加到 参数。 宏包含在 文件中。
要修改 服务以支持 ,请修改 方法以便它们执行以下操作:
WS-ReliableMessaging 标头。WS-ReliableMessaging 标头是否已签名。请注意 会自动检查任何签名是否有效。请参阅验证和解密入站消息。
Foreign Table 是 IRIS SQL 中一种特殊类型的表。它不代表 IRIS 本地全局管理的数据,而是投射出来的,由 “外部服务器 ”管理的外部数据。从 SQL 的角度来看,外部表与普通表一样,可以在查询中使用,没有任何特定限制。
在数据编织中可以帮助整合不同的来源的数据,以支持各种应用、分析并提供智能洞察力。
各位社区成员,大家好!
我们想念 Global Masters,相信你们也是!
🚀 Global Masters 将于 2024 年 10 月 3 日再次启动!

IRIS 支持 WS-ReliableMessaging 规范的部分内容,如简介中所述。此规范提供了一种按顺序可靠地传递一系列消息的机制。本页介绍如何手动使用可靠消息传递。
Web 客户端发送一系列消息要将一系列消息从 客户端可靠地发送到支持 WS-ReliableMessaging 的 Web 服务,请执行以下操作:
Web 客户端的安全标头元素。如果正在使用 ,请启动安全对话。
%SOAP.RM.CreateSequence的 Create() 类方法。这将返回该类的一个实例。此方法具有以下签名:
classmethod Create(addressingNamespace As %String,
oneWay As %Boolean = 0,
retryInterval As %Float = 1.0,
maxRetryCount As %Integer = 8,
expires As %xsd.duration,
SSLSecurity As %Boolean = 0) as %SOAP.RM.CreateSequence
在使用FHIR进行开发的过程中,我们会面对海量的FHIR规范中定义的数据结构,具体来说在FHIR规范中定义了超过150个资源、700多个资源内元素。每个定义里都包括了对自身结构的描述以及数据约束、数据绑定值集等。对于一个开发人员要记住这些内容非常困难。
同时FHIR数据,特别是Json格式的FHIR数据是典型的“有向图”结构,它的资源中嵌套元素定义、集合以及复杂的资源间“关系”,在这些复杂结构的数据间导航并操作,非常困难。
.png)
在InterSystems IRIS for Health 2024.1之前,我们会将FHIR数据以Json文档的方式载入 %DynamicAbstractObject,例如下面的代码
set##class可以看到这样的处理有下面不方便的地方:
在InterSystems IRIS for Health 2024.1版本之后,引入了FHIR 对象模型。
在 HS.FHIRModel.R4 包下,每一个FHIR R4资源都对应一个ObjectScript类。比如 HS.FHIRModel.R4.
我们最近在向量搜索抢险体验计划中提供了新版的 InterSystems IRIS,新版本采用了新的基于分层可导航小世界 (HNSW) 索引算法的近似最近邻索引。 这一新增功能可对大型向量数据集进行高效的近似最近邻搜索,从而显著提高查询性能和可扩缩性。
HNSW 算法旨在通过构建基于图形的结构来优化高维数据的向量搜索,从而更快地在大型向量集合中找到近似邻。 无论您使用的是推荐系统、自然语言处理,还是其他机器学习应用,HNSW 都能显著缩短搜索时间,同时允许您调整准确度水平,但准确度提高的代价是查询时间变慢。
HNSW 的主要优点包括:
• 即使数据集规模不断扩大,也能加快搜索速度
• 减少内存占用,同时保持高准确度
• 与现有的 IRIS 向量搜索功能无缝集成
最新版本现已通过向量搜索抢先体验计划提供。 要参与,请在此处注册,下载新版本并开始测试。 我们正在持续增强向量搜索的功能,因此您的反馈至关重要!
我们鼓励您探索性能改进方法,并与社区分享您的想法。 如果您在抢先体验阶段遇到任何问题或有任何反馈,请联系我。
祝您编码愉快!
在 Web 服务使用 , 做出响应后,客户端实例和服务实例可以访问相同的对称密钥。有关此密钥的信息包含在两个实例的 SecurityContextToken 属性中。建议的程序如下:
SecurityOut 属性设置为 null,以删除请求消息中使用的安全标头。在 Web 服务中不需要这样做,因为 Web 服务会在每次调用后自动清除安全标头。
WS-Security 标头元素。为此,请调用 Web 客户端或 Web 服务的 属性的 方法。例如: set SCT=..SecurityContextToken
do ..SecurityOut.AddSecurityElement(SCT)
如果在下一步创建派生密钥令牌时使用 引用选项,则此步骤是必需的。否则,此步骤不是必需的。
%SOAP.WSSC.DerivedKeyToken 的 方法,如下所示: set dkenc=##class(%SOAP.WSSC.DerivedKeyToken).Create(SCT,refOpt)
在这种情况下,必须指定 Create() 的第一个参数,并且 refOpt
IRIS Web 服务以支持 WS-SecureConversation当 Web 客户端向 服务发送请求安全对话的消息时,安全对话就开始了。作为响应,Web 服务发送双方都可以使用的 。
要使 服务能够使用此令牌进行响应,请重写 服务的 OnStartSecureConversation() 方法。此方法具有以下签名:
Method OnStartSecureConversation(RST As %SOAP.WST.RequestSecurityToken) As
%SOAP.WST.RequestSecurityTokenResponseCollection
该方法应该执行以下操作:
SOAP 主体。OnStartSecureConversation() 发送的消息包含必须保护的信息;此信息在 主体中携带。根据需要,可以选择采用其他方式保护消息安全。
%SOAP.WST.Entropy 的 CreateBinarySecret() 方法。此方法返回表示随机服务器熵的该类的实例。该方法接受一个参数,即熵的大小(以字节为单位)。该实例表示 元素和其中包含的 。
IRIS 支持安全对话,遵循 WS-SecureConversation 1.3 规范。本页介绍如何手动创建安全对话。
在安全对话中,Web 客户端向 服务发出初始请求并接收包含 <`SecurityContextToken>` 的消息。此元素包含双方都可以使用的对称密钥的信息。此信息指的是只有双方知道的共享密钥。然后双方可以在后续交换中使用对称密钥,直到令牌过期或客户端取消令牌。
双方不应该直接使用 执行这些任务(不推荐),而应该从中生成一个 ,然后使用它进行加密、签名、解密和签名验证。
共享密钥可以通过以下任一方式指定:
Web 客户端启动安全对话。要在 IRIS 中执行此操作,请在 Web 客户端中执行以下操作:
SOAP 主体。客户端发送的请求包含必须保护的信息;此信息在 SOAP 主体中携带。根据需要,可以选择采用其他方式保护请求消息。
%SOAP.WST.Entropy的 CreateBinarySecret() 方法。此方法返回表示随机客户端熵的该类的实例。该方法接受一个参数,即熵的大小(以字节为单位)。 set clientEntropy=##class(%SOAP.WST.Entropy).CreateBinarySecret(32)
WS-Security了解 IRIS 网络服务有两个独立的机制在起作用是很有用的:IRIS 服务器和网络服务代码。
Web 应用程序指定允许的身份验证模式,从而控制对 %Service_WebGateway 服务的访问。(有关详细信息,请参阅时间戳和用户名令牌示例。有关更多背景信息,请参阅 Web 应用程序。)如果您选择密码选项,则 Web 应用程序可以接受 用户名/密码对;这称为实例身份验证。这些机制协同工作如下:
Web 服务将发出故障并退出。Web 应用程序选择了密码选项,则 服务将读取 元素,从中获取用户名和密码,并登录到 应用程序。服务对 参数的任何值( 除外)都执行此操作。
用户名可在 特殊变量和 服务的 Username 属性中找到。密码不可用。
注意:如果关联(和编译)配置类中存在安全策略,则 参数将被忽略。
在某些情况下,可能希望为 标头元素添加自定义处理。
✓ 九月有 47 位新成员加入
✓ 所有时间发布了 2,208 篇帖子
✓ 所有时间有 2,024 位成员加入
本主题介绍如何验证 IRIS Web 服务或 Web 客户端收到的消息中的安全元素(并自动解密任何加密内容)。
IRIS 网络服务和网络客户端可以验证入站 消息的 WS-Security 标头元素,以及自动解密入站消息。
服务和 客户端还可以处理已签名的 SAML 断言令牌并验证其签名。但是,验证 断言的详细信息是您的应用程序的责任。
如果使用安全策略,所有上述活动都是自动的。
在所有场景中, 都使用其根颁发机构证书集合;请参阅设置和其他常见活动。
要验证任何入站 SOAP 消息中包含的 标头元素,请执行以下操作:
Web 服务或 Web 客户端中,设置 参数。使用以下值之一:
REQUIRE — Web 服务或 Web 客户端验证 标头元素,如果不匹配或缺少此元素,则会发出错误。Web 客户端验证 W 标头元素。在这两种情况下, 服务或 Web 客户端都会验证 标头元素。它还会验证标头中 断言中的 签名(如果有)。如果合适,还会解密消息。
如果验证失败,则返回错误。
SECURITYIN 参数还有两个可能的值,可用于测试和故障排除:
WS-Security 中所述。为了向后兼容,此值是默认值。
签名然后加密(使用对称密钥时):
以下示例使用对称密钥进行签名和加密。它使用消息接收者的公钥创建一个 元素,然后使用该元素生成两个 元素,一个用于签名,一个用于加密:
// create UsernameToken
set userToken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
//get credentials of message recipient
set x509alias = "servernopassword"
set cred = ##class(%SYS.X509Credentials).GetByAlias(x509alias)
//get EncryptedKey element
set enc=##class(%XML.Security.EncryptedKey).CreateX509(cred,$$$SOAPWSEncryptNone)
do client.SecurityOut.AddSecurityElement(enc)
// get derived keys
set dkenc=##class(%SOAP.WSSC.DerivedKeyToken).Create(enc,$$$SOAPWSReferenceEncryptedKey)
do client.SecurityOut.AddSecurityElement(dkenc)
set dksig=##class(%SOAP.WSSC.DerivedKeyToken).Create(enc,$$$SOAPWSReferenceEncryptedKey)
do client.SecurityOut.AddSecurityElement(dksig)
// create and add signature
set sig=##class(%XML.Security.Signature).Create(dksig,,$$$SOAPWSReferenceDerivedKey)
do client.SecurityOut.AddSecurityElement(sig)
// ReferenceList to encrypt Body and Username. Add after signing
set reflist=##class(%XML.Security.ReferenceList).%New()
set refopt=$$$SOAPWSReferenceDerivedKey
set encryptedData=##class(%XML.Security.EncryptedData).Create(dkenc,userToken,refopt)
set dataref=##class(%XML.Security.DataReference).Create(encryptedData)
do reflist.AddReference(dataref)
set encryptedData=##class(%XML.Security.EncryptedData).Create(dkenc,"",refopt)
set dataref=##class(%XML.Security.DataReference).Create(encryptedData)
do reflist.AddReference(dataref)
do client.SecurityOut.AddSecurityElement(reflist)
// Add UsernameToken; force after ReferenceList so that it can decrypt properly
do client.SecurityOut.AddSecurityElement(userToken,reflist)