Thanks for posting this. Have amended as follows to make use of %Net.JSON.JWT

Method GetJWT(KID, apiKey) As %String
{

    #Dim sigJOSE As %DynamicObject
    #Dim encJOSE As %DynamicObject
    #Dim claims As %DynamicObject


    s tPrivateKey=$G(^JWT(KID,"private"))
    
    set iat = ##class(%OAuth2.Utils).TimeInSeconds($ztimestamp,0)
    set exp = ##class(%OAuth2.Utils).TimeInSeconds($ztimestamp,300)
    s uuid = ##class(%SYSTEM.Util).CreateGUID()
  
    set tClaims = {
        "sub": (apiKey),
        "iss": (apiKey),
        "jti": (uuid),
        "aud": "https://int.api.service.nhs.uk/oauth2/token",
        "exp": (exp)
        }

    Set JOSE = {
        "alg": "RS512",
        "kid": (KID),
        "typ": "JWT"
    }
    
    Set tX509=##class(%SYS.X509Credentials).%New()
    Do tX509.PrivateKeySet(tPrivateKey)
    Set tStatus=##class(%OAuth2.JWKS).AddX509("RS512",tX509,.tPrivate)
    Set arr=##class(%DynamicAbstractObject).%FromJSON(tPrivate)
    Set iter=arr.%GetIterator()
    Set newprivate={}
    ///Need to set KID at same index with other keys so re-creating new 
    While iter.%GetNext(.key,.value) {
            Set newprivate.kty=value.keys.kty
            Set newprivate.n=value.keys.n
            Set newprivate.e=value.keys.e
            Set newprivate.d=value.keys.d
            Set newprivate.p=value.keys.p
            Set newprivate.q=value.keys.q
            Set newprivate.dp=value.keys.dp
            Set newprivate.dq=value.keys.dq
            Set newprivate.qi=value.keys.qi
            Set newprivate.alg=value.keys.alg
            Set newprivate.kid=KID
    }
    Set JWKSPrivate={"keys":[]}
    Do JWKSPrivate.keys.%Push(newprivate)
   
    s tSC=##class(%Net.JSON.JWT).Create(.JOSE,,tClaims,JWKSPrivate,,.JWT)
    if $$$ISERR(tSC) {
        q tSC
    }
    q JWT
}

Error 

ERROR <Ens>ErrBPTerminated: Terminating BP ProcessMessage # due to error: ERROR #5002: ObjectScript error: <MAXSTRING>%GetNext+12^%Iterator.Object.1
> ERROR #5002: ObjectScript error: <MAXSTRING>%GetNext+12^%Iterator.Object.1

Stack 

  • ^%GetNext+12^%Iterator.Object.1^1
  • e^FromJSONHelper+17^HS.FHIR.DTL.Util.JSON.Adapter.1^1
  • e^FromJSONHelper+98^HS.FHIR.DTL.Util.JSON.Adapter.1^1
  • e^FromJSONHelper+80^HS.FHIR.DTL.Util.JSON.Adapter.1^1
  • e^FromJSON+9^HS.FHIR.DTL.Util.JSON.Adapter.1^1
  • e^OnRequest+5^RIE.GLH.FHIR.Process.ProcessMessage.1^1
  • e^MessageHeaderHandler+19^RIE.GLH.FHIR.Process.ProcessMessage.1^1
  • e^MessageHeaderHandler+110^Ens.Actor.1^1