Architecture

XTB is a federation service providing these capabilities:

  • routing authentication requests between relying parties (in short RP, also known as service provider / SP) and claims providers (CP also known as identity provider / IDP) allowing a user to select the home realm or computationally doing home realm discovery (HRD) via scripting

  • mapping claims/attributes between CP and RP (like authentication context classes, SAML attributes and OIDC claims)

  • backing logins with a single-sign-on session store to prevent logins for participating RPs when Quality of Authentication (QoA) is sufficient provided by the same CP

  • auditing login events as a central party

  • supporting GitOps having a tracked, versioned and reviewable configuration repository

The supported protocols are:

  • SAML 2.0 on RP and CP side (SAML POST and redirect binding, artifact binding having higher integration effort and more complex operational impact can be used too)

  • OIDC 1.0 on RP side focussing on the best practice sub-set (authorization code flow with PKCE for frontend and with client authentication for backends)

Actors and components explained:

Component Purpose

User-Agent

The client is usually a browser in case of front-channel controlled authentication or otherwise a OIDC adapter running either in the browser using JavaScript or in a backend.

Relying Party Service

Handles the interaction with the application side based on SetupRP.xml definitions.

Claims Provider Service

Handles the interaction with the CPs based on SetupCP.xml definitions.

Authentication Service

Handles the federation between RP and CP service.

OIDC Service

Handles RP-initiated OIDC authorization code flow based on the Spring Authorization Server To separate SAML and OIDC implementation sub-systems, the OIDC service is federated via SAML.

Authorization Code Flow Service

Handles OIDC authorization code flow towards OIDC CPs.

HRD Controller

Handles the interaction with the user when selecting a CP form the HRD selection screen.

Script Service

Allows to hook groovy scripts to manipulate the federation data and flow. See processing model for supported hooks and the configuration section for a few examples.

SSO Service

Allows multiple RP’s to share a session on the XTB. The SSO mechanism is based on cookies and device tracking and can be overridden via SAML AuthnRequest (forceAuthn) and OIDC authorize request (prompt=login). Minimal LoA requirements should be applied using this service.

Processing Model

The federation is executed as follows:

sequence diagram
Figure 1. Sequence diagram: Federation processing

API and Protocols

XTB provides various endpoints for SAML and OIDC federation handling and has a small single page application for the parts that require user interaction.

These features are provided based on:

  • XTB SAML implementation using OpenSAML

  • XTB OIDC integration using a sub-set of the features of Spring Authorization Server

  • XTB application using angular to provide the user interaction UI

Path Protocol Purpose

/api/v1/saml/metadata

SAML

SAML metadata endpoint providing Metadata for the OASIS Security Assertion Markup Language (SAML) V2.0

/api/v1/saml

SAML

SAML login/logout endpoint handling SP-Initiated SSO: Redirect/POST Bindings

/api/v1/saml/arp

SAML

SAML artifact binding resolution endpoint

/.well-known/openid-configuration

REST

OIDC meta data endpoint for Obtaining OpenID provider configuration information

/oauth2/authorize

OIDC

JSON web token authorization code flow starting point defined by https://openid.net/specs/openid-connect-core-1_0 .html#AuthorizationEndpoint[OpenID Connect Authorization Endpoint]

/oauth2/token

OIDC

JSON web token retrieval endpoint defined by OpenID Connect Token endpoint. Used to retrieve tokens using authorization codes or refresh_token.

/oauth2/jwks

OIDC

JSON Web Key endpoint serving key sets (rotated weekly) required for token signature verification. See rfc7517 for details.

/oauth2/introspect

OIDC

Allows to to validate posted access token retrieving it’s data payload. See rfc7662 for details.

/oauth2/revoke

OIDC

Discard tokens from the XTB token cache. See rfc7009 for details.

/userinfo

OIDC

Provides insights into the HTTP bearer token posted in the HTTP Authorization header or the access_token POST body. See OpenID COnnect UserInfo Endpoint.

/logout

OIDC

Allows user-agents to do a OpenID Connect Front-Channel Logout.

/app

Web

Single page applications for user interactions (home realm discovery and error handling mainly)

/app/sso

Web

SSO login status page for testing. Can be used to check and kill SSO own sessions. Limitations: OIDC session members are visible here too but only when SSO is used and terminating SSO session here does not invalidate OIDC tokens.

Docker Installation

On a docker host XTB can be installed as a service mesh with docker-compose. Requirements:

  • Current distribution of a docker enabled Linux system

  • Docker version 24 or above

  • Alternatively: Podman version 4 or above (security restrictions apply)

  • Network access to download images from internet docker registries

The setup will provide these endpoints:

Container Endpoints Remarks

mariadb providing session and token storage.

mysql --protocol=tcp --host=localhost --port=3306 --user=root --password=secret

Investigate storage: show databases; use TBSS16; show tables; desc TB_AUTH_SESSION_CACHE;

gitea providing a gitops repository storage to play around with (optional, you can use your repo server).

Endpoints of interest of the git repository server:

Documentation: https://docs.gitea.com/

trustbroker-application providing the actual federation service.

Documentation: https://github.com/trustbroker-swiss

trustbroker-samlmock simulating a SAML RP and CP to play around with.

RP entry points: http://localhost:7070

Mock service simulating RP and CP messages based on the xtb-gitops-demo/trustbroker-samlmock data to play around with the setup.

TLS engineering:

When switching to server TLS you can discard the

You can find the scripts mentioned in this section in the trustbroker-install module on GitHub.

Install docker-compose (optional)

If you do not have a docker infrastructure that supports the 'docker compose' command you can install it as follows: Install docker-compose on your system:

In short:

sudo bash
curl -SL https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-x86_64 -o
/usr/local/bin/docker-compose
chmod 555 /usr/local/bin/docker-compose

Default Setup

The demo setup should run out of the box as follows:

Run the setup:

bash run.sh

Access the setup via the mocked demo relying parties at http://localhost:7070. You can use the browser’s development tools and the SAML-tracer plugin to observe the traffic.

If the docker image pulling fails because of authorization issues, ask for access on the trustbroker.swiss discussion forum.

Customize Setup

You might want to tweak the development setup:

  • Switch to another image version or distribution points

  • Set new secrets for state cache and keystores (p12/pem files).

  • Generate new SSH keys to access GitOps repository.

  • Use other external ports.

  • Remove Gitea because you have a remote repository already or use gitea actually so you can play with the configuration.

Example vault (retained in CI or K8S vault for production setups) injected into docker-compose.yml via ENV:

# Variant 0: Run directly with the read-only public repository from GitHub
GIT_URL=https://github.com/trustbroker-swiss/xtb-gitops-demo.git
#GIT_TOKEN=not-required-on-public-repo

# Variant 1: Access token used to access GitOps repository using http bearer token (must be created on Git server)
# Gitea >> User Avater >> Settings >> Applications >> Manage Access Tokens >> Generate Token
# Pass by value or by reference ie.e $TRUSTBROKER_HOME/keys/git_token
#GIT_URL=http://git@gitea:3000/trustbroker-swiss/xtb-gitops-demo.git
#GIT_TOKEN=./keys/git_token

# Variant 2: SSH key used to access GitOps repository using ssh protocol (see setup-ssh.sh on how to get it)
# We instead mount the SSH key(s) into /etc/trustbroker/keys.
#GIT_URL=ssh://git@gitea:22/trustbroker-swiss/xtb-gitops-demo.git
#SSH_KEY=./keys/id_rsa

# data selection from git repo selecting trustbroker-inventories/DEMO
CONFIG_BRANCH=main
SPRING_PROFILES_ACTIVE=DEMO

# Passphrase to decrypt keystores stored in git (RSA private in openssl PEM or PKCS12 keystores)
PKI_PASSPHRASE=changeit

# Access to the mariadb session store. We use the same passphrase for DB owner 'root' and XTB user 'trustbroker'.
STATECACHE_PASS=secret

# Development environment population
export GIT_URL GIT_TOKEN SSH_KEY CONFIG_BRANCH TRUSTBROKER_HOME SPRING_PROFILES_ACTIVE
export PKI_PASSPHRASE STATECACHE_PASS

# Rootless docker-compose requires switching the run user of the container.
[ -z "$UID" ] && export UID=$(id -u)
[ -z "$GID" ] && export GID=$(id -g)
export UID GID

Example docker compose depending on the vault (see ${VAR} references) that you might want to tweak towards using external sessiondb and/or git repository server:

# vim: syntax=yaml textwidth=120 expandtab tabstop=2 softtabstop=2 shiftwidth=2 autoindent
# Docker compose setting up a standalone XTB service on a local docker host.configs:
# NOTE: Source the ENV defining the secret first or define them inline (SSH_KEY, PKI_PASSPHRASE, STATECACHE_PASS)

networks:
  trustbroker-network:
    external: false

services:
  mariadb:
    container_name: mariadb
    restart: on-failure
    image: docker.io/library/mariadb:10.7.6
    volumes:
      - ./mariadb:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=TBSS16
      - MYSQL_ROOT_PASSWORD=${STATECACHE_PASS}
      - MYSQL_PASSWORD=${STATECACHE_PASS}
      - MYSQL_USER=trustbroker
    networks:
      - trustbroker-network

  gitea:
    container_name: gitea
    restart: on-failure
    image: docker.io/gitea/gitea:1.21.5
    environment:
      - USER_UID=1000
      - USER_GID=1000
    volumes:
      - ./gitea:/data
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "222:22"
    networks:
      - trustbroker-network

  ldap:
    container_name: ldap
    image: bitnami/openldap
    ports:
      - '1389:1389'
      - '1636:1636'
    environment:
      #- BITNAMI_DEBUG=true
      - LDAP_ROOT=dc=trustbroker,dc=swiss
      - LDAP_ADMIN_USERNAME=admin
      - LDAP_ADMIN_PASSWORD=secret
      - LDAP_CUSTOM_SCHEMA_DIR=/schema_init
      - LDAP_CUSTOM_LDIF_DIR=/ldif_init
    volumes:
      - ./ldap_init/schema:/schema_init:ro
      - ./ldap_init/ldif:/ldif_init:ro
      #- openldap_data:/bitnami/openldap

  trustbroker:
    container_name: trustbroker
    image: ghcr.io/trustbroker-swiss/trustbroker-application:latest
    user: "${UID}:${GID}"
    depends_on:
      - gitea
      - mariadb
      - ldap
    volumes:
      - ./ssh:/etc/trustbroker/keys:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "8090:8090"
      - "8091:8091"
    environment:
      - GIT_URL=${GIT_URL}
      - GIT_TOKEN=${GIT_TOKEN}
      - SSH_KEY=${SSH_KEY}
      - CONFIG_BRANCH=main
      - SPRING_PROFILES_ACTIVE=DEMO
      - PKI_PASSPHRASE=${PKI_PASSPHRASE}
      - SPRING_FLYWAY_URL=jdbc:mariadb://mariadb:3306
      - SPRING_FLYWAY_USER=root
      - SPRING_FLYWAY_PASSWORD=${STATECACHE_PASS}
      - SPRING_DATASOURCE_USERNAME=trustbroker
      - SPRING_DATASOURCE_PASSWORD=${STATECACHE_PASS}
      # Debug SSH startup in case of connectivity problem with external git repo
      #- LOGGING_LEVEL_ROOT=DEBUG
      # When running behind an enterprise proxy inject a HTTPS or SSH proxy (HTTP not supported)
      #- HTTPS_PROXY=http://proxy.company.com:1234
      #- SSH_PROXY_HOST=proxy.company.com
      #- SSH_PROXY_PORT=1234
      # When running on HTTP relax cookie polices
      - TRUSTBROKER_CONFIG_SECUREBROWSERHEADERS=false
    networks:
      - trustbroker-network

  samlmock:
    container_name: samlmock
    image: ghcr.io/trustbroker-swiss/trustbroker-samlmock:latest
    depends_on:
      - gitea
    volumes:
      - ./ssh:/etc/trustbroker/keys:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "7070:7070"
      - "7071:7071"
    environment:
      - GIT_URL=${GIT_URL}
      - GIT_TOKEN=${GIT_TOKEN}
      - SSH_KEY=${SSH_KEY}
      - CONFIG_BRANCH=main
      - SPRING_PROFILES_ACTIVE=DEMO
      - PKI_PASSPHRASE=${PKI_PASSPHRASE}
    networks:
      - trustbroker-network

Re-Generate GitOps SSH Key

To generate an own SSH setup, execute setup-ssh.sh:

#!/bin/bash

# Site config (you can also use shorter ecdsa keys, but git server need sto support it)
SSH_KEY_FILE=${SSH_KEY_FILE:-ssh/id_rsa}
SSH_KEY_OWNER=${SSH_KEY_OWNER:-xtb-owner@your.site}
SSH_CFG_FILE=${SSH_CFG_FILE:-ssh/config}

# SSH key is stored un-encrypted in vault (no apssword necessary)
SSH_KEY_PASS=

# Trusted server keys need to be engineered when StrictHostKeyChecking=yes is used
SSH_HST_FILE=${SSH_HST_FILE:-ssh/known_hosts}

# Generate client key
ssh-keygen -m pem -t rsa -b 4096 -P "$SSH_KEY_PASS" -f $SSH_KEY_FILE -C $SSH_KEY_OWNER

# Provide server trust: Done automatically when connecting to the Git server for the first time.
# To explicitly establish server trust setup keys/config and keys/known_hosts using OpenSSH conventions.
# The following default config allows bootstrapping any ssh server automatically, so take care what git url you are using.
touch $SSH_HST_FILE
cat >$SSH_CFG_FILE <<EOT
Host *
  StrictHostKeyChecking no
EOT

# Optional: Inject private key via ENV for bootstrap (done instead via volume mount from docker-compose or K8S secret)
SSH_KEY=$(cat $SSH_KEY_FILE | base64 -w 0)
[ -f env-vault.conf ] && sed -i.old -e "s|SSH_KEY=.*|SSH_KEY=$SSH_KEY|" env-vault.conf

# Put public key into Git server user or repository settings
echo "##### Public SSH key to be added to Git server user/repository #####"
cat ${SSH_KEY_FILE}.pub

Setup Gitea Server

For trials, you can use the Gitea server as shown in the docker-compose setup, you need to switch from the github to the gitea URL for the xtb-gitops-demo repository..

sudo docker-compose up gitea

Setup manually:

  • Connect to http://localhost:3000/ and confirm the default server setup.

  • Register user trustbroker-swiss and login.

  • Add content of ssh/id_rsa.pub (and/or your own) to: User >> Settings >> SSH/PGP Keys >> Manage SSH Keys >> Add Key

  • Create a repository xtb-gitops-demo.

  • Optional: For http access: User >> Settings >> Applications >> Manage Access Tokens >> Generate Token

The resulting access token can be set along the GIT_URL as GIT_TOKEN or mapped to /etc/trustbroker/keys/git_token.

Note that access token or SSH key are only required, if the git repository is private (gitea default). You can make it public in the repository settings, in which case you do not need access keys. You then can add/edit/delete files in the web UI and read the repository without a login.

Clone the public demo repository:

git clone -b main git@github.com/trustbroker-swiss/xtb-gitops-demo
cd xtb-gitops-demo

Before doing so you might want to have your own new signer (see SetupRP/ProfileRP Certificates for use):

cd trustbroker-inventories/DEMO/keystore/token-signer
./setup-signer.sh # my-subject my-passphrase
git commit -m "Created XTB signer" ./

Import your initial trial repository:

git remote set-url origin ssh://git@localhost:222/trustbroker-swiss/xtb-gitops-demo.git
git push -u origin main

Alternatively, use HTTP:

git remote set-url origin http://git@localhost:3000/trustbroker-swiss/xtb-gitops-demo.git
git push

Run the services in the directory where you stored the tweaked docker-compose.yml and env-vault.conf using the following run.sh:

#!/bin/bash
# Fast lane: Wire secrets into your docker-compose.yml and run it with 'docker-compose up' attached to console.
# Below we run it the correct way.

# get secrets
source env-vault.conf

# validate
[ ! -n "$STATECACHE_PASS" ] && echo "ERROR: STATECACHE_PASS undefined" && exit 1
[ ! -n "$PKI_PASSPHRASE" ] && echo "ERROR: PKI_PASSPHRASE undefined" && exit 1
if [ -z "$SSH_KEY" -a -z "$GIT_TOKEN" -a ! -r ssh/id_rsa -a ! -r ssh/git_token ]; then
	echo "INFO: Assuming public access to $GIT_URL"
	echo "HINT: GIT_TOKEN should be defined for private access via ENV or mapped to /etc/trustbroker/keys/git_token"
	echo "HINT: SSH_KEY should be defined for private access via ENV or mapped to /etc/trustbroker/keys/id_rsa"
fi

# run service mesh in foreground
docker compose up

# run service mesh in background and follow trustbroker log
#docker compose up -d
#docker logs -f trustbroker

Configuration

This section provides insights into the various configurations and their purpose. All configuration files maintained in a git branch, XTB is started with, are pulled within one minute by a scheduled job. To speed up experimenting or engineering configurations, run the reconfig.sh script on the side.

So the configuration workflow is as follows:

  • Run XTB with a GIT_URL pointing to your GitOps repository (CONFIG_BRANCH=master is default).

  • Engineer your configuration and push them (the usual git add, commit, push workflow applies).

  • Wait until the console shows the reconfiguration or speed it up using the reconfig.sh script mentioned at the end.

  • Test your changes.

Global Settings

XTB is a spring-boot microservice running with a builtin application.yml for defaults and a spring.profiles.active=DEMO activated application.yml from the GitOps repository overriding or completing these defaults.

The following annotated demo file shows insights:

---
server:
  tomcat:
    threads: # scaling
      max: 100
      min-spare: 50
  servlet:
    session:
      cookie:
        name: BSESSION
  ssl:
    enabled: false

spring:
  datasource:
    url: ${spring.flyway.url}/${spring.flyway.schemas}
    username: trustbroker
    password: ${STATECACHE_PASS}
    driverClassName: ${spring.flyway.driver-class-name}
    hikari:
      maximum-pool-size: 30 # we run 3 pods in PROD => 90 connections max on mariadb (max acceptable is 150 per default)
      connection-timeout: 15000 # DB connection establish timeout in case of network problems (default: 30000ms = 10min)
      minimum-idle: 3 # close connections being idle for idle-timeout except if we have too few afterwards
      idle-timeout: 300000 # maximum connection idle time (default: 600000ms = 10min)
      max-lifetime: 1800000 # maximum connection lifetime in the pool after close (default: 1800000ms = 30min, mariadb has 60min)
      keepalive-time: 600000 # less than max-lifetime using connection-test-query to probe the DB (default: 0ms == disabled)
      connection-test-query: select 1 from dual # probe DB according to keepalive-time
  flyway:
    enabled: true
    url: jdbc:mariadb://mariadb:3306
    user: root
    password: ${STATECACHE_PASS}
    schemas: TBSS16
    driver-class-name: org.mariadb.jdbc.Driver
    locations: [ classpath:db/migration/mariadb ]
    baselineOnMigrate: true # force upgrading XTB schema even though the database is not empty

trustbroker:
  config:
    issuer: http://localhost:8090 # Issuer ID used to identify assertion/token issuer
    perimeterUrl: ${trustbroker.config.issuer} # Override if network endpoint cannot be derived from issuer ID
    adminSecret: 'trustbroker.config.adminSecret'
    traceIdHeader: X-Request-Id # use edge infrastructure injected HTTP header to correlate all logs belonging to a request
    sessionLifetimeSec: 1800 # 30min user login latency on CP/IDP
    ssoSessionLifetimeSec: 43200 # 12h without re-auth when SSO enabled=true and not SAML forceAuthn=true or OIDC prompt=login
    ssoMinQoaLevel: -2 # we allow SSO for any QOA level sent by CP i.e. unspecified having order# -1 is good enough
    handleResponderErrors: false # Pass through CP/IDP SAML responder messages to CP/SP
    # Allow access to some halfway public APIs usually not exposed on internet (header injected by network perimeter)
    network:
      networkHeader: 'X-ClientNetwork'
      internetNetworkName: INTERNET
      intranetNetworkName: INTRANET
    # Support a global signer and the option to read multiple certs from a single keystore (including p12) by picking by name
    signer:
      signerCert: ${TRUSTBROKER_HOME}/configuration/latest/keystore/token-signer/keystore.pem
      password: "${PKI_PASSPHRASE}"
    rolloverSigner:
      signerCert: ${TRUSTBROKER_HOME}/configuration/latest/keystore/token-signer/rollover-keystore.pem
      password: "${PKI_PASSPHRASE}"
    claimsMapping:
      syncSchedule: '0 */1 * * * *' # check for git changes every 1min
    stateCache:
      reapSchedule: '30 * * * * *' # check every minute for collectable sessions (see spring CronExpression)
      reapMaxDelaySec: 25 # randomize actual execution start in multiple instance deployments (K8S replicas)
      targetMaxEntries: 104857 # may number of sessions before garbage collecting the oldest valid ones
      minSessionLifetimeSec: ${trustbroker.config.sessionLifetimeSec}
    secureBrowserHeaders: true # false required for OIDC when XTB runs on http instead of https
    security: # some of the following checks can be configured in RelyingPartySecurityPolicies or ClaimsParty.SecurityPolicies
      tokenLifetimeSec: 3600 # Assertion/Condition/Subject timestamp create/check, override on RP SecurityPolicies.notOnOrAfter
      messageLifetimeSec: 28800 # AuthnRequest/Response/LogoutRequest IssueInstant timestamp check (accepted max)
      notBeforeToleranceSec: -5 # NTP time drift accepted from peer for notBefore timestamps
      notOnOrAfterToleranceSec: 5 # NTP time drift accepted from peer for notOnOrAfter timestamps
      requireSignedAuthnRequest: true # CP/IDP per default expect signed request
      requireSignedResponse: true # CP/IDP per default must sign response
      requireSignedAssertion: true # CP/IDP per default must sign assertion within response
      validateAuthnRequest: true # RP/SP per default must sign request
      validateXmlSchema: true # Peers must comply to SAML protocol schemas pre default
      validateAcs: false # Incoming AssertionConsumerURL is validated against ACWhitelist
      validateRelayState: true # SAML RelayState is required and must match session
      validateAudience: true # SAML audience is matched against XTB issuer if found
      requireAudienceRestriction: false # Non-matching SAML audience results in an error
      validateResponseIssuer: false # SAML response issuer must match ClaimsParty.id (recommended)
      requireSubjectConfirmation: true # SAML responses must contain a SubjectConfirmation element
      validateSubjectConfirmationTimestamp: true # Timestamps must be in range
      validateSubjectConfirmationInResponseTo: true # SAML InResponseTo response attribute must match request ID
      validateRequestIssueInstant: true # Check request IssueInstant timestamp against messageLifeTimeSec
      validateRequestCondition: true # Check Condition before/after timestamps against tokenLifetimeSec and tolerances
      validateResponseIssueInstant: true # Check IssueInstant timestamp against messageLifeTimeSec
      validateAssertionIssueInstant: true # Check IssueInstant timestamp against messageLifeTimeSec
      validateAuthnStatementIssueInstant: true # Check IssueInstant timestamp against messageLifeTimeSec
      doSignAssertions: true # RP/SP responses must contain assertion signed by XTB
      doSignSuccessResponse: true # RP/SP responses must be signed by XTB
      doSignFailureResponse: true # RP/SP responders messages must be signed too
    # global Qoa model defining the order, order then optional in SetupRP/SetupCP
    qoa:
      defaultQoa: 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport'
      strongestPossible: 'urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI'
      mapping:
        '[urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorUnregistered]': 100
        '[urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport]': 200
        '[urn:oasis:names:tc:SAML:2.0:ac:classes:NomadTelephony]': 300
        '[urn:oasis:names:tc:SAML:2.0:ac:classes:SoftwareTimeSyncToken]': 300
        '[urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos]': 400
        '[urn:oasis:names:tc:SAML:2.0:ac:classes:SoftwarePKI]': 500
        '[urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract]': 500
        '[urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken]': 500
        '[urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI]': 600
    saml:
      consumerUrl: ${trustbroker.config.perimeterUrl}/api/v1/saml # SAML post protocol endpoint
      artifactResolution:
        serviceUrl: ${trustbroker.config.perimeterUrl}/api/v1/saml/arp # SAML artifact resolution protocol endpoint
        index: 0
        artifactLifetimeSecs: 60
        artifactReapIntervalSecs: 300
        persistentCache: true # store artifacts in sessiondb
        truststore:
          signerCert: ${TRUSTBROKER_HOME}/configuration/latest/keystore/outgoing-tls-trust/truststore.p12
          password: "${PKI_PASSPHRASE}"
    oidc:
      issuer: "${trustbroker.config.issuer}" # iss claim setup
      perimeterUrl: "${trustbroker.config.perimeterUrl}/login/saml2/sso" # XTB OIDC federation forward
      sessionMode: IN_DB # use mariadb for state sharing
      endSessionEndpoint: "${trustbroker.config.oidc.issuer}/logout"
      sessionLifetimeSec: ${trustbroker.config.sessionLifetimeSec}
      sessionCookie: true # set additional tracking cookie for clients to detect session termination
      identityProvider:
        assertionConsumerService: "${trustbroker.config.saml.consumerUrl}"
        responseIssuerId: ${trustbroker.config.issuer}
        signer:
          signerCert: ${trustbroker.config.signer.signerCert}
          password: ${trustbroker.config.signer.password}
          keyEntryId: ${trustbroker.config.signer.keyEntryId}
      samlEncrypt: false # encrypt SAML messages sent from XTB/SAML to XTB/OIDC (more SAMl attributes than OIDC claims
      keySchedule: "0 0 1 * * *" # key rotation daily at 1 am (see spring CronExpression)
      keyExpirationMinutes: 2880 # keys valid for 48 hours (requires clients to fetch keys at least once a day)
      keyDeletionMinutes: 3000 # keys kept 2h longer in the database for debugging
      defaultQoa: "urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified" # fallback for acr_values claims
      # Globally customize /token and /userinfo output dropping technical claims (typ=JWT and iss=issuer we keep for now)
      addTokenClaims: # used on /token endpoint to whitelist OIDC technical claims
        - acr # auth context class refs
        - aud # audience => client_id and other audiences
        - auth_time # authorize time
        - azp # authorized party => client_id
        - exp # token expiration
        - iat # token issued at
        - iss # OIDC issuer ID
        - jti # JSON token ID
        - nbf # token valid not before
        - nonce # message only once ID
        - scope # claims selection
        - session_state # OIDC session spec (future)
        - sid # front channel logout session ID
        - typ # keycloak specific token typing
      removeUserInfoClaims: # used in /userinfo endpoint to blacklist OIDC technical claims (i.e. remove them from response)
        - aud
        - auth_time
        - azp
        - exp
        - iat
        - jti
        - nbf
        - nonce
        - scope
        - session_state
        - sid
    gui:
      defaultLanguage: de # XTB supports de,fre,it,en per default
      features:
        - HEADER
        - FOOTER
      buttons:
        - HELP_PANEL # or HELP_LINK
        - LANGUAGE_SHORT # or LANGUAGE_LONG
      themeCookie:
        name: THEME
        defaultValue: default
        values:
          - default
      languageCookie:
        name: LANG
    skinnyHrdTriggers: # MSIE workaround using a hard-coded HRD handling instead of the standard application
      - name: 'User-Agent'
        regex: '.*Trident/7.*'
        value: '/skinnyColHRD.html'

logging:
  level:
    root: INFO
    swiss.trustbroker.script: DEBUG

Claims Provider Definitions

This configuration defines the identification and visual aspects of CPs shown on the HRD screen. HRD (home realm discovery) provides the means for a user to select from multiple CPs one, where an onboarding was done and an account is available.

The HRD screen is not shown, when only one CPs is federated. The definition is necessary anyway. The DEMO setup uses the SAML mock in 2 instances.

<?xml version="1.0" encoding="utf-8"?>
<!-- Define the HRD tiles for the claims parties defined in SetupCP_*.xml -->
<ClaimsProviderDefinitions>
	<ClaimsProvider name="SamlMock-1"
					id="urn:trustbroker.swiss:idp:SAML-MOCK-1"
					img="Tile_SAML-Mock.svg"
					description="saml-mock-1"
					shortcut="SM" color="#11AABB"
	/>
	<ClaimsProvider name="SamlMock-2"
					id="urn:trustbroker.swiss:idp:SAML-MOCK-2"
					img="Tile_SAML-Mock.svg"
					description="saml-mock-2"
					shortcut="SM2" color="#FFAA33"
	/>
	<ClaimsProvider name="SamlMock-2"
					id="urn:trustbroker.swiss:idp:SAML-MOCK-3"
					img="Tile_SAML-Mock-3.svg"
					description="saml-mock-3"
					shortcut="SM2" color="#FFAA33"
	/>
</ClaimsProviderDefinitions>

Single Sign On Groups

SSO groups provide a means to join multiple relying parties into a single login group during a period defined by the group. A login with the same CP is then not required anymore.

<?xml version="1.0" encoding="utf-8"?>
<!--
Define SSO groups and their lifecycle to join multiple relying parties into a single per CP login session:
- name: SSO group name used in RelyingParty.SSO element
- maxIdleTimeMinutes: Time until the SSO session expires without any interaction from any SSO participants
- maxSessionTimeMinutes: Time until the SSO session expires unconditionally
- maxCachingTimeMinutes: Set this one to the same value as maxSessionTimeMinutes (future feature may be)
-->
<SSOGroupSetup>
	<SSOGroup name="SSO-GROUP-1"
			  maxIdleTimeMinutes="120"
			  maxSessionTimeMinutes="600"
			  maxCachingTimeMinutes="600"
	/>
</SSOGroupSetup>

Claims Party Setup

The SetupCP.xml defines the technical association with an CP. It’s id must match the one in the ClaimsProviderDefinition.xml. A trust anchor is required because SAML responses from an CP must be signed. Assertion signing is optional but recommended. The incoming assertion attributes are declared to also document the expected input from the CP.

<?xml version="1.0" encoding="utf-8"?>
<ClaimsProviderSetup>
	<ClaimsParty id="urn:trustbroker.swiss:idp:SAML-MOCK-1">
		<SSOUrl>http://localhost:7070/auth/saml2/idp/samples</SSOUrl>
		<Certificates>
			<SignerTruststore>
				<CertPath>token-signer/keystore.pem</CertPath>
				<Password>$PKI_PASSPHRASE</Password>
			</SignerTruststore>
		</Certificates>
		<Saml>
			<ArtifactBinding inboundMode="SUPPORTED" outboundMode="SUPPORTED"/>
		</Saml>
		<!-- CP attributes to be propagated -->
		<AttributesSelection>
			<Definition name="EMail" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"/>
			<Definition name="FirstName" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"/>
			<Definition name="FamilyName" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"/>
		</AttributesSelection>
	</ClaimsParty>
</ClaimsProviderSetup>

Relying Party Profile

Profiles provide a mechanism to declare a template for multiple relying parties using the same protocols, claims definitions and mapping procedures.

The content of a ReylingParty declared in here needs to be correctly ordered according to the configuration schema (see ReylingParty.java or the XSD files in the docker image).

The order reflects the processing model (see architecture) so reading a ProfileRP or SetupRP top down reflects which elements are used when processing the federation:

  • Input validation (issuer/client IDs, signatures using truststore, security policies affecting request processing)

  • Handling protocols (Saml, Oidc sections)

  • Applying XTB features (like SSO)

  • Dispatching towards CPs using ClaimsProviderMappings

  • On response from CP apply CP AttributesSelection filtering

  • Invoke IDM service applying list of configured IDMQuery (not shown in OSS yet)

  • On response to RP apply UserDetailsSelection (IDM source), PropertiesSelection (computed by scripts) and ClaimsSelection (towards OIDC) filtering

  • Scripts affect the overall processing and are last

<?xml version="1.0" encoding="utf-8"?>
<!-- A base profile defines defaults used by all RelyingParty setups referring to it -->
<RelyingParty>
	<Certificates>
		<!-- Signer towards all RPs -->
		<SignerKeystore>
			<CertPath>token-signer/keystore.pem</CertPath>
			<Password>$PKI_PASSPHRASE</Password>
		</SignerKeystore>
		<!-- Fallback: We only trust ourselves -->
		<SignerTruststore>
			<CertPath>token-signer/keystore.pem</CertPath>
			<Password>$PKI_PASSPHRASE</Password>
		</SignerTruststore>
	</Certificates>
	<SecurityPolicies
			notOnOrAfterSeconds="3600"
			requireSignedAuthnRequest="true"
			requireSignedLogoutRequest="true"
			validateXmlSchema="true"
	/>
	<Oidc>
		<Client id="template">
			<!-- Access restrictions (development only) -->
			<RedirectUris>
				<ACUrl>https://oidcdebugger.com/debug</ACUrl>
				<ACUrl>http://localhost:0/.*</ACUrl>
			</RedirectUris>
			<!-- PKCE code flow with requireProofKey=true and client authentication none -->
			<OidcSecurityPolicies
					requireProofKey="true"
					tokenTimeToLiveMin="60"
					refreshTokenTimeToLiveMin="60"
			/>
			<!-- Supported subset of https://openid.net/specs/openid-connect-core-1_0.html#TokenRequest -->
			<AuthorizationGrantTypes>
				<GrantType>authorization_code</GrantType>
				<GrantType>refresh_token</GrantType>
			</AuthorizationGrantTypes>
			<!-- Supported subset of https://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication -->
			<ClientAuthenticationMethods>
				<Method>none</Method>
				<Method>client_secret_basic</Method>
				<Method>client_secret_post</Method>
			</ClientAuthenticationMethods>
			<!-- Scopes see https://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims -->
			<Scopes>
				<Scope>openid</Scope>
				<Scope>profile</Scope>
				<Scope>email</Scope>
			</Scopes>
			<!-- Claims see at https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims -->
			<ClaimsSelection>
				<Definition name="EMail" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
							oidcNames="email" multiValued="STRING"/>
				<Definition name="FirstName" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"
							oidcNames="given_name"/>
				<Definition name="Name" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"
							oidcNames="family_name"/>
				<Definition name="dateOfBirth" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth"
							oidcNames="birthdate" multiValued="STRING" oidcMapper="TIME_EPOCH"/>
				<Definition name="address" namespaceUri="address"
							oidcNames="address"/>
				<Definition name="displayName" namespaceUri="2.16.840.1.113730.3.1.241"
							oidcNames="name" multiValued="LIST"/>
				<Definition name="displayName" namespaceUri="2.16.840.1.113730.3.1.241"
							oidcNames="name" multiValued="LIST"/>
			</ClaimsSelection>
		</Client>
	</Oidc>
	<Saml>
		<ArtifactBinding inboundMode="SUPPORTED" outboundMode="SUPPORTED"/>
		<!-- XML security defaults according to https://www.w3.org/TR/xmlsec-algorithms/ -->
		<Signature>
			<CanonicalizationAlgorithm>http://www.w3.org/2001/10/xml-exc-c14n#</CanonicalizationAlgorithm>
			<SignatureMethodAlgorithm>http://www.w3.org/2001/04/xmldsig-more#rsa-sha256</SignatureMethodAlgorithm>
			<DigestMethod>http://www.w3.org/2001/04/xmlenc#sha256</DigestMethod>
		</Signature>
	</Saml>
	<!-- SSO also is used in disabled mode so XTB knows where to send the LogoutResponse to -->
	<SSO enabled="false" sloUrl="please-define-if-rp-does-saml-logouts"/>
	<!-- Processing: Accepted incoming original issuer attributes -->
	<AttributesSelection>
		<Definition name="EMail" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"/>
		<Definition name="FirstName" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"/>
		<Definition name="FamilyName" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"/>
		<Definition name="dateOfBirth" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth"/>
		<Definition name="displayName" namespaceUri="2.16.840.1.113730.3.1.241"/>
		<!-- CP is visible only in SAML OriginalIssuer in RP response. Make it visible as an OIDC claim. -->
		<Definition name="HomeRealmHint" namespaceUri="HomeRealmHint" oidcNames="homerealmhint"/>
	</AttributesSelection>
	<!-- Processing: Attributes computed in groovy scripts. It's possible to use oidcNames declarations already on any selection definition. -->
	<PropertiesSelection>
		<!-- Computed birthdate can be picked exclusively (remove from AttributesSelection above, or in the groovy script. -->
		<Definition name="displayName" namespaceUri="2.16.840.1.113730.3.1.241" oidcNames="name" multiValued="LIST"/>
		<!-- ssoSessionId is an XTB specific claim that allows to identify the federation session source -->
		<Definition name="ssoSessionId" namespaceUri="http://trustbroker.swiss/claims/ssoSessionId" oidcNames="ssoSessionId"/>
	</PropertiesSelection>
	<!-- Processing: All RP side hooks dumping provided request/response data -->
	<Scripts>
		<Script type="BeforeHrd">DebugRpRequest.groovy</Script>
		<Script type="BeforeIdm">DebugCpResponse.groovy</Script>
		<Script type="AfterIdm">DebugCpResponse.groovy</Script>
		<Script type="OnToken">DebugCpResponse.groovy</Script>
		<Script type="OnUserInfo">DebugCpResponse.groovy</Script>
	</Scripts>
</RelyingParty>

Relying Party Setup

The SetupRP.xml defines the federation with the SAML service provider or OIDC application client based on the ProfileRP.xml it refers to.

The profile is optional but recommended to reduce bad copy&paste habits and maintain site policies within few profiles. The merging is done at startup or when a git configuration change is detected. Broken configurations are ignored for resilience.

<?xml version="1.0" encoding="utf-8"?>
<!-- relying party setup showing the basics of non-SSO usage -->
<RelyingPartySetup>
	<RelyingParty id="urn:trustbroker.swiss:sp:DEMO-RP-1" base="ProfileRP_DemoDefaults.xml">
		<ACWhitelist>
			<ACUrl>http://localhost:7070/authn/consumer</ACUrl>
		</ACWhitelist>
		<Saml>
			<ProtocolEndpoints>
				<MetadataUrl>http://localhost:7070/saml/metadata</MetadataUrl>
				<ArtifactResolutionUrl>http://localhost:7070/authn/arp</ArtifactResolutionUrl>
				<ArtifactResolutionIndex>0</ArtifactResolutionIndex>
			</ProtocolEndpoints>
			<ArtifactBinding inboundMode="SUPPORTED" outboundMode="SUPPORTED"/>
		</Saml>
		<SSO enabled="false" sloUrl="http://localhost:7070/auth/saml/slo"/>
		<ClaimsProviderMappings>
			<ClaimsProvider id="urn:trustbroker.swiss:idp:SAML-MOCK-1"/>
			<ClaimsProvider id="urn:trustbroker.swiss:idp:SAML-MOCK-2"/>
			<ClaimsProvider id="urn:trustbroker.swiss:idp:SAML-MOCK-3"/>
			<!-- invisible but addressable CP, remove the previous entry to make SAML-MOCK-3 invisible on the HRD screen -->
			<ClaimsProvider id="urn:trustbroker.swiss:idp:SAML-MOCK-3" relyingPartyAlias="urn:trustbroker.swiss:sp:DEMO-RP-3"/>
		</ClaimsProviderMappings>
		<Scripts>
			<Script type="BeforeHrd">HrdAutoSelectClaimsProvider.groovy</Script>
			<Script type="AfterIdm">ComputeDerivedAttributes.groovy</Script>
		</Scripts>
	</RelyingParty>
</RelyingPartySetup>

Qoa Setup

XTB can do Qoa (acr) checking and enforcement mapping authentication context classes on CP and RP side.

The Qoa model is configured in 3 areas: - A global model can be defined in the trustbroker.config.qoa section so the SetupRP/SetupCP Qoa sections do not need to define the order number (specifying which ACClass is stronger than another). - SetupRP defines defaults an RP requires (assuming default comparison type exact). This list is used when the RP does not send any requirements or it’s used to validate incoming requirements. - SetupCP defines what the federated IdP supports and is used for outbound mapping (using the internal order numbers) and also to validate, what the CP returns.

RP Qoa example (validating/mapping inbound acr value and mapping back outbound values):

<?xml version="1.0" encoding="utf-8"?>
<RelyingPartySetup>
	<RelyingParty id="urn:trustbroker.swiss:sp:QOA-RP-2" base="ProfileRP_DemoDefaults.xml">
		<ACWhitelist>
			<ACUrl>http://localhost:7070/authn/consumer</ACUrl>
		</ACWhitelist>
		<SSO enabled="false" sloUrl="http://localhost:7070/auth/saml/slo"/>
		<ClaimsProviderMappings>
			<ClaimsProvider id="urn:trustbroker.swiss:idp:SAML-MOCK-2"/>
		</ClaimsProviderMappings>
		<Qoa enforce="true">
			<!-- Accepted Qoa names sent by RPs, order number is optional if trustbroker.config.qoa defines a global model -->
			<ACClass order="099">qoa-099-custom</ACClass>
			<ACClass order="100">urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorUnregistered</ACClass>
			<ACClass order="200">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</ACClass>
			<ACClass order="300">urn:oasis:names:tc:SAML:2.0:ac:classes:NomadTelephony</ACClass>
			<ACClass order="301">urn:oasis:names:tc:SAML:2.0:ac:classes:SoftwareTimeSyncToken</ACClass>
			<ACClass order="400">urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos</ACClass>
			<ACClass order="500">urn:oasis:names:tc:SAML:2.0:ac:classes:SoftwarePKI</ACClass>
			<ACClass order="501">urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract</ACClass>
			<ACClass order="502">urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken</ACClass>
			<ACClass order="600">urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneSmartcardPKIFactorUnregistered</ACClass>
		</Qoa>
	</RelyingParty>
</RelyingPartySetup>

CP Qoa example (mapping inbound acr values and validating/mapping outbound values):

<?xml version="1.0" encoding="utf-8"?>
<ClaimsProviderSetup>
	<ClaimsParty id="urn:trustbroker.swiss:idp:SAML-MOCK-2">
		<SSOUrl>http://localhost:7070/auth/saml2/idp/samples</SSOUrl>
		<Certificates>
			<SignerTruststore>
				<CertPath>token-signer/keystore.pem</CertPath>
				<Password>$PKI_PASSPHRASE</Password>
			</SignerTruststore>
		</Certificates>
		<SecurityPolicies
				requireSignedResponse="true"
				validateXmlSchema="true"
		/>
		<Saml>
			<ArtifactBinding inboundMode="SUPPORTED" outboundMode="SUPPORTED"/>
		</Saml>
		<!-- use another claim as NameID on CP side -->
		<SubjectNameMappings preserve="false">
			<SubjectName
					issuer="urn:trustbroker.swiss:idp:SAML-MOCK-2"
					source="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
					format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
			/>
		</SubjectNameMappings>
		<!-- CP-side QoA supported mapped from RP-side context classes (100 and 600 not supported by CP) -->
		<!-- SAML comparisonType=exact is default, minimum is used when RP does not send it,  -->
		<Qoa enforce="true" comparison="minimum">
			<ACClass order="099">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</ACClass>
			<ACClass order="200">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</ACClass>
			<ACClass order="300">urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract</ACClass>
			<ACClass order="301">urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract</ACClass>
			<ACClass order="400">urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract</ACClass>
			<ACClass order="500">urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract</ACClass>
			<ACClass order="501">urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract</ACClass>
		</Qoa>
		<!-- CP attributes to be propagated -->
		<AttributesSelection>
			<Definition name="EMail" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"/>
			<Definition name="FirstName" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"/>
			<Definition name="FamilyName" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"/>
			<!-- https://schemas.xmlsoap.org/ws/2005/05/identity/Identity_Selector_Interoperability_Profile_V1.5.pdf -->
			<Definition name="dateOfBirth" namespaceUri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth"/>
			<!-- https://docs.ldap.com/specs/rfc2798.txt (source 1) -->
			<Definition name="displayName" namespaceUri="2.16.840.1.113730.3.1.241"/>
			<!-- IDP sending HRD name for some users -->
			<Definition name="HomeRealmHint" namespaceUri="HomeRealmHint"/>
		</AttributesSelection>
		<Scripts>
			<!-- Incoming from CP we can already validate and compute some derived claims -->
			<Script type="BeforeIdm">ComputeDerivedAttributes.groovy</Script>
		</Scripts>
	</ClaimsParty>
</ClaimsProviderSetup>

PKI Setup

OIDC

OIDC uses automatically generated keys that are rotated (per default) weekly.

Clients not checking the JWKS endpoint:

  • when the kid claim in the header does not match the local key set.

  • periodically but at least once a week

might run into JWT signature verification problems. Key rotation settings need to be tuned in this case in the global configuration (see above). It’s recommended to fix the client instead.

XTB fetches and caches OIDC CP metadata on start-up and updates it periodically or when a key is referenced that is not cached.

SAML

XTB supports various keystore formats, but we recommend the first 2:

  • keystore.pem: OpenSSL PEM formatted certificate along with the private RSA key, protected by the PKI_PASSPHRASE from the runtime environment (K8S secret, CO vault)

  • truststore.pem: The same but no private key in their. This one instead might contain multiple trusted certificates (e.g. when the peer is in the process of replacing its signer)

  • keystore.p12: PKCS12 keystores with or without private keys.

  • keystore.jks: Java keystores are fast but not recommended, use one of the other formats.

Tools to work with keystores:

  • openssl

  • keytool (mainly to read JKS and transfer private keys into PKCS12 files for openssl handling)

Please check the installation documentation for signer generation.

Groovy Scripts

Setup and profile configurations can refer to groovy scripts to customize federation data and flow. Check the scripting section for insights.

UI Setup

XTB has a small frontend for various purposes, mainly HRD (see above) and error display.

The following can be customized:

  • config: The global settings contain a few UI influencing settings (e.g. the site specific language cookie, if the browser language shall be overruled)

  • translations: Texts for languages de, fr, en and it.

  • images: The tile images used on the HRD screen and declared in the ClaimsProviderDefinition.xml (see above)

  • assets: The theme resources to provide a corporate identity (icons, style, logo)

Text handling:

  • Text keys can be found in trustbroker-frontend/src (look for the ng translate items).

  • Texts are maintained in texts.json for convenience and can be exchanged as texts.csv for translation services.

  • The text2json.py script checks the maintained master file and generates the derived de/fr/en/it.json translations.

Theme Customizing

See xtb-gitops-demo for assets and check the CSS to see if the styling of the interactive parts of XTB (usually HRD and error screen) fits your needs.

Reconfiguration Process

On first time use the repository is cloned into the configCache.

XTB from then on checks the GitOps repository for changes and if commits are detected:

  • git pull the changes in configCache

  • copy the selected stage profile into configuration/new

  • validate the configuration

  • if ok activate the configuration by swapping latest configuration into the previous one and the new one takes its place.

This allows to diff latest against previous to see what changed. Changes are also INFO logged in the console.

During development the following script speeds up the re-configuration process:

#!/bin/bash
# Script allows to speed up the configuration loading on XTB.

PERIOD=${1:-5}
while [ true ]; do
	curl -k -X POST http://localhost:8090/api/v1/config \
	     -H 'Content-Type: application/json' \
	     -d '{"action":"reload","adminSecret":"trustbroker.config.adminSecret"}'
	sleep $PERIOD
done

Scripting

XTB supports scripting within the federation processing for various purposes (see processing model in the architecture section).

The scripting engine is Groovy based on the underlying Java libraries.

This allows a wide range of manipulations so make sure that the code you are injecting via scripts meets security requirements, specifically:

  • Input validation on the values that are processed.

  • Manipulating identity (specifically CPRepsonse.nameId) and authorization attributes (e.g. roles claims) as required.

  • Establish a review process via pull requests in your GitOps repository.

LOG

The LOG object allows access to the logging facility using the SLF4J API. You can use error, warn, info, debug and trace methods with parameter binding:

// Purpose: Dump bound SP request date to console (bindings, see ScriptService.java)
// Note: Consider documentation and RPRequest.java members that should be used in scripts.
LOG.debug("DEMO: Process federation request from referer {}", HTTPRequest.getHeader("Referer"))
LOG.trace("DEMO RPRequest: {}", RPRequest)

RPRequest

The RPRequest object is bound to computationally influence in-bound messages, specifically:

  • Deciding on home realm discovery (HRD) routing based on the HTTP or SAML/OIDC protocol (you can drop or retain CPs).

  • Handling authentication context class mappings towards claims providers (you can validate and map RPRequest.contextClasses on the way to the CP).

Example:

// Purpose: Show how user-agent context can be used to do IDP dispatching automatically.
// Example: Loadbalancer injecting a network identifier on the network perimeter.
// Security: Either loadbalancer shields the header or IDPs we forward to are save themselves.

strongIdp = "urn:trustbroker.swiss:idp:SAML-MOCK-2"
strongQoa = "urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract"

def isMobileStrongAuthOnly(rpRequest) {
	return rpRequest.contextClasses && rpRequest.contextClasses.size() == 1 && rpRequest.contextClasses.contains(strongQoa)
}

if (RPRequest.getClaimsProviders().size() > 1) {
	def networkDetected = HTTPRequest.getHeader("X-ClientNetwork")
	LOG.debug("Checking automatic HRD for rpIssuer={} with qoa={} from network={} towards cpMappings='{}'",
			RPRequest.rpIssuer, RPRequest.contextClasses, networkDetected, RPRequest.claimsProviders)
	if (isMobileStrongAuthOnly(RPRequest) || "INTRANET".equals(networkDetected)) {
		RPRequest.retainClaimsProvider(strongIdp)
		LOG.info("Automatic HRD for rpIssuer={} with qoa={} from network={} towards cpMappings='{}'",
				RPRequest.rpIssuer, RPRequest.contextClasses, networkDetected, RPRequest.claimsProviders)
	}
}

HTTPRequest

Along the RPRequest a groovy script has access to the HTTP request using the JSR340 API.

CPRepsonse

The CPRepsonse object is bound to handle claims provider responses and manipulate the relying party responses during the phases documented in the Architecture.

These members are of interest for mapping between CP and RP:

  • nameId: The subject name identifier passed as the authentication result from the CP, also represented internally as the NameId 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier' attribute.

  • nameIdFormat: Some relying parties care about the SAML name identifier format to assert a certain authentication quality. This allows to overrule what the CP has decided in case of integration problems.

  • contextClasses: Like on the RPRequest (requested authentication context class references, in short QoA) the CP should respond with one of the requested QoA.

There are the following members to get and set claims:

  • attributes: They come from the CPs and are sent to RPs with an OriginalIssuer=CP-IssuerID

  • userDetails: XTB has an IdmQueryService abstraction. Claims from such user registries should use this to store claims.

  • properties: Groovy scripts computing derived claims should store them here so the SetupRP/ProfileRP configuration show the contract properly.

  • claims: These are the OIDC attributes used for OIDC token assembly

The names correspond to the selection 'Definition' lists in the configuration and are associated as follows:

  • CPResponse holds the actual data based on the definition objects in the configuration

  • Definition are copies including the value list and are used to generate the SAML attribute or OIDC claim output

The debug script shown at the beginning will expose all this data on TRACE level.

Please be careful what you use. If not mentioned in this section, you might produce some unwanted results.

// Purpose: Show how OIDC claim enrichment and structured claim assembly works.
// Note: Implements https://openid.net/specs/openid-connect-core-1_0.html#AddressClaim

// some IDP provided attributes
givenName = "" + CPResponse.getAttribute("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname")
familiyName = "" + CPResponse.getAttribute("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname")
// derive OIDC displayName from SAML incoming attributes as OIDC claim only
CPResponse.addClaim("name", givenName + " " + familiyName + " (source:3)")

// derive address from SAML attributes and construct new claim without honoring incoming request scopes
if (CPResponse.oidcScopes && CPResponse.oidcScopes.contains("openid")) {
	CPResponse.addJsonClaim("address", "street_address", "123 " + familiyName + " Street")
	CPResponse.addJsonClaim("address", "locality", "St. " + familiyName)
	CPResponse.addJsonClaim("address", "postal_code", "9999")
	CPResponse.addJsonClaim("address", "country", "Switzerland")
	LOG.info("OnToken hook attached a fake address for clientId={} scopes='{}'", CPResponse.oidcClientId, CPResponse.oidcScopes)
}

Plugin APIs

XTB provides various API hooks for implementing certain features. They are defined in the trustbroker-api module.

API Purpose Status

IdmQueryService

Interface for accessing an Identity Management (IDM) service.

E.g. an implementation could use LDAP or a custom API of the IDM.

Stable

HrdService

Home realm discovery related customizations.

Stable

QualityOfAuthenticationService

Service for mapping between string based authentication levels / quality of authentication to numerical levels.

Stable

AttributeInitializer

Interface used for configuring custom sets of attributes in the AttributeRegistry

Stable

OutputService

A service to render SAML requests and responses.

An implementation is provided by trustbroker-service, generally there should be no need to change that.

May still change -

AnnouncementService

Announcements can be shown e.g. for operational purposes.

Preliminary, may still change

ProfileSelectionService

A user that has different profiles may need to select the profile to use for authentication.

Note: The related OIDC feature prompt=select_account is not yet implemented in XTB.

Preliminary, may still change

AccessRequestService

Access request triggers onboarding of a user to an application due to a missing role.

Preliminary, may still change

Modules

XTB consists of the following modules:

Module Java Package Content

trustbroker-api

swiss.trustbroker.api

Plugin APIs.

trustbroker-test

swiss.trustbroker.test

Classes used by tests of other modules.

trustbroker-common

swiss.trustbroker.common

Classes shared between trustbroker-service and trustbroker-samlmock.

trustbroker-wstrust-service

swiss.trustbroker.wstrust

Service for integrating WS-Trust.

trustbroker-service

swiss.trustbroker.*

The core services of XTB.

trustbroker-xmlconfig

swiss.trustbroker.xmlconfig

Configuration XML schema generated from DTO classes representing the configuration model for external use.

trustbroker-application

swiss.trustbroker

The XTB Spring Boot application

trustbroker-frontend

N/A

Angular-based frontend

trustbroker-samlmock

swiss.trustbroker.samlmock

Mock for testing SAML exchanges based on recorded or hand-crafted messages.

trustbroker-oidcmock

swiss.trustbroker.oidcmock

Mock for testing OICD interaction.

trustbroker-install

N/A

Docker image creation.

trustbroker-docs

N/A

This AsciiDoc documentation.

xtb-gitops-demo

N/A

GIT repository with sample XTB configuration.

Credits

The following open source projects are used by XTB with big thanks:

OSS Project License Remarks

Alpine linux

MIT

https://github.com/alpinelinux/docker-alpine/blob/master/LICENSE

Angular

MIT

https://github.com/angular/angular/blob/main/LICENSE

keycloak.js

Red Hat Apache-2.0

https://github.com/keycloak/keycloak/blob/main/js/libs/keycloak-js/src/keycloak.js. Migration use case only. We prefer you package this with your client ao we can remove it.

org.opensaml

GPL-2

https://github.com/pkp/shibboleth/blob/main/LICENSE

spring-authorization-server

Apache-2.0

https://github.com/spring-projects/spring-authorization-server/blob/main/LICENSE.txt

zulu-openjdk-alpine

GPL-2

https://docs.azul.com/core/tpls/january-2024/zulu17_tpl.html

org.apache.wss4j.wss4j-ws-security-common

Apache-2.0

https://ws.apache.org/wss4j/licenses.html

Eclipse JGit TM

Eclipse Distribution License - v 1.0

https://www.eclipse.org/jgit/

Derivative work is marked in the source as such, along with the original licenses.

All the license details of the Alpine and Java assembly you can find in the SBOM below.

License

XTB itself is licensed under GNU AFFERO GENERAL PUBLIC LICENSE Version 3.

Contributions

Input and contributions to the XTB projects are considered according to:

Software Bill of Material

Library licenses in detail (SBOM report from XRay used for vulnerability checking along Trivy and Sonar scans):

Component Name Licenses Licenses Links Package Type Component Id Package Id Version

3.20:alpine-baselayout

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:alpine-baselayout:3.6.5-r0

alpine://3.20:alpine-baselayout

3.6.5-r0

3.20:alpine-baselayout-data

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:alpine-baselayout-data:3.6.5-r0

alpine://3.20:alpine-baselayout-data

3.6.5-r0

3.20:alpine-keys

Unknown

alpine

3.20:alpine-keys:2.4-r1

alpine://3.20:alpine-keys

2.4-r1

3.20:alsa-lib

Unknown

alpine

3.20:alsa-lib:1.2.11-r0

alpine://3.20:alsa-lib

1.2.11-r0

3.20:apk-tools

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:apk-tools:2.14.4-r1

alpine://3.20:apk-tools

2.14.4-r1

3.20:busybox

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:busybox:1.36.1-r29

alpine://3.20:busybox

1.36.1-r29

3.20:busybox-binsh

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:busybox-binsh:1.36.1-r29

alpine://3.20:busybox-binsh

1.36.1-r29

3.20:ca-certificates-bundle

MIT

http://www.opensource.org/licenses/MIT

alpine

3.20:ca-certificates-bundle:20241121-r1

alpine://3.20:ca-certificates-bundle

20241121-r1

3.20:java-common

Unknown

alpine

3.20:java-common:0.5-r0

alpine://3.20:java-common

0.5-r0

3.20:libbsd

Unknown

alpine

3.20:libbsd:0.12.2-r0

alpine://3.20:libbsd

0.12.2-r0

3.20:libcrypto3

Apache-2.0

http://licenses.nuget.org/Apache-2.0

alpine

3.20:libcrypto3:3.3.3-r0

alpine://3.20:libcrypto3

3.3.3-r0

3.20:libmd

Unknown

alpine

3.20:libmd:1.1.0-r0

alpine://3.20:libmd

1.1.0-r0

3.20:libssl3

Apache-2.0

http://licenses.nuget.org/Apache-2.0

alpine

3.20:libssl3:3.3.3-r0

alpine://3.20:libssl3

3.3.3-r0

3.20:libx11

Unknown

alpine

3.20:libx11:1.8.9-r1

alpine://3.20:libx11

1.8.9-r1

3.20:libxau

Unknown

alpine

3.20:libxau:1.0.11-r4

alpine://3.20:libxau

1.0.11-r4

3.20:libxcb

Unknown

alpine

3.20:libxcb:1.16.1-r0

alpine://3.20:libxcb

1.16.1-r0

3.20:libxdmcp

Unknown

alpine

3.20:libxdmcp:1.1.5-r1

alpine://3.20:libxdmcp

1.1.5-r1

3.20:libxext

Unknown

alpine

3.20:libxext:1.3.6-r2

alpine://3.20:libxext

1.3.6-r2

3.20:libxi

Unknown

alpine

3.20:libxi:1.8.1-r4

alpine://3.20:libxi

1.8.1-r4

3.20:libxrender

Unknown

alpine

3.20:libxrender:0.9.11-r5

alpine://3.20:libxrender

0.9.11-r5

3.20:libxtst

Unknown

alpine

3.20:libxtst:1.2.4-r6

alpine://3.20:libxtst

1.2.4-r6

3.20:musl

MIT

http://www.opensource.org/licenses/MIT

alpine

3.20:musl:1.2.5-r1

alpine://3.20:musl

1.2.5-r1

3.20:musl-utils

BSD-2-Clause,MIT

http://opensource.org/licenses/BSD-2-Clause,http://www.opensource.org/licenses/MIT

alpine

3.20:musl-utils:1.2.5-r1

alpine://3.20:musl-utils

1.2.5-r1

3.20:scanelf

Unknown

alpine

3.20:scanelf:1.3.7-r2

alpine://3.20:scanelf

1.3.7-r2

3.20:ssl_client

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:ssl_client:1.36.1-r29

alpine://3.20:ssl_client

1.36.1-r29

3.20:tzdata

Public Domain

alpine

3.20:tzdata:2025b-r0

alpine://3.20:tzdata

2025b-r0

3.20:zlib

Unknown

alpine

3.20:zlib:1.3.1-r1

alpine://3.20:zlib

1.3.1-r1

3.20:zulu17-ca-jdk

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:zulu17-ca-jdk:17.0.15-r1

alpine://3.20:zulu17-ca-jdk

17.0.15-r1

3.20:zulu17-ca-jdk-headless

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:zulu17-ca-jdk-headless:17.0.15-r1

alpine://3.20:zulu17-ca-jdk-headless

17.0.15-r1

3.20:zulu17-ca-jre

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:zulu17-ca-jre:17.0.15-r1

alpine://3.20:zulu17-ca-jre

17.0.15-r1

3.20:zulu17-ca-jre-headless

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:zulu17-ca-jre-headless:17.0.15-r1

alpine://3.20:zulu17-ca-jre-headless

17.0.15-r1

3.20:zulu17-jdk

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:zulu17-jdk:17.0.15-r1

alpine://3.20:zulu17-jdk

17.0.15-r1

3.20:zulu17-jdk-headless

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:zulu17-jdk-headless:17.0.15-r1

alpine://3.20:zulu17-jdk-headless

17.0.15-r1

3.20:zulu17-jre

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:zulu17-jre:17.0.15-r1

alpine://3.20:zulu17-jre

17.0.15-r1

3.20:zulu17-jre-headless

GPL-2.0-only

http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html

alpine

3.20:zulu17-jre-headless:17.0.15-r1

alpine://3.20:zulu17-jre-headless

17.0.15-r1

ch.qos.logback:logback-classic

EPL-1.0,LGPL-2.1

http://www.eclipse.org/legal/epl-v10.html,http://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html

maven

ch.qos.logback:logback-classic:1.5.18

gav://ch.qos.logback:logback-classic

1.5.18

ch.qos.logback:logback-core

EPL-1.0,LGPL-2.1

http://www.eclipse.org/legal/epl-v10.html,http://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html

maven

ch.qos.logback:logback-core:1.5.18

gav://ch.qos.logback:logback-core

1.5.18

com.fasterxml.jackson.core:jackson-annotations

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.fasterxml.jackson.core:jackson-annotations:2.18.3

gav://com.fasterxml.jackson.core:jackson-annotations

2.18.3

com.fasterxml.jackson.core:jackson-core

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.fasterxml.jackson.core:jackson-core:2.18.3

gav://com.fasterxml.jackson.core:jackson-core

2.18.3

com.fasterxml.jackson.core:jackson-databind

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.fasterxml.jackson.core:jackson-databind:2.18.3

gav://com.fasterxml.jackson.core:jackson-databind

2.18.3

com.fasterxml.jackson.dataformat:jackson-dataformat-toml

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.fasterxml.jackson.dataformat:jackson-dataformat-toml:2.18.3

gav://com.fasterxml.jackson.dataformat:jackson-dataformat-toml

2.18.3

com.fasterxml.jackson.datatype:jackson-datatype-jdk8

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.18.3

gav://com.fasterxml.jackson.datatype:jackson-datatype-jdk8

2.18.3

com.fasterxml.jackson.datatype:jackson-datatype-jsr310

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.18.3

gav://com.fasterxml.jackson.datatype:jackson-datatype-jsr310

2.18.3

com.fasterxml.jackson.module:jackson-module-parameter-names

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.fasterxml.jackson.module:jackson-module-parameter-names:2.18.3

gav://com.fasterxml.jackson.module:jackson-module-parameter-names

2.18.3

com.fasterxml:classmate

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.fasterxml:classmate:1.7.0

gav://com.fasterxml:classmate

1.7.0

com.github.ben-manes.caffeine:caffeine

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.github.ben-manes.caffeine:caffeine:3.1.8

gav://com.github.ben-manes.caffeine:caffeine

3.1.8

com.github.stephenc.jcip:jcip-annotations

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.github.stephenc.jcip:jcip-annotations:1.0-1

gav://com.github.stephenc.jcip:jcip-annotations

1.0-1

com.github.waffle:waffle-jna

JSON,MIT

http://www.json.org/license.html,http://www.opensource.org/licenses/MIT

maven

com.github.waffle:waffle-jna:3.3.0

gav://com.github.waffle:waffle-jna

3.3.0

com.google.code.findbugs:jsr305

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.google.code.findbugs:jsr305:3.0.2

gav://com.google.code.findbugs:jsr305

3.0.2

com.google.code.gson:gson

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.google.code.gson:gson:2.11.0

gav://com.google.code.gson:gson

2.11.0

com.google.errorprone:error_prone_annotations

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.google.errorprone:error_prone_annotations:2.23.0

gav://com.google.errorprone:error_prone_annotations

2.23.0

com.google.guava:failureaccess

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.google.guava:failureaccess:1.0.2

gav://com.google.guava:failureaccess

1.0.2

com.google.guava:guava

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.google.guava:guava:33.0.0-jre

gav://com.google.guava:guava

33.0.0-jre

com.google.guava:listenablefuture

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava

gav://com.google.guava:listenablefuture

9999.0-empty-to-avoid-conflict-with-guava

com.googlecode.javaewah:JavaEWAH

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.googlecode.javaewah:JavaEWAH:1.2.3

gav://com.googlecode.javaewah:JavaEWAH

1.2.3

com.h2database:h2

EPL-1.0,MPL-2.0

http://www.eclipse.org/legal/epl-v10.html,http://opensource.org/licenses/MPL-2.0

maven

com.h2database:h2:2.3.232

gav://com.h2database:h2

2.3.232

com.nimbusds:nimbus-jose-jwt

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.nimbusds:nimbus-jose-jwt:9.43

gav://com.nimbusds:nimbus-jose-jwt

9.43

com.sun.istack:istack-commons-runtime

EPL-1.0

http://www.eclipse.org/legal/epl-v10.html

maven

com.sun.istack:istack-commons-runtime:4.1.2

gav://com.sun.istack:istack-commons-runtime

4.1.2

com.sun.xml.messaging.saaj:saaj-impl

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

com.sun.xml.messaging.saaj:saaj-impl:3.0.4

gav://com.sun.xml.messaging.saaj:saaj-impl

3.0.4

com.zaxxer:HikariCP

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

com.zaxxer:HikariCP:5.1.0

gav://com.zaxxer:HikariCP

5.1.0

commons-beanutils:commons-beanutils

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

commons-beanutils:commons-beanutils:1.9.4

gav://commons-beanutils:commons-beanutils

1.9.4

commons-codec:commons-codec

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

commons-codec:commons-codec:1.17.2

gav://commons-codec:commons-codec

1.17.2

commons-collections:commons-collections

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

commons-collections:commons-collections:3.2.2

gav://commons-collections:commons-collections

3.2.2

commons-io:commons-io

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

commons-io:commons-io:2.17.0

gav://commons-io:commons-io

2.17.0

commons-logging:commons-logging

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

commons-logging:commons-logging:1.2

gav://commons-logging:commons-logging

1.2

io.dropwizard.metrics:metrics-core

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.dropwizard.metrics:metrics-core:4.2.26

gav://io.dropwizard.metrics:metrics-core

4.2.26

io.dropwizard.metrics:metrics-json

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.dropwizard.metrics:metrics-json:4.2.26

gav://io.dropwizard.metrics:metrics-json

4.2.26

io.micrometer:micrometer-commons

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.micrometer:micrometer-commons:1.14.6

gav://io.micrometer:micrometer-commons

1.14.6

io.micrometer:micrometer-core

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.micrometer:micrometer-core:1.14.6

gav://io.micrometer:micrometer-core

1.14.6

io.micrometer:micrometer-jakarta9

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.micrometer:micrometer-jakarta9:1.14.6

gav://io.micrometer:micrometer-jakarta9

1.14.6

io.micrometer:micrometer-observation

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.micrometer:micrometer-observation:1.14.6

gav://io.micrometer:micrometer-observation

1.14.6

io.micrometer:micrometer-registry-prometheus

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.micrometer:micrometer-registry-prometheus:1.13.2

gav://io.micrometer:micrometer-registry-prometheus

1.13.2

io.prometheus:prometheus-metrics-config

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.prometheus:prometheus-metrics-config:1.3.6

gav://io.prometheus:prometheus-metrics-config

1.3.6

io.prometheus:prometheus-metrics-core

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.prometheus:prometheus-metrics-core:1.3.6

gav://io.prometheus:prometheus-metrics-core

1.3.6

io.prometheus:prometheus-metrics-exposition-formats

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.prometheus:prometheus-metrics-exposition-formats:1.3.6

gav://io.prometheus:prometheus-metrics-exposition-formats

1.3.6

io.prometheus:prometheus-metrics-exposition-textformats

Unknown

maven

io.prometheus:prometheus-metrics-exposition-textformats:1.3.6

gav://io.prometheus:prometheus-metrics-exposition-textformats

1.3.6

io.prometheus:prometheus-metrics-model

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.prometheus:prometheus-metrics-model:1.3.6

gav://io.prometheus:prometheus-metrics-model

1.3.6

io.prometheus:prometheus-metrics-tracer-common

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.prometheus:prometheus-metrics-tracer-common:1.3.6

gav://io.prometheus:prometheus-metrics-tracer-common

1.3.6

io.smallrye:jandex

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

io.smallrye:jandex:3.2.0

gav://io.smallrye:jandex

3.2.0

jakarta.activation:jakarta.activation-api

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

jakarta.activation:jakarta.activation-api:2.1.3

gav://jakarta.activation:jakarta.activation-api

2.1.3

jakarta.annotation:jakarta.annotation-api

EPL-2.0

https://spdx.org/licenses/EPL-2.0

maven

jakarta.annotation:jakarta.annotation-api:2.1.1

gav://jakarta.annotation:jakarta.annotation-api

2.1.1

jakarta.inject:jakarta.inject-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

jakarta.inject:jakarta.inject-api:2.0.1

gav://jakarta.inject:jakarta.inject-api

2.0.1

jakarta.mail:jakarta.mail-api

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

jakarta.mail:jakarta.mail-api:2.1.3

gav://jakarta.mail:jakarta.mail-api

2.1.3

jakarta.persistence:jakarta.persistence-api

EPL-1.0,EPL-2.0

http://www.eclipse.org/legal/epl-v10.html,https://spdx.org/licenses/EPL-2.0

maven

jakarta.persistence:jakarta.persistence-api:3.1.0

gav://jakarta.persistence:jakarta.persistence-api

3.1.0

jakarta.transaction:jakarta.transaction-api

EPL-2.0

https://spdx.org/licenses/EPL-2.0

maven

jakarta.transaction:jakarta.transaction-api:2.0.1

gav://jakarta.transaction:jakarta.transaction-api

2.0.1

jakarta.xml.bind:jakarta.xml.bind-api

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

jakarta.xml.bind:jakarta.xml.bind-api:4.0.2

gav://jakarta.xml.bind:jakarta.xml.bind-api

4.0.2

jakarta.xml.soap:jakarta.xml.soap-api

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

jakarta.xml.soap:jakarta.xml.soap-api:3.0.2

gav://jakarta.xml.soap:jakarta.xml.soap-api

3.0.2

jakarta.xml.ws:jakarta.xml.ws-api

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

jakarta.xml.ws:jakarta.xml.ws-api:4.0.2

gav://jakarta.xml.ws:jakarta.xml.ws-api

4.0.2

javax.cache:cache-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

javax.cache:cache-api:1.1.1

gav://javax.cache:cache-api

1.1.1

jrt-fs.jar

Unknown

generic

jrt-fs.jar

generic://sha256:87b4ce9c606b1f901606387bc02269cfed47e595428c31e542d1b3baae76450d/jrt-fs.jar

net.bytebuddy:byte-buddy

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

net.bytebuddy:byte-buddy:1.15.11

gav://net.bytebuddy:byte-buddy

1.15.11

net.i2p.crypto:eddsa

CC0-1.0

http://creativecommons.org/publicdomain/zero/1.0/

maven

net.i2p.crypto:eddsa:0.3.0

gav://net.i2p.crypto:eddsa

0.3.0

net.java.dev.jna:jna

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

net.java.dev.jna:jna:5.13.0

gav://net.java.dev.jna:jna

5.13.0

net.java.dev.jna:jna-platform

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

net.java.dev.jna:jna-platform:5.13.0

gav://net.java.dev.jna:jna-platform

5.13.0

net.shibboleth.utilities:java-support

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

net.shibboleth.utilities:java-support:8.4.0

gav://net.shibboleth.utilities:java-support

8.4.0

net.shibboleth:shib-networking

Unknown

maven

net.shibboleth:shib-networking:9.1.3

gav://net.shibboleth:shib-networking

9.1.3

net.shibboleth:shib-security

Unknown

maven

net.shibboleth:shib-security:9.1.3

gav://net.shibboleth:shib-security

9.1.3

net.shibboleth:shib-support

Unknown

maven

net.shibboleth:shib-support:9.1.3

gav://net.shibboleth:shib-support

9.1.3

net.shibboleth:shib-velocity

Unknown

maven

net.shibboleth:shib-velocity:9.1.3

gav://net.shibboleth:shib-velocity

9.1.3

org.antlr:antlr4-runtime

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

org.antlr:antlr4-runtime:4.13.0

gav://org.antlr:antlr4-runtime

4.13.0

org.apache.commons:commons-lang3

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.commons:commons-lang3:3.17.0

gav://org.apache.commons:commons-lang3

3.17.0

org.apache.commons:commons-text

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.commons:commons-text:1.12.0

gav://org.apache.commons:commons-text

1.12.0

org.apache.groovy:groovy

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.apache.groovy:groovy:4.0.23

gav://org.apache.groovy:groovy

4.0.23

org.apache.groovy:groovy-jsr223

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.groovy:groovy-jsr223:4.0.23

gav://org.apache.groovy:groovy-jsr223

4.0.23

org.apache.httpcomponents.client5:httpclient5

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.httpcomponents.client5:httpclient5:5.4.3

gav://org.apache.httpcomponents.client5:httpclient5

5.4.3

org.apache.httpcomponents.client5:httpclient5-cache

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.httpcomponents.client5:httpclient5-cache:5.4.3

gav://org.apache.httpcomponents.client5:httpclient5-cache

5.4.3

org.apache.httpcomponents.core5:httpcore5

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.httpcomponents.core5:httpcore5:5.3.4

gav://org.apache.httpcomponents.core5:httpcore5

5.3.4

org.apache.httpcomponents.core5:httpcore5-h2

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.httpcomponents.core5:httpcore5-h2:5.3.4

gav://org.apache.httpcomponents.core5:httpcore5-h2

5.3.4

org.apache.logging.log4j:log4j-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.logging.log4j:log4j-api:2.24.3

gav://org.apache.logging.log4j:log4j-api

2.24.3

org.apache.logging.log4j:log4j-to-slf4j

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.logging.log4j:log4j-to-slf4j:2.24.3

gav://org.apache.logging.log4j:log4j-to-slf4j

2.24.3

org.apache.santuario:xmlsec

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.santuario:xmlsec:3.0.4

gav://org.apache.santuario:xmlsec

3.0.4

org.apache.sshd:sshd-osgi

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.sshd:sshd-osgi:2.12.1

gav://org.apache.sshd:sshd-osgi

2.12.1

org.apache.sshd:sshd-sftp

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.sshd:sshd-sftp:2.12.1

gav://org.apache.sshd:sshd-sftp

2.12.1

org.apache.tomcat.embed:tomcat-embed-core

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.tomcat.embed:tomcat-embed-core:10.1.40

gav://org.apache.tomcat.embed:tomcat-embed-core

10.1.40

org.apache.tomcat.embed:tomcat-embed-el

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.tomcat.embed:tomcat-embed-el:10.1.40

gav://org.apache.tomcat.embed:tomcat-embed-el

10.1.40

org.apache.tomcat.embed:tomcat-embed-websocket

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.tomcat.embed:tomcat-embed-websocket:10.1.40

gav://org.apache.tomcat.embed:tomcat-embed-websocket

10.1.40

org.apache.tomcat:tomcat-annotations-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.tomcat:tomcat-annotations-api:10.1.40

gav://org.apache.tomcat:tomcat-annotations-api

10.1.40

org.apache.velocity:velocity-engine-core

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.velocity:velocity-engine-core:2.4.1

gav://org.apache.velocity:velocity-engine-core

2.4.1

org.apache.wss4j:wss4j-ws-security-common

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.wss4j:wss4j-ws-security-common:3.0.3

gav://org.apache.wss4j:wss4j-ws-security-common

3.0.3

org.apache.wss4j:wss4j-ws-security-dom

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.apache.wss4j:wss4j-ws-security-dom:3.0.3

gav://org.apache.wss4j:wss4j-ws-security-dom

3.0.3

org.aspectj:aspectjweaver

EPL-2.0

https://spdx.org/licenses/EPL-2.0

maven

org.aspectj:aspectjweaver:1.9.24

gav://org.aspectj:aspectjweaver

1.9.24

org.bouncycastle:bcpkix-jdk18on

MIT

http://www.opensource.org/licenses/MIT

maven

org.bouncycastle:bcpkix-jdk18on:1.79

gav://org.bouncycastle:bcpkix-jdk18on

1.79

org.bouncycastle:bcprov-jdk18on

MIT

http://www.opensource.org/licenses/MIT

maven

org.bouncycastle:bcprov-jdk18on:1.79

gav://org.bouncycastle:bcprov-jdk18on

1.79

org.bouncycastle:bcutil-jdk18on

MIT

http://www.opensource.org/licenses/MIT

maven

org.bouncycastle:bcutil-jdk18on:1.79

gav://org.bouncycastle:bcutil-jdk18on

1.79

org.checkerframework:checker-qual

MIT

http://www.opensource.org/licenses/MIT

maven

org.checkerframework:checker-qual:3.41.0

gav://org.checkerframework:checker-qual

3.41.0

org.cryptacular:cryptacular

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.cryptacular:cryptacular:1.2.6

gav://org.cryptacular:cryptacular

1.2.6

org.eclipse.angus:angus-activation

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

org.eclipse.angus:angus-activation:2.0.2

gav://org.eclipse.angus:angus-activation

2.0.2

org.eclipse.jgit:org.eclipse.jgit

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

org.eclipse.jgit:org.eclipse.jgit:6.10.0.202406032230-r

gav://org.eclipse.jgit:org.eclipse.jgit

6.10.0.202406032230-r

org.eclipse.jgit:org.eclipse.jgit.ssh.apache

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

org.eclipse.jgit:org.eclipse.jgit.ssh.apache:6.10.0.202406032230-r

gav://org.eclipse.jgit:org.eclipse.jgit.ssh.apache

6.10.0.202406032230-r

org.ehcache.modules:ehcache-107

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.ehcache.modules:ehcache-107:3.10.8

gav://org.ehcache.modules:ehcache-107

3.10.8

org.ehcache.modules:ehcache-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.ehcache.modules:ehcache-api:3.10.8

gav://org.ehcache.modules:ehcache-api

3.10.8

org.ehcache.modules:ehcache-core

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.ehcache.modules:ehcache-core:3.10.8

gav://org.ehcache.modules:ehcache-core

3.10.8

org.ehcache.modules:ehcache-impl

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.ehcache.modules:ehcache-impl:3.10.8

gav://org.ehcache.modules:ehcache-impl

3.10.8

org.ehcache.modules:ehcache-xml

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.ehcache.modules:ehcache-xml:3.10.8

gav://org.ehcache.modules:ehcache-xml

3.10.8

org.ehcache.modules:ehcache-xml-spi

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.ehcache.modules:ehcache-xml-spi:3.10.8

gav://org.ehcache.modules:ehcache-xml-spi

3.10.8

org.ehcache:ehcache

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.ehcache:ehcache:3.10.8

gav://org.ehcache:ehcache

3.10.8

org.ehcache:sizeof

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.ehcache:sizeof:0.4.3

gav://org.ehcache:sizeof

0.4.3

org.flywaydb:flyway-core

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.flywaydb:flyway-core:10.20.1

gav://org.flywaydb:flyway-core

10.20.1

org.flywaydb:flyway-mysql

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.flywaydb:flyway-mysql:10.20.1

gav://org.flywaydb:flyway-mysql

10.20.1

org.glassfish.jaxb:jaxb-core

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

org.glassfish.jaxb:jaxb-core:4.0.5

gav://org.glassfish.jaxb:jaxb-core

4.0.5

org.glassfish.jaxb:jaxb-runtime

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

org.glassfish.jaxb:jaxb-runtime:4.0.5

gav://org.glassfish.jaxb:jaxb-runtime

4.0.5

org.glassfish.jaxb:txw2

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

org.glassfish.jaxb:txw2:4.0.5

gav://org.glassfish.jaxb:txw2

4.0.5

org.hdrhistogram:HdrHistogram

CC0-1.0

http://creativecommons.org/publicdomain/zero/1.0/

maven

org.hdrhistogram:HdrHistogram:2.2.2

gav://org.hdrhistogram:HdrHistogram

2.2.2

org.hibernate.common:hibernate-commons-annotations

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.hibernate.common:hibernate-commons-annotations:7.0.3.Final

gav://org.hibernate.common:hibernate-commons-annotations

7.0.3.Final

org.hibernate.orm:hibernate-core

LGPL-2.1

http://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html

maven

org.hibernate.orm:hibernate-core:6.6.13.Final

gav://org.hibernate.orm:hibernate-core

6.6.13.Final

org.jasypt:jasypt

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.jasypt:jasypt:1.9.3

gav://org.jasypt:jasypt

1.9.3

org.jboss.logging:jboss-logging

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.jboss.logging:jboss-logging:3.6.1.Final

gav://org.jboss.logging:jboss-logging

3.6.1.Final

org.jvnet.staxex:stax-ex

BSD-3-Clause

http://opensource.org/licenses/BSD-3-Clause

maven

org.jvnet.staxex:stax-ex:2.1.0

gav://org.jvnet.staxex:stax-ex

2.1.0

org.latencyutils:LatencyUtils

CC0-1.0

http://creativecommons.org/publicdomain/zero/1.0/

maven

org.latencyutils:LatencyUtils:2.0.3

gav://org.latencyutils:LatencyUtils

2.0.3

org.mariadb.jdbc:mariadb-java-client

LGPL-2.1

http://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html

maven

org.mariadb.jdbc:mariadb-java-client:3.4.1

gav://org.mariadb.jdbc:mariadb-java-client

3.4.1

org.opensaml:opensaml-core-api

Unknown

maven

org.opensaml:opensaml-core-api:5.1.3

gav://org.opensaml:opensaml-core-api

5.1.3

org.opensaml:opensaml-core-impl

Unknown

maven

org.opensaml:opensaml-core-impl:5.1.3

gav://org.opensaml:opensaml-core-impl

5.1.3

org.opensaml:opensaml-messaging-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-messaging-api:5.1.3

gav://org.opensaml:opensaml-messaging-api

5.1.3

org.opensaml:opensaml-profile-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-profile-api:5.1.3

gav://org.opensaml:opensaml-profile-api

5.1.3

org.opensaml:opensaml-saml-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-saml-api:5.1.3

gav://org.opensaml:opensaml-saml-api

5.1.3

org.opensaml:opensaml-saml-impl

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-saml-impl:5.1.3

gav://org.opensaml:opensaml-saml-impl

5.1.3

org.opensaml:opensaml-security-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-security-api:5.1.3

gav://org.opensaml:opensaml-security-api

5.1.3

org.opensaml:opensaml-security-impl

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-security-impl:5.1.3

gav://org.opensaml:opensaml-security-impl

5.1.3

org.opensaml:opensaml-soap-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-soap-api:5.1.3

gav://org.opensaml:opensaml-soap-api

5.1.3

org.opensaml:opensaml-soap-impl

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-soap-impl:5.1.3

gav://org.opensaml:opensaml-soap-impl

5.1.3

org.opensaml:opensaml-storage-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-storage-api:5.1.3

gav://org.opensaml:opensaml-storage-api

5.1.3

org.opensaml:opensaml-xacml-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-xacml-api:4.3.0

gav://org.opensaml:opensaml-xacml-api

4.3.0

org.opensaml:opensaml-xacml-impl

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-xacml-impl:4.3.0

gav://org.opensaml:opensaml-xacml-impl

4.3.0

org.opensaml:opensaml-xacml-saml-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-xacml-saml-api:4.3.0

gav://org.opensaml:opensaml-xacml-saml-api

4.3.0

org.opensaml:opensaml-xacml-saml-impl

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-xacml-saml-impl:4.3.0

gav://org.opensaml:opensaml-xacml-saml-impl

4.3.0

org.opensaml:opensaml-xmlsec-api

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-xmlsec-api:5.1.3

gav://org.opensaml:opensaml-xmlsec-api

5.1.3

org.opensaml:opensaml-xmlsec-impl

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.opensaml:opensaml-xmlsec-impl:5.1.3

gav://org.opensaml:opensaml-xmlsec-impl

5.1.3

org.slf4j:jcl-over-slf4j

Apache-2.0,MIT

http://licenses.nuget.org/Apache-2.0,http://www.opensource.org/licenses/MIT

maven

org.slf4j:jcl-over-slf4j:2.0.17

gav://org.slf4j:jcl-over-slf4j

2.0.17

org.slf4j:jul-to-slf4j

MIT

http://www.opensource.org/licenses/MIT

maven

org.slf4j:jul-to-slf4j:2.0.17

gav://org.slf4j:jul-to-slf4j

2.0.17

org.slf4j:slf4j-api

MIT

http://www.opensource.org/licenses/MIT

maven

org.slf4j:slf4j-api:2.0.17

gav://org.slf4j:slf4j-api

2.0.17

org.springframework.boot:spring-boot

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot:3.4.5

gav://org.springframework.boot:spring-boot

3.4.5

org.springframework.boot:spring-boot-actuator

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-actuator:3.4.5

gav://org.springframework.boot:spring-boot-actuator

3.4.5

org.springframework.boot:spring-boot-actuator-autoconfigure

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-actuator-autoconfigure:3.4.5

gav://org.springframework.boot:spring-boot-actuator-autoconfigure

3.4.5

org.springframework.boot:spring-boot-autoconfigure

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-autoconfigure:3.4.5

gav://org.springframework.boot:spring-boot-autoconfigure

3.4.5

org.springframework.boot:spring-boot-starter

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-starter:3.4.5

gav://org.springframework.boot:spring-boot-starter

3.4.5

org.springframework.boot:spring-boot-starter-actuator

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-starter-actuator:3.4.5

gav://org.springframework.boot:spring-boot-starter-actuator

3.4.5

org.springframework.boot:spring-boot-starter-data-jpa

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-starter-data-jpa:3.4.5

gav://org.springframework.boot:spring-boot-starter-data-jpa

3.4.5

org.springframework.boot:spring-boot-starter-jdbc

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-starter-jdbc:3.4.5

gav://org.springframework.boot:spring-boot-starter-jdbc

3.4.5

org.springframework.boot:spring-boot-starter-json

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-starter-json:3.4.5

gav://org.springframework.boot:spring-boot-starter-json

3.4.5

org.springframework.boot:spring-boot-starter-logging

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-starter-logging:3.4.5

gav://org.springframework.boot:spring-boot-starter-logging

3.4.5

org.springframework.boot:spring-boot-starter-security

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-starter-security:3.4.5

gav://org.springframework.boot:spring-boot-starter-security

3.4.5

org.springframework.boot:spring-boot-starter-tomcat

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-starter-tomcat:3.4.5

gav://org.springframework.boot:spring-boot-starter-tomcat

3.4.5

org.springframework.boot:spring-boot-starter-web

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-starter-web:3.4.5

gav://org.springframework.boot:spring-boot-starter-web

3.4.5

org.springframework.boot:spring-boot-starter-web-services

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.boot:spring-boot-starter-web-services:3.4.5

gav://org.springframework.boot:spring-boot-starter-web-services

3.4.5

org.springframework.cloud:spring-cloud-commons

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.cloud:spring-cloud-commons:4.2.0

gav://org.springframework.cloud:spring-cloud-commons

4.2.0

org.springframework.cloud:spring-cloud-config-client

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.cloud:spring-cloud-config-client:4.2.0

gav://org.springframework.cloud:spring-cloud-config-client

4.2.0

org.springframework.cloud:spring-cloud-context

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.cloud:spring-cloud-context:4.2.0

gav://org.springframework.cloud:spring-cloud-context

4.2.0

org.springframework.cloud:spring-cloud-starter

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.cloud:spring-cloud-starter:4.2.0

gav://org.springframework.cloud:spring-cloud-starter

4.2.0

org.springframework.data:spring-data-commons

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.data:spring-data-commons:3.4.5

gav://org.springframework.data:spring-data-commons

3.4.5

org.springframework.data:spring-data-jpa

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.data:spring-data-jpa:3.4.5

gav://org.springframework.data:spring-data-jpa

3.4.5

org.springframework.security:spring-security-config

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.security:spring-security-config:6.4.5

gav://org.springframework.security:spring-security-config

6.4.5

org.springframework.security:spring-security-core

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.security:spring-security-core:6.4.5

gav://org.springframework.security:spring-security-core

6.4.5

org.springframework.security:spring-security-crypto

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.security:spring-security-crypto:6.4.5

gav://org.springframework.security:spring-security-crypto

6.4.5

org.springframework.security:spring-security-oauth2-authorization-server

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.security:spring-security-oauth2-authorization-server:1.4.3

gav://org.springframework.security:spring-security-oauth2-authorization-server

1.4.3

org.springframework.security:spring-security-oauth2-core

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.security:spring-security-oauth2-core:6.4.5

gav://org.springframework.security:spring-security-oauth2-core

6.4.5

org.springframework.security:spring-security-oauth2-jose

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.security:spring-security-oauth2-jose:6.4.5

gav://org.springframework.security:spring-security-oauth2-jose

6.4.5

org.springframework.security:spring-security-oauth2-resource-server

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.security:spring-security-oauth2-resource-server:6.4.5

gav://org.springframework.security:spring-security-oauth2-resource-server

6.4.5

org.springframework.security:spring-security-saml2-service-provider

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.security:spring-security-saml2-service-provider:6.4.4

gav://org.springframework.security:spring-security-saml2-service-provider

6.4.4

org.springframework.security:spring-security-web

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.security:spring-security-web:6.4.5

gav://org.springframework.security:spring-security-web

6.4.5

org.springframework.ws:spring-ws-core

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.ws:spring-ws-core:4.0.13

gav://org.springframework.ws:spring-ws-core

4.0.13

org.springframework.ws:spring-ws-security

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.ws:spring-ws-security:4.0.13

gav://org.springframework.ws:spring-ws-security

4.0.13

org.springframework.ws:spring-xml

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.springframework.ws:spring-xml:4.0.13

gav://org.springframework.ws:spring-xml

4.0.13

org.springframework:spring-aop

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-aop:6.2.6

gav://org.springframework:spring-aop

6.2.6

org.springframework:spring-aspects

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-aspects:6.2.6

gav://org.springframework:spring-aspects

6.2.6

org.springframework:spring-beans

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-beans:6.2.6

gav://org.springframework:spring-beans

6.2.6

org.springframework:spring-context

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-context:6.2.6

gav://org.springframework:spring-context

6.2.6

org.springframework:spring-core

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-core:6.2.6

gav://org.springframework:spring-core

6.2.6

org.springframework:spring-expression

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-expression:6.2.6

gav://org.springframework:spring-expression

6.2.6

org.springframework:spring-jcl

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-jcl:6.2.6

gav://org.springframework:spring-jcl

6.2.6

org.springframework:spring-jdbc

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-jdbc:6.2.6

gav://org.springframework:spring-jdbc

6.2.6

org.springframework:spring-orm

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-orm:6.2.6

gav://org.springframework:spring-orm

6.2.6

org.springframework:spring-oxm

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-oxm:6.2.6

gav://org.springframework:spring-oxm

6.2.6

org.springframework:spring-tx

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-tx:6.2.6

gav://org.springframework:spring-tx

6.2.6

org.springframework:spring-web

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-web:6.2.6

gav://org.springframework:spring-web

6.2.6

org.springframework:spring-webmvc

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

maven

org.springframework:spring-webmvc:6.2.6

gav://org.springframework:spring-webmvc

6.2.6

org.terracotta:offheap-store

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.terracotta:offheap-store:2.5.3

gav://org.terracotta:offheap-store

2.5.3

org.terracotta:statistics

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.terracotta:statistics:2.1.2

gav://org.terracotta:statistics

2.1.2

org.terracotta:terracotta-utilities-tools

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.terracotta:terracotta-utilities-tools:0.0.15

gav://org.terracotta:terracotta-utilities-tools

0.0.15

org.yaml:snakeyaml

Apache-2.0

http://licenses.nuget.org/Apache-2.0

maven

org.yaml:snakeyaml:2.3

gav://org.yaml:snakeyaml

2.3

sizeof-agent.jar

Unknown

generic

sizeof-agent.jar

generic://sha256:60e093acb08d3bc30235ef15941380195cbb85b1ec8b4afd672249f9c530e356/sizeof-agent.jar

trustbroker-api-1.10.0.20250707T145406Z.jar

Unknown

generic

trustbroker-api-1.10.0.20250707T145406Z.jar

generic://sha256:4663ca3599ab19632398f53d87a9604a7a31bbef834c0d2116e96fe856e76655/trustbroker-api-1.10.0.20250707T145406Z.jar

trustbroker-common-1.10.0.20250707T145406Z.jar

Apache-2.0,BSD-3-Clause

http://licenses.nuget.org/Apache-2.0,http://opensource.org/licenses/BSD-3-Clause

generic

trustbroker-common-1.10.0.20250707T145406Z.jar

generic://sha256:1ec81627c883c9b1fbd83f2b02ca5dc877edc6efa14c1ca82f3d0108ba95329a/trustbroker-common-1.10.0.20250707T145406Z.jar

trustbroker-service-1.10.0.20250707T145406Z.jar

Apache-2.0

http://licenses.nuget.org/Apache-2.0

generic

trustbroker-service-1.10.0.20250707T145406Z.jar

generic://sha256:63e256cc2012721090f96bb8fe07faa28b8ee243ad3032effda5f29acba58cfb/trustbroker-service-1.10.0.20250707T145406Z.jar

trustbroker-swiss/trustbroker-application

Unknown

docker

trustbroker-swiss/trustbroker-application:1.10.0.20250707T145406Z

docker://trustbroker-swiss/trustbroker-application

1.10.0.20250707T145406Z

trustbroker-wstrust-service-1.10.0.20250707T145406Z.jar

Unknown

generic

trustbroker-wstrust-service-1.10.0.20250707T145406Z.jar

generic://sha256:61159943d1dab61dd5ef55ef897725153a6558c22044e5acc8888644cace70ec/trustbroker-wstrust-service-1.10.0.20250707T145406Z.jar