新しい投稿

検索

記事
· 14 hr 前 3m read

在无法访问系统 x509 证书/密钥的情况下生成 JWT

如果要从 x509 证书/密钥生成JWT,对%SYS.X509Credentials的任何操作(包括读取)都需要 %Admin_Secure 资源上的 U。之所以需要 %Admin_Secure,是因为 %SYS.X509Credentials 是持久的,这样做是为了防止所有用户访问私钥。

如果 %Admin_Secure 资源在运行时不可用,可以使用以下变通方法。

在查看 JWT 生成代码时,我发现 JWT 代码仅利用 %SYS.X509Credentials 作为 PrivateKeyPrivateKeyPasswordCertificate 的运行时数据源。作为一种变通方法,您可以使用 X.509 接口的运行时非持久化实现,只公开这些属性。如果要使用互操作性,证书/PK 可以存储在凭证中,以便安全访问:

Class User.X509 Extends %RegisteredObject
{

Property PrivateKey As %VarString;
Property PrivateKeyPassword As %String;
Property Certificate As %VarString;
Property HasPrivateKey As %Boolean [ InitialExpression = {$$$YES} ];
ClassMethod GetX509() As User.X509
{
    set x509 = ..%New()
    set x509.PrivateKey = ..Key()
    set x509.Certificate = ..Cert()
    quit x509
}

/// Get X509 object from credential.
/// Username is a Cert, Password is a Private Key
ClassMethod GetX509FromCredential(credential) As User.X509
{
    set credentialObj = ##class(Ens.Config.Credentials).%OpenId(credential,,.sc)
    throw:$$$ISERR(sc) ##class(%Exception.StatusException).ThrowIfInterrupt(sc)
    
    set x509 = ..%New()
    set x509.PrivateKey = credentialObj.Password
    set x509.Certificate = credentialObj.Username
    quit x509
}

ClassMethod Key()
{
    q "-----BEGIN RSA PRIVATE KEY-----"_$C(13,10)
    _"YOUR_TEST_KEY"_$C(13,10)
    _"-----END RSA PRIVATE KEY-----"
}

ClassMethod Cert() As %VarString
{
    q "-----BEGIN CERTIFICATE-----"_$C(13,10)
    _"YOUR_TEST_CERT"_$C(13,10)
    _"-----END CERTIFICATE-----"
}

}

您还可以通过以下方式生成 JWT:

ClassMethod JWT() As %Status
{
    Set sc = $$$OK
    //Set x509 = ##class(%SYS.X509Credentials).GetByAlias("TempKeyPair")
    Set x509 = ##class(User.X509).GetX509()
    
    Set algorithm ="RS256"
    Set header = {"alg": (algorithm), "typ": "JWT"}
    Set claims= {"Key": "Value" }
    
    #; create JWK
    Set sc = ##class(%Net.JSON.JWK).CreateX509(algorithm,x509,.privateJWK)
    
    If $$$ISERR(sc) {
        Write $SYSTEM.OBJ.DisplayError(sc)
    }

    #; Create JWKS
    Set sc = ##class(%Net.JSON.JWKS).PutJWK(privateJWK,.privateJWKS)
    
    If $$$ISERR(sc) {
        Write $SYSTEM.OBJ.DisplayError(sc)
    }

    Set sc = ##Class(%Net.JSON.JWT).Create(header,,claims,privateJWKS,,.pJWT)
    
    If $$$ISERR(sc) {
        Write $SYSTEM.OBJ.DisplayError(sc)
    }
    
    Write pJWT
	Return sc
}

或者,您也可以使用动态对象来跳过类的创建,在这种情况下,它将看起来像这样:

ClassMethod JWT(credential) As %Status
{
    Set sc = $$$OK
    //Set x509 = ##class(%SYS.X509Credentials).GetByAlias("TempKeyPair")
    Set credentialObj = ##class(Ens.Config.Credentials).%OpenId(credential,,.sc)
    throw:$$$ISERR(sc) ##class(%Exception.StatusException).ThrowIfInterrupt(sc)
    
    Set x509 = {
        "HasPrivateKey": true,
        "PrivateKey": (credentialObj.Password),
        "PrivateKeyPassword":"",
        "Certificate":(credentialObj.Username)
    }

    Set algorithm ="RS256"
    Set header = {"alg": (algorithm), "typ": "JWT"}
    Set claims= {"Key": "Value" }
    
    #; create JWK
    Set sc = ##class(%Net.JSON.JWK).CreateX509(algorithm,x509,.privateJWK)
    
    If $$$ISERR(sc) {
        Write $SYSTEM.OBJ.DisplayError(sc)
    }

    #; Create JWKS
    Set sc = ##class(%Net.JSON.JWKS).PutJWK(privateJWK,.privateJWKS)
    
    If $$$ISERR(sc) {
        Write $SYSTEM.OBJ.DisplayError(sc)
    }

    Set sc = ##Class(%Net.JSON.JWT).Create(header,,claims,privateJWKS,,.pJWT)
    
    If $$$ISERR(sc) {
        Write $SYSTEM.OBJ.DisplayError(sc)
    }
    
    Write pJWT
    Return sc
}
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
お知らせ
· 15 hr 前

新的人工智能 CCR 助手

CCR 现在包括一个人工智能驱动的 "CCR 助手",可供测试人员使用。CCR 助手可帮助您快速获得有关常见 CCR 工作流程、术语或最佳实践的答案。每个回复都包含相关 ICC 培训课程的参考资料,方便您深入了解任何主题。作为未来的改进,这些链接将直接指向用于生成回复的 ICC 培训 PDF 的特定页面。

要访问该助手,请点击 CCR 应用程序右下方的蓝色 "打开 CCR 助手 "图标。对话会在浏览器会话中保存,但会在注销时清除。

您可以通过点击 "竖起大拇指 "或 "摁下大拇指 "按钮并输入可选评论来提交对任何回复的反馈意见。我们非常感谢您的反馈,这将有助于我们继续提高回复质量!

要试用 CCR 助手,请导航到侧边栏的用户菜单,选中您的个人资料下的测试版测试员复选框,然后单击保存。您可以随时取消选中该复选框。

有关 CCR 助手的快速操作演示,请观看下面的视频。

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
質問
· 16 hr 前

JDBC Connection Issue: Cache 2018.1 Access Denied

Hello Community,

I am facing a JDBC connection issue after migrating from Caché 2016 to Caché 2018.1. When I attempt to connect using the following connection settings:

CACHE_DATASOURCE_URL=jdbc:Cache://localhost:1972/TEST

CACHE_DB_USERNAME=test

CACHE_DB_PASSWORD=test
 

I consistently receive the following error:

[Cache JDBC] Communication link failure: Access Denied

This configuration worked perfectly with Caché 2016. I have verified the following:

  1. The namespace (TEST) exists and is correctly specified in the connection URL.
  2. The credentials (username: test, password: test) are correct.
  3. The Caché instance is running on the correct hostname and port (localhost:1972)

Has anyone encountered a similar issue? Are there any known differences or required configurations for JDBC connections in Caché 2018 that weren’t present in Caché 2016?

I appreciate any guidance or support.

Thank you!

5件の新着コメント
ディスカッション (5)2
続けるにはログインするか新規登録を行ってください
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
記事
· 19 hr 前 3m read

使用 Postman 测试 InterSystems FHIR 存储库的 OAuth2.0(第一部分)

大家好,又是我来分享我最近的学习心得了。

最近,我正在学习如何为 InterSystems FHIR 资源库设置 OAuth2 身份验证。我发现以下文章非常好,而且很容易理解。

使用 IRIS for Health 启动 FHIR EHR 的 SMART

在 IRIS for Health 上构建 FHIR 资源库 + OAuth2 授权服务器/资源服务器配置》第 2 部分

对我来说,作为一个对 OAuth2.0 没有太多了解的用户。我认为,在了解整个 OAuth2.0 环境之前,从纯粹的用户角度来看(它是什么、我需要哪些参数、预期输出是什么),理解如何设置整个 OAuth2.0 环境是相当困难的。在这里,我们使用 Postman 作为客户端。

如果你想有一个 OAuth 的测试环境,可以试试下面的 dockers

workshop-iris-oauth2 或本文中的 docker在 IRIS for Health 上构建 FHIR 资源库 + OAuth2 授权服务器/资源服务器配置 第 1 部分

在本文中,我在本地计算机上设置了一个支持 HTTPS 的 InterSystems FHIR 资源库 。(根据我的观察,要使 InterSystems OAuth 正常工作,资源服务器必须支持 HTTPS😑😐。)


因此,让我们从简单的开始。

案例 1:基本身份验证

我们需要的信息有

URL {hostname}/{path}/{Resources}?{parameters}
正文 可选
用户名  
密码  

Postman 中的测试非常简单,如下所示

一般来说,基本身份验证很简单,因为您只需提供想要获取的资源的 URL 和相应的凭证。只需 1 个步骤,就能获取您想要的数据😁✌。


案例 2:OAuth 身份验证

这个概念与基本身份验证有点不同。据我所知,关键区别在于时段(session)和令牌(token)的概念。也许在我们真正进入 OAuth2.0 之前,我们先来谈谈我们熟悉的东西。

让我们考虑下面这个场景:你想去一家艺术博物馆参加一个特别活动 "奇迹时刻"。由于这个活动非常受欢迎,艺术博物馆决定设置流量控制,将开放时间分为 8 个时段(session),每个时段为 1 小时,参观者必须在参观前到票务中心预订自己的时段(session)。换句话说,参观者必须在正确的时间段(时段,session)向美术馆出示有效门票(令牌,token),才能参加 "奇迹时刻 "活动。

根据上述场景,我们可以总结如下,从 OAuth2.0 客户端的角度来看,为了访问我们想要的资源,我们需要

第一步:从 身份验证服务器(Authentication Server)获取 令牌(token)(从票务服务中心获取票据)

第二步:向资源服务器(Resource Server 出示令牌(token)(向艺术博物馆出示门票)

要获取令牌,需要让身份验证服务器(Authentication Server)知道

1. 您是谁?(最简单的方法之一,提供client_idclient_secret,当然还有其他方法,但我只想在此简单说明一下😁) 2.

2.您要访问的资源服务器是什么?(哪个博物馆?哪个场馆?),您可以在观众席(audience)上提供。

3.您的访问范围是什么?(哪个节目?哪个活动?),可以在范围中提供,该范围应在身份验证服务器(Authentication Server )和资源服务器( Resource Server之间定义。

所以......现在......是时候做一个客户了

使用以下信息,从 Postman 获取令牌

认证类型 OAuth2.0
授予类型 Client Credentials
访问令牌 URL

https://{authentication server hostname}/oauth2/token?aud={resource server hostname}/path

例如,

https://authenticationserver.com/oauth2/token?aud=https://resourceserver...

范围 user/*.read user/*.write
客户端身份验证 Send as Basic Auth header

验证完成后,点击使用令牌(Use Token)

是的!!现在我们得到了一个有效的令牌,😁😂,它将在一小时内过期😶🤐。

现在使用令牌(Use the Token)获取我们想要的资源

现在尝试获取病人资源

URL {resource server hostname}/{path}/Patient
方法 GET
令牌 我们在步骤 1 中获得的令牌

是的!!看起来不错。

感谢您的阅读。

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください