Einrichten
TL;DR – Abhängigkeit eintragen, Credentials und Umgebung konfigurieren, SDK-Instanz erzeugen, Rolle wählen. Wählen Sie oben rechts Ihre Sprache; die Auswahl bleibt auf allen Seiten erhalten.
1. Voraussetzungen prüfen
- Java
- .NET (C#)
- JDK 21+ (LTS). Prüfen mit
java --version. - Maven 3.6+ (oder der mitgelieferte
mvnw-Wrapper).
- .NET 10 SDK oder neuer.
- Plattform: Windows, Linux und macOS werden unterstützt.
2. SDK installieren
- Java
- .NET (C#)
Das Java-SDK steht auf Maven Central zur Verfügung. Für die meisten Integrationen
genügt das Modul sdk-client — es enthält Organisation-, OnlineService-, Routing- und
Destination-Clients.
<dependency>
<groupId>dev.fitko.fitconnect</groupId>
<artifactId>sdk-client</artifactId>
<version>4.0.0-rc.1</version>
</dependency>
Wenn Sie mehrere Module nutzen (z. B. zusätzlich virus-scanner oder zbp-client), bietet
sich das BOM an, um die Versionen synchron zu halten:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>dev.fitko.fitconnect</groupId>
<artifactId>sdk-bom</artifactId>
<version>4.0.0-rc.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Anschließend können Sie die einzelnen Module ohne <version> einbinden:
<dependencies>
<dependency>
<groupId>dev.fitko.fitconnect</groupId>
<artifactId>sdk-client</artifactId>
</dependency>
<dependency>
<groupId>dev.fitko.fitconnect</groupId>
<artifactId>virus-scanner</artifactId>
</dependency>
</dependencies>
Das .NET-SDK wird als modulare NuGet-Pakete unter Fitko.FitConnect.* veröffentlicht.
Für die meisten Integrationen genügt das Paket Fitko.FitConnect.Client (es bringt
Fitko.FitConnect.Core mit):
dotnet add package Fitko.FitConnect.Client --prerelease
Für Virenprüfung von Anhängen (ClamAV / ICAP) und den ZBP-Adapter ergänzen Sie jeweils:
# Anhang-Virenprüfung (empfohlen für Produktion)
dotnet add package Fitko.FitConnect.VirusScanning --prerelease
# Zentrales Bürgerpostfach (ZBP)
dotnet add package Fitko.FitConnect.Zbp --prerelease
Voraussetzung ist .NET 10; das SDK ist auf Microsoft.Extensions.DependencyInjection und
Microsoft.Extensions.Configuration aufgebaut.
3. Credentials beschaffen
Beide SDKs nutzen das OAuth-2.0-Verfahren mit clientId und clientSecret. Diese erhalten
Sie im Self-Service-Portal der jeweiligen Umgebung:
- Onlinedienst-Client für sendende Systeme
- Verwaltungssystem-Client für empfangende Systeme
Empfangende Systeme benötigen zusätzlich:
- den privaten Entschl üsselungs-Schlüssel als JWK (eine Liste – mehrere Versionen sind für den Rollover erlaubt)
- den privaten Signatur-Schlüssel als JWK
Eine Anleitung zum Erzeugen der JWKs finden Sie auf der Seite Zertifikate.
Regel 4 des Rollenmodells: Schlüssel bestimmen, was Sie öffnen
können, nicht was Sie senden dürfen. Ein reiner Sender braucht deshalb keinen einzigen Schlüssel.
Im Java-SDK sind Schlüssel kein Teil der config.yml — Sie übergeben sie beim Erzeugen der
Rolle (Schritt 4) und können sie damit aus einem Vault oder HSM laden. Im .NET-SDK stehen sie
in der Konfiguration unter FitConnect.Client, die Sie aus einem Secret-Store befüllen.
4. SDK konfigurieren
Beide SDKs unterstützen sowohl programmatische als auch datei-basierte Konfiguration. Wählen Sie unten Ihre Sprache, um den passenden Weg zu sehen.
- Java
- .NET (C#)
Programmatisch (empfohlen für kleine Setups):
FitConnectSdk sdk = FitConnectSdk.fromConfigBuilder()
.credentials("client-id", "client-secret")
.environment(FitConnectEnvironment.TEST)
.build();
Mit YAML-Datei:
FitConnectSdk sdk = FitConnectSdk.fromConfigYaml(Path.of("config.yml"));
Beispiel-YAML:
credentials:
clientId: "your-client-id"
clientSecret: "your-client-secret"
environment: "TEST" # alternativ: STAGE, PROD
sdkSettings:
httpConfig:
timeoutConfig: { readTimeout: 30, writeTimeout: 30, connectionTimeout: 30, callTimeout: 30 }
retryConfig:
allowRetries: true
maxRetryCount: 5
initialDelayInMs: 500
retryableStatusCodes: [408, 429, 500, 502, 503, 504]
attachmentChunkingConfig:
chunkAllAttachments: false
chunkSizeInMB: 10
attachmentStoragePath: "/tmp/fit-connect-attachments"
validationConfig:
validateMetadata: true
validateData: true
validateAttachments: true
Alles, was in sdkSettings steht, können Sie statt in der Datei auch am Builder setzen — die
Schlüssel heißen wie die Builder-Methoden (Ausnahme: timeoutConfig → timeouts(…)):
FitConnectSdk sdk = FitConnectSdk.fromConfigBuilder()
.credentials(vault.clientId(), vault.clientSecret()) // z. B. aus einem Vault
.environment(FitConnectEnvironment.TEST)
.settings(SdkSettings.builder()
.httpConfig(HttpConfig.builder()
.timeouts(TimeoutConfig.builder().readTimeout(30).callTimeout(30).build())
.retryConfig(RetryConfig.builder().maxRetryCount(5).initialDelayInMs(500).build())
.build())
.attachmentChunkingConfig(AttachmentChunkingConfig.builder()
.attachmentStoragePath(Path.of("/tmp/fit-connect-attachments")).build())
.build())
.build();
Alle Optionen beider Wege nebeneinander: Referenz: Konfiguration.
Es gibt kein enableAutoReject mehr: Eine empfangene Submission wird immer mit einem
Prüfbericht zurückgegeben, den Sie explizit auswerten — siehe
Konzept: Der Prüfbericht.
Eine Credential-Paarung für Senden und Empfangen — die frühere Trennung in
senderConfig/subscriberConfig gibt es nicht mehr. Ein Client kann mit mehreren Destinations
verbunden sein; welche davon eine Codestelle als "sich selbst" verwendet, entscheiden Sie erst
beim Erzeugen von Organisation/OnlineService — nicht in der Konfiguration.
Die handelnde Destination erzeugen. sdk allein reicht für Aufrufe noch nicht — Sie brauchen
dafür eines von vier Objekten, je nachdem in welcher Rolle Sie gerade handeln. myDestinationId
ist dabei immer die UUID Ihrer eigenen Destination — jede Partei in FIT-Connect ist selbst
eine Destination, auch ein reiner Sender.
Empfangen Sie Anträge (Verwaltungssystem, Typ A/B), erzeugen Sie eine Organisation mit den
Schlüsseln zum Entschlüsseln und Signieren:
DestinationKeys keys = new DestinationKeys(decryptionJwk, signatureJwk);
Organisation organisation = sdk.organisation(myDestinationId, keys);
Senden Sie Anträge (Onlinedienst, Typ C), erzeugen Sie einen OnlineService. ReplyKeys
ordnet dabei jedem Case den Schlüssel zu, mit dem später eintreffende Antworten geöffnet werden:
ReplyKeys replyKeys = ReplyKeys.of(Map.of(caseId, replyDecryptionJwk));
OnlineService onlineService = sdk.onlineService(myDestinationId, replyKeys);
Wer nur sendet bzw. nur empfängt, kommt ganz ohne Schlüssel aus — DestinationKeys.none() bzw.
ReplyKeys.none().
Für Suche und Verwaltung — unabhängig von einer bestimmten Destination — gibt es zwei weitere Einstiegspunkte. Beide stellen ihrerseits Sub-Clients für die jeweiligen Aufgaben bereit:
Directory directory = sdk.directory(); // Routing- und Destination-Suche, unauthentifiziert
Management management = sdk.manage(); // Destinations pflegen, Anhänge verwalten
Routing routing = directory.routing();
DestinationClient destinations = management.destinations();
AttachmentManager attachments = management.attachments();
Vollständige Methodenlisten aller vier Einstiegspunkte: Spickzettel (Java).
Über .customization() können Sie eigene HTTP-Clients oder Storage-Provider einhängen
(z. B. für Datenbank-basierte Anhang-Persistenz). Siehe
sdk-client/README.md.
Das .NET-SDK ist DI-zentriert: Die Konfiguration liegt im Standard-IConfiguration-System
(Abschnitt "FitConnect"), das SDK registriert sich per AddFitConnect() und Sie arbeiten mit
einem IFitConnectClient. Eine Credential-Paarung für Senden und Empfangen — dazu die UUID
Ihres eigenen Zustellpunkts (Client.DestinationId), die das SDK beim Start nachschlägt.
Mit appsettings.json (Schlüssel und Secrets aus User Secrets oder einem Vault-Provider,
nicht aus der eingecheckten Datei):
{
"FitConnect": {
"EnvironmentTag": "TEST",
"Client": {
"ClientId": "your-client-id",
"ClientSecret": "your-client-secret",
"DestinationId": "<eigene destination-uuid>",
"DecryptionKeys": [ "{ \"kty\": \"RSA\", ... }" ],
"SignatureKey": "{ \"kty\": \"RSA\", ... }",
"VerifyDestinationOnStartup": true
},
"Http": {
"Timeouts": { "Read": 30, "Write": 30, "Connection": 10 },
"Retry": {
"AllowRetries": true,
"MaxRetryCount": 5,
"InitialDelayInMs": 500,
"RetryableStatusCodes": [ 408, 429, 500, 502, 503, 504 ]
}
},
"Attachments": { "ChunkAllAttachments": false, "ChunkSizeInMb": 10 },
"Validation": { "Metadata": true, "Data": true, "Attachments": true }
}
}
In einer ASP.NET-Core- oder Worker-Anwendung genügt eine Zeile — IConfiguration ist dort
bereits registriert:
builder.Services.AddFitConnect(); // liest Section "FitConnect"
Ohne Host (Konsolenwerkzeug, Test) bauen Sie den Container selbst:
using Fitko.FitConnect.Client.Client;
using Fitko.FitConnect.Client.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
var configuration = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false)
.AddUserSecrets<Program>()
.Build();
IFitConnectClient client = new ServiceCollection()
.AddSingleton<IConfiguration>(configuration)
.AddFitConnect()
.BuildServiceProvider()
.GetRequiredService<IFitConnectClient>();
Programmatisch, ohne Konfigurationsdatei:
services.AddFitConnect(cfg =>
{
cfg.EnvironmentTag = "TEST";
cfg.Client = new ClientConfig
{
ClientId = "client-id",
ClientSecret = "client-secret",
DestinationId = myDestinationId,
};
});
Die Rolle wählen. IFitConnectClient gibt Ihnen zwei Fassaden — mit genau den Methoden, die
die jeweilige Rolle aufrufen darf — sowie das unauthentifizierte Verzeichnis:
IOnlineServiceClient onlineService = client.AsOnlineService(); // Typ C: senden, Antworten lesen
IOrganisationClient organisation = client.AsOrganisation(); // Typ A/B: empfangen, antworten
IDirectoryService directory = client.Directory; // Zustellpunkte und Schlüssel suchen
Mit Client.VerifyDestinationOnStartup (Standard true) prüft ein IHostedService beim Start,
dass die DestinationId existiert und welchen Typ sie hat. Die falsche Fassade scheitert dann
sofort mit einer FitConnectConfigurationException („Destination '…' is a type C online service —
call AsOnlineService() instead of AsOrganisation()“) statt beim ersten Antrag. Ohne Host (bloßer
ServiceProvider) läuft die Prüfung nicht; für Offline-Szenarien setzen Sie den Wert auf false.
Anhänge werden standardmäßig unter dem System-Temp-Pfad zwischengelagert. Sie können dies
in der Konfiguration unter Attachments.BaseDirectory umstellen.
5. Umgebung auswählen
Für FIT-Connect stehen drei produktiv-relevante Umgebungen zur Verfügung:
| Umgebung | Zweck | Insecure Keys erlaubt |
|---|---|---|
| TEST | Tests, lokale Entwicklung | ✅ |
| STAGE | Referenz-, Integrations-Umgebung | ❌ |
| PROD | Produktivbetrieb | ❌ |
Eine ausführliche Beschreibung finden Sie unter Betriebs-Umgebungen.
- Java
- .NET (C#)
Die Umgebung übergeben Sie als Enum oder benutzerdefiniert:
// Vordefiniert
.environment(FitConnectEnvironment.TEST)
// Custom Environment (z. B. lokale Entwicklung gegen einen eigenen Endpoint)
FitConnectEnvironment env = FitConnectEnvironment.builder()
.name("LOCAL")
.authUrl("https://my-auth-server/token")
.routingUrl("https://my-routing-server")
.submissionApiUrl("https://my-api-host/submission-api")
.portalUrl("https://my-portal")
.destinationApiUrl("https://my-api-host/destination-api")
.allowInsecureKeys(true)
.build();
Die Umgebung wird als String-Tag konfiguriert ("TEST", "STAGE", "PROD", "LOCAL",
"CI", "CUSTOM"). Für eine eigene Umgebung setzen Sie EnvironmentTag: "CUSTOM" und
befüllen den Abschnitt CustomEnvironment (alle fünf Felder sind Pflicht):
{
"FitConnect": {
"EnvironmentTag": "CUSTOM",
"CustomEnvironment": {
"TokenUrl": "https://my-auth-server/token",
"SubmissionUrls": [ "https://my-api/submission-api" ],
"RoutingUrl": "https://my-routing-server",
"SspUrl": "https://my-portal",
"DestinationUrl": "https://my-api/destination-api"
}
}
}
6. Verbindung testen
Mit dem fertigen SDK können Sie eine erste Probe machen, indem Sie den öffentlichen
Verschlüsselungs-Schlüssel eines bekannten Zustellpunkts abrufen. Der Aufruf läuft über die
Directory-Suche und ist unauthentifiziert — er eignet sich damit unabhängig vom OAuth-Scope
Ihres Test-Clients als einfache Erreichbarkeitsprobe. Ihre Credentials selbst werden beim ersten
echten Senden oder Empfangen geprüft.
- Java
- .NET (C#)
UUID destinationId = UUID.fromString("d2d43892-9d9c-4630-980a-5af341179b14");
EncryptionKey publicKey = sdk.directory().activeEncryptionKeyOf(destinationId);
System.out.println("Verbindung OK – keyId=" + publicKey.keyId());
var destinationId = Guid.Parse("d2d43892-9d9c-4630-980a-5af341179b14");
ApiJwk publicKey = await client.Directory.GetActiveEncryptionKey(destinationId);
Console.WriteLine($"Verbindung OK – kid={publicKey.Kid}");
Wenn Sie eine Antwort erhalten, sind Sie startklar. Weiter geht's mit Antrag senden oder, falls Sie ein Verwaltungssystem entwickeln, mit Anträge abholen und prüfen.
- Java
- .NET (C#)
Vor dem ersten echten Antrag lohnt die Selbstdiagnose: Credentials, Zustellpunkt, Schlüssel und Umgebung in einem Durchlauf.
Diagnosis d = sdk.diagnose(MY_DESTINATION_ID, keys);
System.out.println(d.describe());
if (!d.healthy()) System.exit(3);
Die Startprüfung (Client.VerifyDestinationOnStartup) übernimmt diese Rolle: Existiert der
Zustellpunkt nicht oder passt der Typ nicht zur angeforderten Fassade, bricht der Host mit einer
FitConnectConfigurationException ab — ein Tippfehler in DestinationId fällt so beim Deploy auf,
nicht beim ersten Antrag.
Weiterführende Themen
- Konfiguration – alle Optionen: Timeouts, Proxy, Retries, eigene Umgebungen, Validierung
- Schlüssel und Rollover – mehrere private Entschlüsselungs-Schlüssel beim Wechsel eines Zertifikats
- Virenscanner anbinden – ClamAV / ICAP, empfohlen für Produktivumgebungen