<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Tutorial :: Tag</title>
    <link>/tags/tutorial.html</link>
    <description></description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="/tags/tutorial/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>4.1 Testbed Specifications</title>
      <link>/04-deploy-guide/01-tech-specs.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/04-deploy-guide/01-tech-specs.html</guid>
      <description>Hardware Specifications The testbed is available in three configurations to accommodate different workload requirements:&#xA;Specification Small Testbed Medium Testbed Large Testbed OS RHEL9 RHEL9 RHEL9 CPU 2 cores / 4 threads 4 cores / 8 threads 8 cores / 16 threads Memory 16 GiB 32 GiB 128 GiB Storage* 64 GiB 64 GiB 64 GiB AWS Instance Type m7i.xlarge m7i.2xlarge r7i.4xlarge Cost (USD) $0.31/h ($7.44/day) $0.62/h ($14.88/day) $1.44/h ($34.56/day) *Storage capacity is configurable based on user requirements</description>
    </item>
    <item>
      <title>4.2 Testbed Bootstrap Procedure</title>
      <link>/04-deploy-guide/02-bootstrap.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/04-deploy-guide/02-bootstrap.html</guid>
      <description>During testbed provisioning, an automated bootstrap script executes a series of commands to configure the dataspace environment. This page documents the bootstrap procedure for replication on alternative platforms or for understanding the deployment configuration.&#xA;The bootstrap script is organised into the following sections:&#xA;Environment Variable Configuration - Define variables used throughout the bootstrap process: IDS_TESTBED_REPO=&#34;$1&#34; USER_HOME=&#34;/home/ec2-user&#34; MIMEAPPS_LIST=&#34;$USER_HOME/.config/mimeapps.list&#34; TESTBED_DIR=&#34;$USER_HOME/IDS-testbed&#34; NODE_VERSION=22 Repository Cloning - Clone the specified dataspace repository to the target directory: git clone &#34;$IDS_TESTBED_REPO&#34; &#34;$TESTBED_DIR&#34; Node.js Environment Setup - Install Node Version Manager (NVM), Node.js, and NPM along with dependencies required for Postman script development and testing: # Install Node Version Manager curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash \. &#34;$HOME/.nvm/nvm.sh&#34; # Install Node.js Version 22 nvm install $NODE_VERSION # Install newman and newman-reporter-html for executing Postman collections npm install -g newman newman-reporter-html # Add Node.js and package binaries to user PATH [ -n &#34;$(which npm)&#34; ] &amp;&amp; echo &#34;export PATH=\&#34;\$PATH:$(dirname &#34;$(which npm)&#34;)\&#34;&#34; &gt;&gt; /home/ec2-user/.bashrc Default Browser Configuration - Set Chromium as the default browser to ensure seamless code-server integration with DCV and facilitate Postman account creation: cat &gt; &#34;$MIMEAPPS_LIST&#34; &lt;&lt; EOL [Default Applications] text/html=chromium_chromium.desktop x-scheme-handler/http=chromium_chromium.desktop x-scheme-handler/https=chromium_chromium.desktop x-scheme-handler/about=chromium_chromium.desktop x-scheme-handler/unknown=chromium_chromium.desktop application/xhtml+xml=chromium_chromium.desktop EOL GNOME Welcome Screen Suppression - Disable the default RHEL welcome dialogs that appear on first login via DCV: touch $USER_HOME/.config/gnome-welcome-tour-done touch $USER_HOME/.config/gnome-initial-setup-done sudo dnf remove -y gnome-initial-setup gnome-tour Permission Correction - Set appropriate ownership and permissions to prevent access errors when using dataspace components: sudo chown -R ec2-user:ec2-user $TESTBED_DIR $USER_HOME/.cache/ $USER_HOME/.config/</description>
    </item>
    <item>
      <title>4.3 SSL Certificate Generation</title>
      <link>/04-deploy-guide/03-generate-cert.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/04-deploy-guide/03-generate-cert.html</guid>
      <description>Key Generation Shell Script The Dataspace Testbed uses a shell script on the VM to generate new certificates. The script is shown below:&#xA;Click here to expand script #!/bin/bash # Regenerate certificates and configure truststores for IDS Reference Testbed set -e # Exit on any error # Usage function usage() { echo &#34;Usage: $0 [mode]&#34; echo &#34;Modes:&#34; echo &#34; full - Execute complete script (default)&#34; echo &#34; daps - CA, subCA and DAPS certificates only&#34; echo &#34; broker - Broker certificates and keystore only&#34; echo &#34; combined - DAPS + Broker (daps + broker)&#34; echo &#34; connector - Add new connector (requires connector name as second parameter, optional IP address as third parameter)&#34; echo &#34;&#34; echo &#34;Examples:&#34; echo &#34; $0 full&#34; echo &#34; $0 daps&#34; echo &#34; $0 broker&#34; echo &#34; $0 combined&#34; echo &#34; $0 connector connectorC&#34; echo &#34; $0 connector connectorC 192.168.1.100&#34; exit 1 } # Configuration ROOT_DIR=/home/ec2-user/IDS-testbed SSL_DIR=data-cfssl SERVER_ADDR=127.0.0.1 MODE=${1:-full} # Validate mode case &#34;$MODE&#34; in full|daps|broker|combined|connector) ;; *) echo &#34;ERROR: Invalid mode &#39;$MODE&#39;&#34; usage ;; esac # For connector mode, validate connector name and optional IP if [ &#34;$MODE&#34; = &#34;connector&#34; ]; then if [ -z &#34;$2&#34; ]; then echo &#34;ERROR: Connector name required for connector mode&#34; usage fi CONNECTOR_NAME=$2 CONNECTOR_IP=$3 # Optional IP address fi echo &#34;Starting certificate regeneration process in &#39;$MODE&#39; mode...&#34; # Function: Setup PKI (always needed) setup_pki() { echo &#34;Setting up PKI infrastructure...&#34; cd $ROOT_DIR/CertificateAuthority [ -d &#34;$SSL_DIR&#34; ] &amp;&amp; rm -rf &#34;$SSL_DIR&#34; sh setup_PKI.sh $SSL_DIR if [ ! -d &#34;$SSL_DIR/certs&#34; ]; then echo &#34;ERROR: Certificate generation failed - certs directory not found&#34; exit 1 fi } # Function: Process CA and subCA certificates process_ca_certificates() { echo &#34;Processing CA and subCA certificates...&#34; cd $ROOT_DIR/CertificateAuthority/$SSL_DIR/ca openssl pkcs12 -export -out ca.p12 -in ca.pem -inkey ca-key.pem -passout pass:password openssl pkcs12 -in ca.p12 -clcerts -nokeys -out ca.crt -passin pass:password openssl pkcs12 -in ca.p12 -out ca.cert -nokeys -nodes -passin pass:password cp ca-key.pem ca.key cd $ROOT_DIR/CertificateAuthority/$SSL_DIR/subca openssl pkcs12 -export -out subca.p12 -in subca.pem -inkey subca-key.pem -passout pass:password openssl pkcs12 -in subca.p12 -clcerts -nokeys -out subca.crt -passin pass:password openssl pkcs12 -in subca.p12 -out subca.cert -nokeys -nodes -passin pass:password cp subca-key.pem subca.key } # Function: Process DAPS certificates process_daps_certificates() { echo &#34;Processing DAPS certificates...&#34; cd $ROOT_DIR/CertificateAuthority/$SSL_DIR/certs # DAPS certificates openssl pkcs12 -export -out daps.p12 -in daps.pem -inkey daps-key.pem -passout pass:password openssl pkcs12 -in daps.p12 -clcerts -nokeys -out daps.crt -passin pass:password openssl pkcs12 -in daps.p12 -out daps.cert -nokeys -nodes -passin pass:password cp daps-key.pem daps.key # Copy DAPS certificates cp daps.cert $ROOT_DIR/DAPS/keys/TLS/daps.cert cp daps.key $ROOT_DIR/DAPS/keys/TLS/daps.key cp daps.key $ROOT_DIR/DAPS/keys/omejdn/omejdn.key } # Function: Process broker certificates process_broker_certificates() { echo &#34;Processing broker certificates...&#34; cd $ROOT_DIR/CertificateAuthority/$SSL_DIR/certs # Broker certificates openssl pkcs12 -export -out broker.p12 -in broker.pem -inkey broker-key.pem -passout pass:password openssl pkcs12 -in broker.p12 -clcerts -nokeys -out broker.crt -passin pass:password openssl pkcs12 -in broker.p12 -out broker.cert -nokeys -nodes -passin pass:password cp broker-key.pem broker.key # Create broker keystore rm -f $ROOT_DIR/MetadataBroker/isstbroker-keystore.jks keytool -importkeystore -srckeystore broker.p12 -srcstoretype PKCS12 -srcstorepass password -destkeystore $ROOT_DIR/MetadataBroker/isstbroker-keystore.jks -deststoretype JKS -deststorepass password -noprompt # Copy broker certificates cp broker.cert $ROOT_DIR/DAPS/keys/broker.cert cp broker.key $ROOT_DIR/MetadataBroker/server.key cp broker.crt $ROOT_DIR/MetadataBroker/server.crt } # Function: Process connector certificates (for full mode) process_connector_certificates() { echo &#34;Processing connector certificates...&#34; cd $ROOT_DIR/CertificateAuthority/$SSL_DIR/certs # ConnectorA certificates openssl pkcs12 -export -out connectorA.p12 -in connectorA.pem -inkey connectorA-key.pem -passout pass:password openssl pkcs12 -in connectorA.p12 -clcerts -nokeys -out connectorA.crt -passin pass:password openssl pkcs12 -in connectorA.p12 -out connectorA.cert -nokeys -nodes -passin pass:password cp connectorA-key.pem connectorA.key # ConnectorB certificates openssl pkcs12 -export -out connectorB.p12 -in connectorB.pem -inkey connectorB-key.pem -passout pass:password openssl pkcs12 -in connectorB.p12 -clcerts -nokeys -out connectorB.crt -passin pass:password openssl pkcs12 -in connectorB.p12 -out connectorB.cert -nokeys -nodes -passin pass:password cp connectorB-key.pem connectorB.key # Copy connector certificates cp connectorA.cert $ROOT_DIR/DAPS/keys/connectorA.cert cp connectorB.cert $ROOT_DIR/DAPS/keys/connectorB.cert cp connectorA.p12 $ROOT_DIR/DataspaceConnectorA/conf/connectorA.p12 cp connectorB.p12 $ROOT_DIR/DataspaceConnectorB/conf/connectorB.p12 } # Function: Create truststores create_truststores() { echo &#34;Creating truststores...&#34; rm -f $ROOT_DIR/DataspaceConnectorA/conf/truststore.p12 rm -f $ROOT_DIR/DataspaceConnectorB/conf/truststore.p12 keytool -import -alias testbedca -file $ROOT_DIR/CertificateAuthority/$SSL_DIR/ca/ca.crt -storetype PKCS12 -keystore $ROOT_DIR/DataspaceConnectorA/conf/truststore.p12 -storepass password -noprompt keytool -import -alias testbedsubca -file $ROOT_DIR/CertificateAuthority/$SSL_DIR/subca/subca.crt -storetype PKCS12 -keystore $ROOT_DIR/DataspaceConnectorA/conf/truststore.p12 -storepass password -noprompt keytool -import -alias testbedca -file $ROOT_DIR/CertificateAuthority/$SSL_DIR/ca/ca.crt -storetype PKCS12 -keystore $ROOT_DIR/DataspaceConnectorB/conf/truststore.p12 -storepass password -noprompt keytool -import -alias testbedsubca -file $ROOT_DIR/CertificateAuthority/$SSL_DIR/subca/subca.crt -storetype PKCS12 -keystore $ROOT_DIR/DataspaceConnectorB/conf/truststore.p12 -storepass password -noprompt } # Function: Register with DAPS register_daps() { cd $ROOT_DIR/DAPS case &#34;$MODE&#34; in full) rm -f keys/clients/*.cert echo &#34;---&#34; &gt; config/clients.yml sh ./register_connector.sh broker sh ./register_connector.sh connectorA sh ./register_connector.sh connectorB ;; daps) rm -f keys/clients/*.cert echo &#34;---&#34; &gt; config/clients.yml # DAPS only - no registration needed ;; broker) sh ./register_connector.sh broker ;; combined) sh ./register_connector.sh broker ;; connector) sh ./register_connector.sh &#34;$CONNECTOR_NAME&#34; ;; esac } # Function: Add new connector (from add-connector.sh logic) add_connector() { echo &#34;Adding new connector: $CONNECTOR_NAME&#34; # Check if configuration file exists, create if not if [ ! -f &#34;$ROOT_DIR/CertificateAuthority/pkiInput/${CONNECTOR_NAME}.json&#34; ]; then echo &#34;Creating configuration file for $CONNECTOR_NAME&#34; cat &gt; &#34;$ROOT_DIR/CertificateAuthority/pkiInput/${CONNECTOR_NAME}.json&#34; &lt;&lt;EOF { &#34;CN&#34;: &#34;Connector ${CONNECTOR_NAME^^}&#34;, &#34;key&#34;: { &#34;algo&#34;: &#34;rsa&#34;, &#34;size&#34;: 2048 }, &#34;names&#34;: [ { &#34;C&#34;: &#34;DE&#34;, &#34;L&#34;: &#34;Dortmund&#34;, &#34;O&#34;: &#34;IDSA&#34;, &#34;OU&#34;: &#34;IDS Reference Testbed&#34; } ], &#34;hosts&#34;: [ &#34;localhost&#34;, &#34;${CONNECTOR_NAME,,}&#34;, &#34;127.0.0.1&#34;$([ -n &#34;$CONNECTOR_IP&#34; ] &amp;&amp; echo &#34;,&#34;) $([ -n &#34;$CONNECTOR_IP&#34; ] &amp;&amp; echo &#34;\&#34;$CONNECTOR_IP\&#34;&#34;) ] } EOF else echo &#34;Configuration file already exists for $CONNECTOR_NAME, skipping creation&#34; fi # Generate certificate for new connector cd &#34;$ROOT_DIR/CertificateAuthority/$SSL_DIR/certs&#34; cfssl genkey &#34;$ROOT_DIR/CertificateAuthority/pkiInput/${CONNECTOR_NAME}.json&#34; | cfssljson -bare &#34;$CONNECTOR_NAME&#34; cfssl sign -ca &#34;$ROOT_DIR/CertificateAuthority/$SSL_DIR/subca/subca.pem&#34; \ -ca-key &#34;$ROOT_DIR/CertificateAuthority/$SSL_DIR/subca/subca-key.pem&#34; \ -db-config &#34;$ROOT_DIR/CertificateAuthority/$SSL_DIR/ocsp/sqlite_db_components.json&#34; \ --config &#34;$ROOT_DIR/CertificateAuthority/pkiInput/ca-config.json&#34; \ -profile &#34;component&#34; &#34;${CONNECTOR_NAME}.csr&#34; | cfssljson -bare &#34;$CONNECTOR_NAME&#34; # Convert to required formats openssl pkcs12 -export -out &#34;${CONNECTOR_NAME}.p12&#34; -in &#34;${CONNECTOR_NAME}.pem&#34; -inkey &#34;${CONNECTOR_NAME}-key.pem&#34; -passout pass:password openssl pkcs12 -in &#34;${CONNECTOR_NAME}.p12&#34; -clcerts -nokeys -out &#34;${CONNECTOR_NAME}.crt&#34; -passin pass:password openssl pkcs12 -in &#34;${CONNECTOR_NAME}.p12&#34; -out &#34;${CONNECTOR_NAME}.cert&#34; -nokeys -nodes -passin pass:password cp &#34;${CONNECTOR_NAME}-key.pem&#34; &#34;${CONNECTOR_NAME}.key&#34; # Create dedicated certificate directory CERT_DIR=&#34;$ROOT_DIR/Certificates-${CONNECTOR_NAME}&#34; mkdir -p &#34;$CERT_DIR&#34; cp &#34;${CONNECTOR_NAME}.p12&#34; &#34;$CERT_DIR/connector.p12&#34; cp &#34;${CONNECTOR_NAME}.cert&#34; &#34;$CERT_DIR/connector.cert&#34; cp &#34;${CONNECTOR_NAME}.crt&#34; &#34;$CERT_DIR/connector.crt&#34; cp &#34;${CONNECTOR_NAME}.key&#34; &#34;$CERT_DIR/connector.key&#34; cp &#34;${CONNECTOR_NAME}.pem&#34; &#34;$CERT_DIR/connector.pem&#34; # Create truststore in certificate directory keytool -import -alias testbedca -file &#34;$ROOT_DIR/CertificateAuthority/$SSL_DIR/ca/ca.crt&#34; -storetype PKCS12 -keystore &#34;$CERT_DIR/truststore.p12&#34; -storepass password -noprompt keytool -import -alias testbedsubca -file &#34;$ROOT_DIR/CertificateAuthority/$SSL_DIR/subca/subca.crt&#34; -storetype PKCS12 -keystore &#34;$CERT_DIR/truststore.p12&#34; -storepass password -noprompt chmod 666 &#34;$CERT_DIR/connector.p12&#34; chmod 666 &#34;$CERT_DIR/connector.cert&#34; chmod 666 &#34;$CERT_DIR/connector.crt&#34; chmod 666 &#34;$CERT_DIR/connector.key&#34; chmod 666 &#34;$CERT_DIR/connector.pem&#34; chmod 666 &#34;$CERT_DIR/truststore.p12&#34; # Copy certificate to DAPS for registration cp &#34;${CONNECTOR_NAME}.cert&#34; &#34;$ROOT_DIR/DAPS/keys/${CONNECTOR_NAME}.cert&#34; echo &#34;Connector $CONNECTOR_NAME added successfully!&#34; echo &#34;Certificate directory created: $CERT_DIR&#34; } # Function: Verify certificates verify_certificates() { echo &#34;Verifying certificate generation...&#34; case &#34;$MODE&#34; in full) for cert in broker connectorA connectorB; do if [ ! -f &#34;$ROOT_DIR/DAPS/keys/${cert}.cert&#34; ]; then echo &#34;ERROR: Missing certificate: $ROOT_DIR/DAPS/keys/${cert}.cert&#34; exit 1 fi done if [ ! -f &#34;$ROOT_DIR/MetadataBroker/isstbroker-keystore.jks&#34; ]; then echo &#34;ERROR: Missing broker keystore&#34; exit 1 fi ;; daps) if [ ! -f &#34;$ROOT_DIR/DAPS/keys/TLS/daps.cert&#34; ]; then echo &#34;ERROR: Missing DAPS certificate&#34; exit 1 fi ;; broker) if [ ! -f &#34;$ROOT_DIR/DAPS/keys/broker.cert&#34; ]; then echo &#34;ERROR: Missing broker certificate&#34; exit 1 fi if [ ! -f &#34;$ROOT_DIR/MetadataBroker/isstbroker-keystore.jks&#34; ]; then echo &#34;ERROR: Missing broker keystore&#34; exit 1 fi ;; combined) if [ ! -f &#34;$ROOT_DIR/DAPS/keys/TLS/daps.cert&#34; ] || [ ! -f &#34;$ROOT_DIR/DAPS/keys/broker.cert&#34; ]; then echo &#34;ERROR: Missing DAPS or broker certificates&#34; exit 1 fi ;; connector) if [ ! -f &#34;$ROOT_DIR/DAPS/keys/${CONNECTOR_NAME}.cert&#34; ]; then echo &#34;ERROR: Missing connector certificate: $CONNECTOR_NAME&#34; exit 1 fi ;; esac } # Main execution logic case &#34;$MODE&#34; in full) setup_pki process_ca_certificates process_daps_certificates process_broker_certificates process_connector_certificates create_truststores register_daps verify_certificates echo &#34;Full certificate regeneration completed successfully!&#34; ;; daps) setup_pki process_ca_certificates process_daps_certificates verify_certificates echo &#34;DAPS certificate generation completed successfully!&#34; ;; broker) setup_pki process_ca_certificates process_broker_certificates register_daps verify_certificates echo &#34;Broker certificate generation completed successfully!&#34; ;; combined) setup_pki process_ca_certificates process_daps_certificates process_broker_certificates register_daps verify_certificates echo &#34;Combined DAPS+Broker certificate generation completed successfully!&#34; ;; connector) # For connector mode, we need existing PKI if [ ! -d &#34;$ROOT_DIR/CertificateAuthority/$SSL_DIR&#34; ]; then echo &#34;ERROR: PKI not found. Run with &#39;daps&#39; or &#39;full&#39; mode first.&#34; exit 1 fi add_connector register_daps verify_certificates echo &#34;Connector $CONNECTOR_NAME added successfully!&#34; ;; esac echo &#34;Operation completed. You can restart containers with: sudo docker compose down &amp;&amp; sudo docker compose up -d&#34; This script can be called manually or from the dashboard through a handler Python script system service.</description>
    </item>
    <item>
      <title>4.4 Port Assignment</title>
      <link>/04-deploy-guide/04-reserved-ports.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/04-deploy-guide/04-reserved-ports.html</guid>
      <description>Exposed Ports The following ports must be accessible from external networks for testbed functionality:&#xA;Port Application 22 (TCP) SSH Connection 443 (TCP) Dataspace DAPS UI and proxies 8443 (TCP) DCV Connection Via TCP (slower) 8443 (UDP) DCV Connection Via UDP (faster) Internal Ports The following ports are used locally within the testbed environment:&#xA;Port Application 443 Dataspace DAPS UI and proxies 444 Dataspace Broker 8000 Code-Server 8080 Dataspace Connector A 8081 Dataspace Connector B Routes Proxied by Port 443 Port 443 serves as the primary HTTPS entry point, with the following routes proxied to internal services:</description>
    </item>
  </channel>
</rss>