文章 Michael Lei · 九月 27, 2024 9m read

在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:

  • Git 101
  • Git 流程(开发流程)
  • GitLab 安装
  • GitLab 工作流
  • 持续交付
  • GitLab 安装和配置
  • GitLab CI/CD
  • 为何使用容器?
  • 容器基础架构
  • 使用容器的 CD
  • 使用 ICM 的 CD

在本文中,我们将使用 InterSystems Cloud Manager 构建持续交付。 ICM 是一个面向基于 InterSystems IRIS 的应用程序的云配置和部署解决方案。 它允许您定义所需部署配置,ICM 会自动提供这些配置。 有关详情,请参阅 ICM 概述

0
0 234
文章 Michael Lei · 九月 27, 2024 9m read

在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:

  • Git 101
  • Git 流程(开发流程)
  • GitLab 安装
  • GitLab 工作流
  • 持续交付
  • GitLab 安装和配置
  • GitLab CI/CD
  • 为何使用容器
  • 容器基础架构
  • 使用容器的 CD

第一篇文章中,我们介绍了 Git 基础知识、深度理解 Git 概念对现代软件开发至关重要的原因,以及如何使用 Git 开发软件。

第二篇文章中,我们介绍了 GitLab 工作流 – 一个完整的软件生命周期流程,并介绍了持续交付。

第三篇文章中,我们介绍了 GitLab 安装和配置以及将环境连接到 GitLab

第四篇文章中,我们编写了 CD 配置。

第五篇文章中,我们讨论了容器以及使用容器的方式(和原因)。

第六篇文章中,我们将探讨运行包含容器的持续交付管道所需的主要组件以及这些组件如何协同运行。

在这篇文章中,我们将构建上一篇文章中探讨的持续交付配置。

0
0 393
文章 Michael Lei · 九月 27, 2024 2m read

在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:

  • Git 101
  • 流程(开发流程)
  • GitLab 安装
  • GitLab 工作流
  • 持续交付
  • GitLab 安装和配置
  • GitLab CI/CD
  • 为何使用容器?
  • 容器基础架构
  • 使用容器的 GitLab CI/CD

第一篇文章中,我们介绍了 Git 基础知识,以及为什么对 Git 概念的高层次理解对于现代软件开发如此重要,以及如何使用 Git 开发软件。

第二篇文章中,我们介绍了 GitLab 工作流 – 一个完整的软件生命周期流程和持续交付。

第三篇文章中,我们介绍了 GitLab 的安装和配置以及如何将环境连接到 GitLab。

第四篇文章中,我们编写了 CD 配置。

第五篇文章中,我们讨论了容器与如何(以及为什么)使用它们。

在本文中,我们将探讨运行使用容器的持续交付管道所需的主要组件,以及它们如何协同工作。

0
0 251
文章 Michael Lei · 九月 27, 2024 4m read

在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:

  • Git 101
  • Git 流程(开发流程)
  • GitLab 安装
  • GitLab 工作流
  • 持续交付
  • GitLab 安装和配置
  • GitLab CI/CD
  • 为何使用容器
  • 使用容器的 GitLab CI/CD

第一篇文章中,我们介绍了 Git 基础知识、深度理解 Git 概念对现代软件开发至关重要的原因,以及如何使用 Git 开发软件。

第二篇文章中,我们介绍了 GitLab 工作流 – 一个完整的软件生命周期流程,并介绍了持续交付。

第三篇文章中,我们介绍了 GitLab 安装和配置以及将环境连接到 GitLab

第四篇文章中,我们编写了 CD 配置。

在这篇文章中,我们将介绍容器以及使用容器的方法(和原因)。

0
0 186
文章 Michael Lei · 九月 27, 2024 8m read

在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:

  • Git 101
  • Git 流程(开发流程)
  • GitLab 安装
  • GitLab 工作流
  • 持续交付
  • GitLab 安装和配置
  • GitLab CI/CD

第一篇文章中,我们介绍了 Git 基础知识、深度理解 Git 概念对现代软件开发至关重要的原因,以及如何使用 Git 开发软件。

第二篇文章中,我们介绍了 GitLab 工作流 – 一个完整的软件生命周期流程,并介绍了持续交付。

第三篇文章中,我们介绍了 GitLab 安装和配置以及将环境连接到 GitLab

在这篇文章中,我们将介绍编写 CD 配置。

计划

环境

首先,我们需要多个环境以及与之对应的分支:

环境 分支 交付 有权提交的角色 有权合并的角色
测试 master 自动 开发者、所有者 开发者、所有者
预生产 preprod 自动 所有者
生产 prod 半自动(按下按钮进行交付)

所有者

开发周期

作为示例,我们将使用 GitLab 流程开发一个新功能,并使用 GitLab CD 进行交付。

  1. 在功能分支中开发功能。
  2. 对功能分支进行审查并将其合并到 master 分支中。
0
0 177
文章 Michael Lei · 九月 26, 2024 4m read

在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:

  • Git 101
  • Git 流程(开发流程)
  • GitLab 安装
  • GitLab 工作流
  • 持续交付
  • GitLab 安装和配置
  • GitLab CI/CD

第一篇文章中,我们介绍了 Git 基础知识、深度理解 Git 概念对现代软件开发至关重要的原因,以及如何使用 Git 开发软件。

第二篇文章中,我们介绍了 GitLab 工作流 – 一个完整的软件生命周期流程,并介绍了持续交付。

在这篇文章中,我们将探讨:

  • GitLab 安装和配置
  • 将环境连接到 GitLab
0
0 161
文章 Michael Lei · 九月 26, 2024 7m read

在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:

  • Git 101
  • Git 流程(开发流程)
  • GitLab 安装
  • GitLab 工作流
  • 持续交付
  • GitLab 安装和配置
  • GitLab CI/CD

上一篇文章中,我们介绍了 Git 基础知识、深度理解 Git 概念对现代软件开发至关重要的原因,以及如何使用 Git 开发软件。 我们的侧重点仍是软件开发的实现部分,但本部分会介绍:

  • GitLab 工作流 - 从想法到用户反馈的完整软件生命周期流程
  • 持续交付 – 软件工程方式,团队通过这种方式在短周期内制作软件,从而确保软件可以随时实现可靠发布。 它的目的是更快速、更频繁地构建、测试和发布软件。
0
0 310
文章 Michael Lei · 九月 26, 2024 6m read

大家都搭建了测试环境。

有些人很幸运,可以在完全独立的环境中运行生产。

-- 佚名

.

在这一系列文章中,我想向大家介绍并探讨使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。 我将介绍以下主题:

  • Git 101
  • Git 流程(开发流程)
  • GitLab 安装
  • GitLab 工作流
  • GitLab CI/CD
  • 包含容器的 CI/CD

第一部分将介绍现代软件开发的基础 – Git 版本控制系统和各种 Git 流程。

0
0 277
文章 姚 鑫 · 九月 26, 2024 2m read

第三十四章 使用派生密钥令牌进行加密和签名 - 使用 进行签名

要使用 进行签名,请使用以下步骤:

  1. 如果想要签署任何安全标头元素,请创建这些安全标头元素。
  2. 创建 并将其添加到 WS-Security 标头,如创建和添加 中所述。

请注意,此步骤还会创建并添加 所基于的 元素。

  1. 根据派生的密钥令牌创建 元素。为此,请调用 %XML.Security.Signature的 类方法。例如:
 set dsig=##class(%XML.Security.Signature).Create(dkt)

此方法返回 %XML.Security.Signature 的实例,该实例表示 标头元素。签名值通过 HMAC-SHA1 摘要算法计算,使用 隐含的对称密钥。

元素适用于消息的一组默认部分;可以指定一组不同的部分。

  1. 将数字签名添加到 WS-Security 标头元素。为此,请调用 Web 客户端或 Web 服务的 属性的 方法。对于参数,请指定上一步中创建的签名对象。例如:
 do ..SecurityOut.AddSecurityElement(dsig)

例如,以下客户端代码对

0
0 94
文章 姚 鑫 · 九月 25, 2024 1m read

第三十三章 使用派生密钥令牌进行加密和签名 - 使用

进行加密(一)

  1. 如果加密了任何安全标头元素,请将它们添加到 WS-Security 标头元素中。为此,请调用 Web 客户端或 Web 服务的 属性的 方法。在这种情况下,需要两个参数:

a. 安全标头元素(而不是从中生成的的 %XML.Security.EncryptedData)。

b. 引用列表实例。第二个参数指定将第一个参数指定的项目放在何处。如果参数是 AB,则 IRIS 确保 在 之后。指定此项以便收件人首先处理引用列表,然后再处理依赖于它的加密安全标头元素。

 do client.SecurityOut.AddSecurityElement(userToken,reflist)

如果仅加密了 主体,系统会自动将 元素作为 的子元素。

  1. 发送 SOAP

例如,以下客户端代码对 SOAP进行加密:

  // Create UsernameToken
  set userToken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
 
  // get credentials for encryption
  set cred = ##class(%SYS.X509Credentials).GetByAlias("servercred") 

  // get EncryptedKey element to encrypt <UsernameToken)
  // $$$SOAPWSEncryptNone means that this key does not encrypt the body
  set enckey=##class(%XML.Security.EncryptedKey).CreateX509(cred,$$$SOAPWSEncryptNone)
  //add to WS-Security Header
  do client.SecurityOut.AddSecurityElement(enckey)

  // get derived key to use for encryption
  // second argument specifies how the derived key 
  // refers to the key on which it is based
  set dkenc=##class(%SOAP.WSSC.DerivedKeyToken).Create(enckey,
     $$$SOAPWSReferenceEncryptedKey)
  //add to WS-Security Header
  do client.SecurityOut.AddSecurityElement(dkenc)
  
  // create <EncryptedData> element to contain <UserToken>
  set encdata=##class(%XML.Security.EncryptedData).Create(dkenc,userToken,
     $$$SOAPWSReferenceDerivedKey)
  
  // create <EncryptedData> element to contain SOAP body
  set encdata2=##class(%XML.Security.EncryptedData).Create(dkenc,"",
     $$$SOAPWSReferenceDerivedKey)

  // create <ReferenceList> with <DataReference> elements that
  // point to these two <EncryptedData> elements
  set reflist=##class(%XML.Security.ReferenceList).%New()
  set dataref=##class(%XML.Security.DataReference).Create(encdata)
  do reflist.AddReference(dataref)
  set dataref2=##class(%XML.Security.DataReference).Create(encdata2)
  do reflist.AddReference(dataref2)

  // add <ReferenceList> to WS-Security header
  do client.SecurityOut.AddSecurityElement(reflist)
  // add encrypted <UserName> to security header;
  // 2nd argument specifies position
  do client.SecurityOut.AddSecurityElement(userToken,reflist)

  // encrypted SOAP body is handled automatically

0
0 89
文章 姚 鑫 · 九月 24, 2024 2m read

第三十二章 使用派生密钥令牌进行加密和签名 - 使用

进行加密

要使用 进行加密,请使用以下步骤:

  1. 如果要加密一个或多个安全标头元素,请创建这些安全标头元素。.
  2. 创建 并将其添加到 WS-Security 标头,如创建和添加 中所述。

请注意,此步骤还会创建并添加 所基于的 元素。

  1. 对于要加密的每个元素,请根据该元素创建一个 元素。为此,请调用 %XML.Security.EncryptedDataCreate() 类方法。在此过程中,请指定以下参数:

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.EncryptedData).Create(dkenc,,refopt) 
0
0 128
公告 Claire Zheng · 九月 11, 2024

HI 各位开发者们,

📅2024年9月23日🕑14:00-15:30🕞,InterSystems将举办线上研讨会,点击🔔此处🔔报名参会。

此次研讨会以“面向未来的数据平台——InterSystems IRIS五大亮点提速数据潜力挖掘与AI应用”为主题,帮助您了解InterSystems IRIS数据平台的五大亮点:

  • 使用InterSystems IRIS for Health进行FHIR开发
  • 使用Python进行互操作Production开发
  • InterSystems IRIS列存储
  • InterSystems IRIS外部表(Foreign Table)
  • InterSystems IRIS向量和基于向量检索的患者相似度匹配
2
0 357
文章 姚 鑫 · 九月 22, 2024 3m read

第三十章 使用派生密钥令牌进行加密和签名

IRIS 支持 WS-SecureConversation 1.4 定义的 元素。可以创建并使用 元素进行加密和签名,作为前三个主题中描述的方法的替代。

通常,会同时执行加密和签名。为简单起见,本主题分别介绍这些任务。有关结合加密和签名的信息,请参阅结合加密和签名。

概述

元素旨在携带发送者和接收者可以独立使用的信息来生成相同的对称密钥。这些方可以使用该对称密钥对 SOAP 消息的指定部分进行加密、签名或同时执行这两种操作。

要生成和使用 ,请执行以下操作:

  1. 生成一个对称密钥以供临时使用。
  2. 使用要向其发送消息的实体的公钥来加密对称密钥。这将创建一个 元素。

可以从该实体的请求消息中包含的 X.509 证书中获取公钥。或者可以提前获取它。

  1. 通过 P_SHA1 算法从原始对称密钥计算出一个新的对称密钥。

这将创建一个引用 元素的 元素。

  1. 使用新的对称密钥进行加密或签名。

对这些活动使用不同的对称密钥被认为是一种很好的做法,这样就可以减少用于分析的数据量。

  1. 在消息中包含 元素和 。

IRIS 中,派生密钥令牌也可以基于另一个派生密钥令牌。

创建并添加

作为参考,本节描述了后面几节中需要的常见活动。它描述了如何创建 并将其添加到 标头。您可以使用以下步骤或各小节中描述的变体。

  1. 可选择包含 %soap.inc
1
0 141
文章 Hao Ma · 九月 23, 2024 5m read

InterSystems IRIS 数据平台作为关系数据库使用时,传统上以行为单位存储数据。现在,由于底层数据结构的灵活性,您也可以按列存储数据。虽然每种选择都有其优点,但在列中存储数据(称为列式存储)可以在数据分析的业务中显著提高各种用例的性能。列存储自2022.2 版的IRIS起做实验功能引入, 2023.1 起正式支持,到目前已经迭代了几个版本。

假设一家公司使用基于行的存储来保存收到的所有订单数据,跟踪订单 ID、订单日期、客户、优先级、状态和总金额等数据,使用行存储可以被示意为下面的图形:

row_storage

每一行数据在逻辑上对应一个订单,单行中的所有数据在物理上存储在一起。

这种模式便于快速添加或更新订单。订单可以一次添加一个,数据库的每次写入正好对应一行。当发生了订单的事务,除了要更改的行之外,无需访问或更新表中的任何数据。

让我们考虑另外的情况:假设公司想找到每个月的平均销售收入。为此,您只需要两列的信息: 订单日期和总金额。但是,如果使用基于行的存储,则必须检索每个订单的所有数据才能获得此信息。即使在 OrderDate 列上使用了索引,仍需要读取日期范围内每个订单的完整行,才能获得总金额。如果订单数量较多,这样做的效率会非常低。

这就是列式存储的作用所在。数据不是按行存储在一起,而是按列存储在一起。从逻辑上讲,表和数据之间的关联保持不变。改变的只是物理存储方法。

0
0 165
文章 姚 鑫 · 九月 23, 2024 2m read

第三十一章 使用派生密钥令牌进行加密和签名 - 变体:创建隐式

变体:创建隐式

还可以创建隐式 ,这是引用 的快捷方法。在此方法中:

  • 消息中不包含
  • 在使用 的元素中, 元素指定 Nonce 属性,该属性包含用于 的 nonce 值。这向消息接收者表明派生密钥令牌是隐含的,并且是从引用的令牌派生的。

要创建隐式 ,请使用前面描述的一般过程,但有两处更改:

  1. 对于派生的密钥令牌实例,将 属性设置为 1
 set dkt.Implied=1
  1. 请勿将 元素添加到 WS-Security 标头元素。

使用 的方式与将其包含在消息中的方式完全相同。

变体:引用 的 SHA1 哈希

在此变体中(仅适用于 服务),发送者不在消息中包含 元素,而是引用密钥的 SHA1 哈希。 服务可以引用在入站消息中收到的 元素。

使用前面的一般程序,但需做以下更改:

  • 步骤 2-4 是可选的。.
  • 省略步骤 (不要添加 )。
  • 在步骤 中,当您使用 创建派生密钥令牌时,若要使用从客户端收到的 ,请省略第一个参数。或者,如果您已创建 ,请将其用作第一个参数。

指定 作为第二个参数。

例如,要使用从 客户端收到的消息中的第一个 元素:

 set refopt=$$$SOAPWSReferenceEncryptedKeySHA1
 set dkenc=##class(%SOAP.WSSC.DerivedKeyToken).Create(,refopt)
0
0 88
文章 Nicky Zhu · 九月 23, 2024 2m read

演示程序

使用向量搜索在 IRIS for Health 上运行的病人相似性比较演示。 使用向量搜索计算相似度,在向量基础上比较不同病人之间的个人属性,如姓名、出生日期、地址等。得分越高,被比较的病人越有可能是同一个人。 本演示程序使用 sentence-transformers model 将文本转换为向量,然后使用 IRIS 向量函数来存储、读取和比较向量。

流程原理

image

安装

  1. 使用Git克隆存储库
  2. 演示程序将使用text2vec-base-chinese。你也可以下载任何你想要的transformer模型,并将其存储到一个 本地路径中,如 D:\Coding\EMPIDemo\image-iris\llm\text2vec-base-chinese ,然后在 docker-compose.yml 文件的 volumes 部分更改目录指向本地模型根目录。
  3. 启动Docker容器 请注意,程序将下载并安装 Python sentence-transformers模块,并安装 FHIR 存储库以存储患者信息,因此将占用大约 15~16GB 磁盘存储空间。

运行演示

  1. 访问WebUI
  2. 处理数据的IRIS Procuction
  3. 相关代码 嵌入式 python 用于调用sentence-transformers来执行向量化,可在 EMPIDemo.Util.Vector 中找到。
0
0 145
文章 姚 鑫 · 九月 19, 2024 2m read

第二十九章 添加数字签名 - 指定 的规范化方法

默认情况下, 元素使用Exclusive XML Canonicalization进行规范化, 元素包括以下内容:

<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">

要使用包容性 规范化来规范化此元素,请执行以下操作:

 Set sig.SignedInfo.CanonicalizationMethod.Algorithm=$$$SOAPWSc14n

其中 sig 是 的实例。

在这种情况下, 包含以下内容:

添加签名确认

WS-Security 1.1 功能使 客户端能够确保收到的 消息是响应 客户端发送的原始请求而生成的。客户端请求通常经过签名,但并非必须如此。在此机制中, 服务将 元素添加到安全标头元素,Web 客户端可以检查该 元素。

对于 服务,要将 元素添加到安全标头元素:

  1. 调用 Web 服务的 WSAddSignatureConfirmation() 方法。对于参数,请指定安全标头元素的主签名。例如:
  1. 照常发送 SOAP 消息。请参阅添加安全标头元素中的一般注释。
0
0 118
文章 姚 鑫 · 九月 18, 2024 2m read

第二十八章 添加数字签名 - 指定摘要方法

指定摘要方法

默认情况下,签名的摘要值是通过 SHA-1 算法计算的,安全标头中的 元素包含如下内容:

   <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod>
   <DigestValue>waSMFeYMruQn9XHx85HqunhMGIA=</DigestValue>

可以为签名指定不同的摘要方法。为此,调用 实例的 SetDigestMethod() 方法。对于参数,请使用以下宏之一(包含在 %soap.inc 文件中):

  • $$$SOAPWSsha1 (the default)

-

  • $$$SOAPWSsha384

  • $$$SOAPWSsha512

 do sig.SetDigestMethod($$$SOAPWSsha256)

指定签名方法

默认情况下,签名值是通过 RSA-SHA256 算法计算的,安全标头中的 元素包含如下内容:

可以为签名方法指定不同的算法。为此,调用 实例的 方法。对于参数,请使用以下宏之一(包含在 文件中):

  • $$$SOAPWSrsasha1

请注意,可以修改默认签名算法。

0
0 110
文章 姚 鑫 · 九月 17, 2024 2m read

第二十七章 添加数字签名 - 变体:使用签名的 SAML 断言

要添加在签名的 SAML 断言中使用证书的数字签名,请执行以下操作:

  1. 可选择包含 %soap.inc 包含文件,它定义了可能需要使用的宏。
  2. 如果要对任何安全标头元素进行签名,请创建这些安全标头元素。例如:
 set utoken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
  1. 使用 Holder-of-key 方法的 元素创建签名的 SAML 断言。请参阅创建和添加 SAML 令牌。
  2. 创建 元素。创建时,使用已签名的 SAML 断言作为 CreateX509() 类方法的第一个参数。例如:
  1. 将数字签名添加到 标头元素。为此,请调用 Web 客户端或 服务的 属性的 方法。对于参数,请指定上一步中创建的签名对象。例如:
 do ..SecurityOut.AddSecurityElement(dsig)
  1. 发送 消息。请参阅添加安全标头元素中的一般注释。

将数字签名应用于特定消息部分

默认情况下,当创建数字签名并将其添加到 标头元素时,该签名将应用于 SOAP 主体、标头中的 元素(如果存在)以及任何 标头元素。

0
0 79
文章 姚 鑫 · 九月 15, 2024 4m read

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

示例

此示例显示了对其响应消息进行签名的 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 done
 Set 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 saved
 Set 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 object
 Set signature=##class(%XML.Security.Signature).CreateX509(bst)
 
 //Add WS-Security Signature object to the outbound message
 Do ..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=$$$FAULTServer
    Set fault.detail=detail
    Set fault.faultstring="Application error"
    // ReturnFault must be called to send the fault to the client.
    // ReturnFault will not return here.
    Do ..ReturnFault(fault)
}


}
0
0 86
文章 姚 鑫 · 九月 14, 2024 4m read

第二十五章 添加数字签名

本主题介绍如何向 IRIS Web 服务和 Web 客户端发送的 SOAP 消息添加数字签名。

通常,会同时执行加密和签名。为简单起见,本主题仅介绍签名。有关结合加密和签名的信息,请参阅主题结合加密和签名。

主题使用派生密钥令牌进行加密和签名描述了向 消息添加数字签名的另一种方法。

数字签名概述

可以使用数字签名来检测消息是否被篡改,或者简单地验证消息的某一部分是否确实由所列实体生成。与传统的手工签名一样,数字签名是对文档的附加,只有文档的创建者才能创建,并且不容易伪造。

SOAP 消息的数字签名的支持基于 WS-Security 。反过来, 遵循 签名规范。根据后者的规范,要对 XML 文档进行签名:

  1. 使用摘要函数来计算文档一个或多个部分的哈希值。
  2. 将摘要值连接起来。
  3. 使用私钥加密串联摘要。(这是只有才能执行的计算。)
  4. 创建 元素,其中包含以下信息:
  • 对已签名部分的引用(以表明该签名适用于消息的哪些部分)。
  • 加密的摘要值。
  • 使接收者能够识别用于解密加密摘要值的公钥的信息。

此信息可以包含在元素中,或者 元素可以包含对包含 证书或签名的 断言的二进制安全令牌的直接引用。在后一种情况下,必须在添加 元素之前将安全令牌添加到消息中。

此信息还可以让收件人验证您是公钥/私钥对的所有者。

使用派生密钥令牌进行加密和签名主题介绍了一种向

0
0 119
文章 姚 鑫 · 九月 13, 2024 3m read

第二十四章 加密安全标头元素 - 基本示例

以下示例调用 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).CreateX509(cred,encropt)

  //create EncryptedData and add a reference to it from EncryptedKey
  set encdata=##class(%XML.Security.EncryptedData).Create(,userToken)
  set dataref=##class(%XML.Security.DataReference).Create(encdata)
  do enckey.AddReference(dataref)

  //add EncryptedKey to security header
  do client.SecurityOut.AddSecurityElement(enckey) 
  //add UsernameToken and place it after EncryptedKey
  do client.SecurityOut.AddSecurityElement(userToken,enckey) 

  Quit client.Divide(1,2)
0
0 102
文章 姚 鑫 · 九月 12, 2024 3m read

第二十三章 加密安全标头元素

本主题介绍如何加密 Web 服务和 Web 客户端发送的消息中的 WS-Security 标头内的元素。(此处描述的工具也可单独使用或与安全标头元素结合使用来加密 主体。)

通常,会同时执行加密和签名。为简单起见,本主题仅介绍加密。有关结合加密和签名的信息,请参阅结合加密和签名。

使用派生密钥令牌进行加密和签名主题描述了加密 消息部分内容的另一种方法。

加密安全标头元素

与上一主题中显示的加密技术不同,加密 标头元素的过程要求您指定 元素如何连接到相应的 元素。

要加密安全标头元素,请执行以下操作:

  1. 可选择包含 %soap.inc 包含文件,它定义了可能需要使用的宏。
  2. 创建要加密的标头元素。例如:
 set userToken=##class(%SOAP.Security.UsernameToken).Create("_SYSTEM","SYS")
  1. 获取包含将接收 SOAP 消息的实体的公钥的凭证集。请参阅以编程方式检索凭证集。
 set credset=..SecurityIn.Signature.X509Credentials

请务必检查返回对象的类型,看它是否是 的实例,如以编程方式检索凭据集中所述。

  1. 根据凭证集创建加密密钥。为此,调用 %XML.Security.EncryptedKeyCreateX509()
0
0 84
文章 姚 鑫 · 九月 11, 2024 3m read

第二十二章 加密 SOAP 主体 - 变体:使用签名的 SAML 断言

要使用签名的 SAML 断言中的证书中包含的公钥进行加密,请执行以下操作:

  1. 跳过前面步骤中的步骤 1–4
  2. 使用 Holder-of-key 方法的 元素创建签名的 SAML 断言。请参阅创建和添加 令牌。
  3. 创建 元素。执行此操作时,使用签名的 断言作为 CreateX509() 类方法的第一个参数。例如:
 set enckey=##class(%XML.Security.EncryptedKey).CreateX509(signedassertion)
  1. 继续前面步骤中的步骤5。

消息加密示例

在此示例中, 客户端(未显示)发送签名的请求消息,而 服务发送加密响应。

Web 服务从请求消息签名中的客户端证书中获取公钥,并使用该公钥在其响应中添加一个加密的 元素。 元素使用客户端的公钥加密,它包含用于加密响应消息正文的对称密钥。

服务如下:

Class XMLEncr.DivideWS Extends %SOAP.WebService
{

Parameter SECURITYIN = "REQUIRE";

Parameter SERVICENAME = "XMLEncryptionDemo";

Parameter NAMESPACE = "http://www.myapp.org";

Method Divide(arg1 As %Numeric = 2, arg2 As %Numeric = 8) As %Numeric [ WebMethod ]
{
  Do ..EncryptBody() 
  Try {
      Set ans=arg1 / arg2
      } Catch {
      Do ..ApplicationError("division error")
      }
  Quit ans
}

Method EncryptBody()
{
  //Retrieve X.509 certificate from the signature of the inbound request
  Set clientsig = ..SecurityIn.Signature
  Set clientcred = clientsig.X509Credentials
  set bst=##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(clientcred)
  do ..SecurityOut.AddSecurityElement(bst)
  
  //generate a symmetric key, encrypt that with the public key of
  //the certificate contained in the token, and create an 
  //<EncryptedKey> element with a direct reference to the token (default)
  Set enc=##class(%XML.Security.EncryptedKey).CreateX509(bst)
  
  //add the <EncryptedKey> element to the security header
  Do ..SecurityOut.AddSecurityElement(enc)
}

///  Create our own method to produce application specific SOAP faults.
Method ApplicationError(detail As %String)
{
    //details omitted
}

}
0
0 121
文章 姚 鑫 · 九月 10, 2024 3m read

第二十一章 加密 SOAP 主体 - 变体:使用可识别证书的信息

包含序列化、base-64 编码格式的证书。可以忽略此令牌,而改用标识证书的信息;接收方使用此信息从相应位置检索证书。为此,请使用上述步骤,并进行以下更改:

  • 跳过步骤 34。也就是说,不要添加 。
  • 在步骤 (创建加密密钥)中,使用步骤 中设置的凭据(而不是二进制安全令牌)作为 CreateX509() 的第一个参数。例如:
 set enckey=##class(%XML.Security.EncryptedKey).CreateX509(credset,,referenceOption)

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

如果指定一个凭据集作为第一个参数(正如我们在此变体中所做的那样),则referenceOption的默认值为。 可以选择指定一个值,如本节所述。 可以使用除之外的任何值。

证书的参考选项

标头简介部分介绍了在 消息中使用证书的一种方法。在该示例中,数字签名由两个标头元素组成:

  • 元素,以序列化的base-64 编码形式携带证书。
  • 元素,带有签名并且包含对二进制安全令牌的直接引用。

还有其他可能的引用形式。例如, 可以包含证书的指纹,在这种情况下,消息中不需要 。

创建加密密钥、数字签名或 断言时,可以指定 referenceOption

0
0 138
文章 姚 鑫 · 九月 9, 2024 2m read

第十七章 手动添加安全元素

本主题主要介绍如何手动向 IRIS Web 服务和 IRIS Web 客户端发送的消息中添加安全元素。

以下主题提供了有关特定安全任务的详细信息。

添加安全标头元素

要将安全元素添加到 WS-Security 标头元素,请在 客户端或 Web 服务中使用以下常规过程:

  1. 创建适用类的实例。为此,可以使用名为 Create()CreateX509() 的方法(具体取决于类)。该实例表示 标头元素之一,例如 or
  2. 通过更新 Web 客户端或 服务的 属性,将每个实例添加到 标头元素。为此,请调用 方法。
  3. 发送 消息。 标头包含在消息中,并包含添加到其中的元素。
  4. 对于后续传出消息:
  • 对于 客户端, 属性保持不变,以便此实例的后续出站消息包含添加的安全标头。如果不希望这样,请将 属性设置为 。
  • 对于 服务,在第一个出站 消息之后,SecurityOutnull`。

标题元素的顺序

当将多个安全元素添加到标头时,按适当的顺序添加安全标头元素非常重要。当对同一消息元素执行加密和签名时,这一点尤其重要:即按执行加密和签名操作的相同顺序添加它们。

标头元素的顺序指示了消息处理的顺序。WS-Security 1.1 规范规定如下:

当元素添加到 标头块时,它们应该被添加到现有元素的前面。

0
0 78
文章 姚 鑫 · 九月 8, 2024 3m read

第二十章 加密 SOAP 主体

本主题介绍如何加密 IRIS Web 服务和 Web 客户端发送的 SOAP 消息正文。

主题“加密安全标头元素”和“使用派生密钥令牌进行加密和签名”描述了如何加密安全标头元素以及加密 主体的其他方法。

加密概述

SOAP 消息加密的支持基于 WS-Security 。反过来, 遵循 加密规范。根据后者规范,要加密 XML 文档:

  1. 生成一个对称密钥以供临时使用。
  2. 可以使用它来加密文档(或文档的选定部分)。

使用包含内容加密版本的 元素替换文档的这些部分。

  1. 使用要向其发送文档的实体的公钥加密对称密钥。

可以从该实体的请求消息中包含的 证书中获取公钥。或者可以提前获取它。

  1. 在同一文档中的 元素中包含加密的对称密钥。 元素直接或间接地提供信息,使接收者能够确定用于解密此元素的密钥。

此信息可以包含在 元素中,或者 元素可以包含对包含 证书或签名的 断言的二进制安全令牌的直接引用。在后一种情况下,必须在添加 元素之前将安全令牌添加到消息中。

文档可以包含多个 元素,适用于文档的不同加密部分。

其他主题介绍了加密 消息部分内容的其他方法。消息本身的细节各不相同,但一般过程相同,并遵循 XML

0
0 155
文章 姚 鑫 · 九月 7, 2024 2m read

第十九章 添加时间戳和用户名令牌 - 时间戳和用户名令牌示例

时间戳和用户名令牌示例

此示例显示了一个需要密码验证的 Web 服务,以及一个在其请求消息中发送时间戳和用户名令牌的 Web 客户端。

注意:此示例以明文形式发送用户名和密码。

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

  • 对于 Web 服务所属的 Web 应用程序,将该应用程序配置为仅支持密码验证:
  1. 从管理门户主页,选择系统管理 > 安全 > 应用程序 > Web 应用程序。
  2. 选择 Web 应用程序。
  3. 仅选择密码选项,然后选择保存。
  • 如果不使用默认设置,请编辑客户端以使用适当的 IRIS 用户名和密码。

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. In case of error, call ApplicationError.
Method Divide(arg1 As %Numeric = 2, arg2 As %Numeric = 8) As %Numeric [ WebMethod ]
{
  Try {
      Set ans=arg1 / arg2
      }Catch{
      Do ..ApplicationError("division error")
      }
  Quit ans
}

///  Create our own method to produce application specific SOAP faults.
Method ApplicationError(detail As %String)
{
    //details not shown here
}

}
0
0 106
文章 姚 鑫 · 九月 6, 2024 3m read

第十八章 添加时间戳和用户名令牌

本主题讨论时间戳和用户令牌。

概述

时间戳是 WS-Security 标头中的 安全元素。严格来说,时间戳不是安全元素。但是,可以使用它来避免重放攻击。时间戳对于自定义日志记录也很有用。

用户名令牌是 WS-Security 标头中的 安全元素;它带有用户名。它还可以带有相应的密码(可选为摘要形式)。通常使用它进行身份验证,即允许 IRIS Web 客户端使用需要密码的 服务。

注意:默认情况下, 标头元素以明文形式发送。要保护 中的密码,应该使用 SSL/TLS、加密 (如其他地方所述),或者使用这些技术的某种组合。

添加时间戳

要将时间戳添加到 标头元素,请在 客户端或 Web 服务中执行以下操作:

  1. 调用 %SOAP.Security.Timestamp的 Create() 类方法。此方法需要一个可选参数(以秒为单位的过期间隔)。默认过期间隔为 300 秒。例如:
 set ts=##class(%SOAP.Security.Timestamp).Create()

此方法创建 的实例,设置其 、Expires 和 属性的值,并返回该实例。此实例表示 标头元素。

  1. 调用 Web 客户端或 服务的 SecurityOut 属性的 方法。对于方法参数,请在创建的实例中使用 例如:
 do client.SecurityOut.AddSecurityElement(ts)
0
0 176
文章 姚 鑫 · 九月 5, 2024 1m read

第十六章 WS-Policy 配置类详细信息 - 自定义配置示例

自定义配置示例

本节提供了一些自定义配置类的示例。

策略备选配置

以下配置类包括两种策略选择:使用 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.DivideWS">
   <wsp:Policy>
     <wsp:ExactlyOne>
       <wsp:All>
         <wsap:UsingAddressing/>
       </wsp:All>
       <wsp:All>
         <wsp:Policy/>
       </wsp:All>
     </wsp:ExactlyOne>
    </wsp:Policy>
  </cfg:service>
</cfg:configuration>
}

}
0
0 78