Dieser Service ist eine Spring Boot-Anwendung, die AS4-Nachrichten aus RabbitMQ empfängt und verarbeitet, führt kryptografische Operationen wie Signieren, Verschlüsseln, Verifizieren und Entschlüsseln durch. Anschließend werden die verarbeiteten Nachrichten an die Ausgabe-Warteschlange weitergeleitet.
Zertifikate werden aus dem FSS geladen. Schlüsselbezogene Operationen werden über den FSS an das HSM delegiert.
Hardware Anforderungen
Eine Service-Instanz erfordert mindestens 1024 MB RAM.
Wir empfehlen 0,6 CPU-Kerne je Instanz.
Logs werden auf die Festplatte geschrieben, entsprechend muss genügend Speicherplatz vorhanden sein.
Abhängigkeiten
Der Service greift auf einen Message-Broker zu, um Nachrichten zu empfangen und zu versenden.
Der Service nutzt die REST API des Security Server FSS. Der FSS muss im Hintergrund auf ein HSM zugreifen können.
REST API
Die API bietet Server-Health Informationen an. Hierfür wird Actuator verwendet.
Der Port lässt sich über folgende Property konfigurieren: server.port=8080
Actuator
Dies ist der Haupt-API-Link für Actuator: http://localhost:8096/actuator/health
DockerEnvironmentDetails
Docker und seine zugehörigen Dateien sind im Modul as4-cryptography-environment von as4-microservices-bundle/docker-compose verfügbar.
AMQP Routing Konfiguration
Falls Sie das Standard Routing nutzen, muss das Routing nicht weiter konfiguriert werden. Wenn Sie Ihr Routing anpassen möchten, lesen Sie die folgende Dokumentation.
Funktionsbeschreibung der kryptografischen Vorgänge
- Folgende APIs sind verfügbar:
-
Sign/Encrypt AS4 Workflow
Queue-Name:
input: as4.encrypt.sign.default output: as4.outbound.default dlq: as4.encrypt.sign.default.dlq
-
Verify/Decrypt AS4 Workflow
Queue-Name:
input: as4.verify.decrypt.default output: as4.receipt.create.default dlq: as4.verify.decrypt.default.dlq
-
Sign AS4 Receipt Workflow
Queue-Name:
input: as4.sign.default output: as4.send.receipt.<dynamic-queue-address> - Wichtig ist, dass der Exchange, die Queues und die entsprechenden Bindings für as4.send.receipt vor dem Start der AS4 Crypto Operations erstellt werden müssen, da es sonst sein kann, dass Nachrichten verloren gehen. Eine entsprechende Dokumentation zum Anlegen der Queues ist [hier](https://b2bbp.next-level-help.org/as4_ms_rabbitmq.html) dokumentiert dlq: as4.sign.default.dlq
-
Verify AS4 Receipt Workflow
Queue-Name::
input: as4.verify.default output: as4.receipt.parse.default dlq: as4.verify.default.dlq
Sign/Encrypt AS4 Workflow
- Consumer Queue: as4.encrypt.sign
- Input consumed by Crypto-Operations
-
Request payload example:
{ "as4Id": "1000", "fromPartyId": "9907647000008", "toPartyId": "9903111000003", "tenant": "9907647000008", "partner": "9903111000003", "direction": "OUTBOUND", "sector": "ELECTRICTY", "as4Profile": "CEF", "serviceId": "http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/service", "actionId": "http://docs.oasis-open.org/ebxml-msg/as4/200902/action", "address": "b2b@b2b", "as4MessageData": "LS0tLS0tPV9QYXJ0XzFfMTgkFnRSD5JICAAANCi0tLS0tLT1fUGFydF8xXzE4OTI5ODgyOTkuMTY3NDAxNjAwNDkxNy0t" }
- Producer Queue: as4.outbound.default
- Output produced by Crypto-Operations
-
Response payload example:
{ "as4Id":"1000", "fromPartyId":"9907647000008", "toPartyId":"9903111000003", "as4MessageData":"LS0tLS0tPV9QYXJ0XzBfNjgn0NCi0tLS0tLT1fUGFydF8wXzYwNDQyMTE3OC4xNjgwMDc5OTczMzcxLS0=", "tenant":"9907647000008", "partner":"9903111000003", "sector":"ELECTRICTY", "as4Profile":"CEF", "serviceId":"http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/service","actionId":"http://docs.oasis-open.org/ebxml-msg/as4/200902/action", "signatureStatusCodes":[200], "signatureReport":{ "certificateSki":["8e98ac4ea4ad199799dfbc576754d203288663dc"], "algorithms":["http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256","http://www.w3.org/2001/10/xml-exc-c14n#","http://www.w3.org/2001/10/xml-exc-c14n#"], "verifications":null }, "cryptStatusCodes":[200], "cryptReport":{ "certificateSki":["795551e3c525d6d54abe1b46662885385e1ddcf3","c9374ce5bd73c56a92f6657dc04b3be475cdf860"], "algorithms":["http://www.w3.org/2009/xmlenc11#aes128-gcm","http://www.w3.org/2001/04/xmlenc#kw-aes128","http://www.w3.org/2009/xmlenc11#ECDH-ES","http://www.w3.org/2009/xmlenc11#ConcatKDF","http://www.w3.org/2001/04/xmlenc#sha256"], "verifications":null }, "address":"b2b@b2b", "direction":"OUTBOUND"
}
Verify/Decrypt AS4 Workflow
- Consumer Queue: as4.verify.decrypt.default
- Input consumed by Crypto-Operations
-
Request payload example:
{ "as4Id": "1000", "delivered": "2023-03-27T09:38:53.331+00:00", "deliveredReport": "delivered", "fromPartyId": "9907647000008", "toPartyId": "9903111000003", "tenant": "9903111000003", "partner": "9907647000008", "direction": "INBOUND", "sector": "ELECTRICTY", "as4Profile": "CEF", "serviceId": "http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/service", "actionId": "http://docs.oasis-open.org/ebxml-msg/as4/200902/action", "as4MessageData": "LS0tLS0tPV9QYXJ0XzBgn0NCi0tLS0tLT1fUGFydF8wXzYwNDQyMTE3OC4xNjgwMDc5OTczMzcxLS0=" }
- Producer Queue: as4.receipt.create.default
- Output produced by Crypto-Operations
-
Response payload example:
{ "as4Id":"1000", "fromPartyId":"9907647000008", "toPartyId":"9903111000003", "as4MessageData":"LS0tLS0tgn0NCi0tLS0tLT1fUGFydF8wXzYwNDQyMTE3OC4xNjgwMDc5OTczMzcxLS0=", "tenant":"9903111000003", "partner":"9907647000008", "sector":"ELECTRICTY", "as4Profile":"CEF", "serviceId":"http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/service", "actionId":"http://docs.oasis-open.org/ebxml-msg/as4/200902/action", "signatureStatusCodes":[200], "signatureReport":{ "certificateSki":["8e98ac4ea4ad199799dfbc576754d203288663dc"], "algorithms":["http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256","http://www.w3.org/2001/10/xml-exc-c14n#","http://www.w3.org/2001/10/xml-exc-c14n#"], "verifications":null }, "cryptStatusCodes":[200], "cryptReport":{ "certificateSki":["c9374ce5bd73c56a92f6657dc04b3be475cdf860"], "algorithms":["http://www.w3.org/2009/xmlenc11#aes128-gcm","http://www.w3.org/2001/04/xmlenc#kw-aes128","http://www.w3.org/2009/xmlenc11#ConcatKDF","http://www.w3.org/2001/04/xmlenc#sha256"], "verifications":null }, "delivered":"2023-03-27T09:38:53.331+00:00", "deliveredReport":"delivered", "direction":"INBOUND",60J3ZUH8NJAwOUxdrl7xA66yItOgnZHpENDqr7rl+1VDRzNPrWyLdD89/kFnRSD5JICAAA=" }
Sign AS4 Receipt Workflow
- Consumer Queue: as4.sign.default
- Input consumed by Crypto-Operations
-
Request payload example:
{ "as4Id":"12325", "businessId":"123", "delivered":"2023-03-27T09:38:53.331+00:00", "deliveredReport":"delivered", "fromPartyId":"9907647000008", "toPartyId":"9903111000003", "tenant":"9907647000008", "partner":"9903111000003", "sector":"ELECTRICTY", "as4Profile":"CEF", "serviceId":"http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/service", "actionId":"http://docs.oasis-open.org/ebxml-msg/as4/200902/action", "statusCode":"200", "as4MessageData":"LS0tLS0tPkFnRSD5JICAAANCi0tLS0tLT1fUGFydF8xXzE4OTI5ODgyOTkuMTY3NDAxNjAwNDkxNy0t" }
- Producer Exchange: as4.send.receipt
- Producer Queue: as4.send.receipt.
- Wichtig ist, dass der Exchange, die Queues und die entsprechenden Bindings für den Producer vor dem Start der AS4 Crypto Operations erstellt werden müssen, da es sonst sein kann, dass Nachrichten verloren gehen. Eine entsprechende Dokumentation zum Anlegen der Queues ist hier dokumentiert
- Output produced by Crypto-Operations
-
Response payload example:
{ "as4Id":"12325", "fromPartyId":"9907647000008", "toPartyId":"9903111000003"," as4MessageData":"LS0tLS0tPV9QWdFIPkkgIAAA0KLS0tLS0tPV9QYXJ0XzFfNDIzMDQ0ODc3LjE2ODAwODE1NDYyOTUtLQ==", "tenant":"9907647000008", "partner":"9903111000003", "sector":"ELECTRICTY", "as4Profile":"CEF","serviceId":"http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/service","actionId":"http://docs.oasis-open.org/ebxml-msg/as4/200902/action", "signatureStatusCodes":[200], "signatureReport":{ "certificateSki":["8e98ac4ea4ad199799dfbc576754d203288663dc"], "algorithms":["http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256","http://www.w3.org/2001/10/xml-exc-c14n#","http://www.w3.org/2001/10/xml-exc-c14n#"], "verifications":null }, "businessId":"123", "statusCode":"200", "delivered":"2023-03-27T09:38:53.331+00:00", "deliveredReport":"delivered" }
Verify AS4 Receipt Workflow
- Consumer Queue: as4.verify.default
- Input consumed by Crypto-Operations
-
Request payload example:
{ "as4Id": "12325", "businessId": "123", "delivered": "2023-03-27T09:38:53.331+00:00", "deliveredReport": "delivered", "fromPartyId": "9907647000008", "toPartyId": "9903111000003", "tenant": "9903111000003", "partner": "9907647000008", "sector": "ELECTRICTY", "as4Profile": "CEF", "serviceId": "http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/service", "actionId": "http://docs.oasis-open.org/ebxml-msg/as4/200902/action", "statusCode": "200", "as4MessageData": "LS0tLS0tPV9QYXJ0XzFfNDQWdFIPkkgIAAA0KLS0tLS0tPV9QYXJ0XzFfNDIzMDQ0ODc3LjE2ODAwODE1NDYyOTUtLQ==" }
- Producer Queue: as4.receipt.parse.default
- Output produced by Crypto-Operations
-
Response payload example:
{ "as4Id":"12325", "fromPartyId":"9907647000008", "toPartyId":"9903111000003", "as4MessageData":"LS0tLS0QWdFIPkkgIAAA0KLS0tLS0tPV9QYXJ0XzFfNDIzMDQ0ODc3LjE2ODAwODE1NDYyOTUtLQ==", "tenant":"9903111000003", "partner":"9907647000008", "sector":"ELECTRICTY", "as4Profile":"CEF", "serviceId":"http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/service", "actionId":"http://docs.oasis-open.org/ebxml-msg/as4/200902/action", "signatureStatusCodes":[200], "signatureReport":{ "certificateSki":["8e98ac4ea4ad199799dfbc576754d203288663dc"], "algorithms":["http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256","http://www.w3.org/2001/10/xml-exc-c14n#","http://www.w3.org/2001/10/xml-exc-c14n#"], "verifications":null }, "businessId":"123", "statusCode":"200", "delivered":"2023-03-27T09:38:53.331+00:00", "deliveredReport":"delivered" }
Multi-Tenant-Unterstützung
Die AS4 Crypto Operations wurden verbessert, um Multi-Tenant-Umgebungen zu unterstützen. Sie ermöglicht jetzt das Signieren, Überprüfen, Verschlüsseln und Entschlüsseln von AS4-Nachrichten für mehrere Mandanten.
Funktionen:
- Signieren: Der Dienst kann eine AS4-Nachricht für einen bestimmten Mandanten mit seinem zugehörigen Signatur-Zertifikat signieren.
- Überprüfung: Der Dienst kann eine AS4-Nachrichtensignatur für jeden Mandanten mit einem gemeinsamen Überprüfungszertifikat überprüfen.
- Verschlüsselung: Der Dienst kann eine AS4-Nachricht für einen bestimmten Mandanten mit einem gemeinsamen Verschlüsselungszertifikat verschlüsseln.
- Entschlüsselung: Der Dienst kann eine AS4-Nachricht für einen bestimmten Mandanten mit seinem zugehörigen Entschlüsselungszertifikat entschlüsseln.
Der Kunde kann die Multi-Tenant-Konfiguration wie folgt (in einer YML-Datei) durchführen:
-
Beispiel:
fssTenantClients: - client: client1 tenants: - 9900000000011 - 9900000000012 - client: client2 tenants: - 9900000000021 fssSharedClient: shared-client
Die Konfiguration der einzelnen Tenant-Clients ist optional! Falls eine manuelle Konfiguration nicht gewünscht ist, müssen die verschiedenen fssTenantClients nicht konfiguriert werden.Es wird dann davon ausgegangen, dass der FSS-Client der Tenant-ILN entspricht. Wenn der fssSharedClient nicht konfiguriert ist, werden die Zertifikate ebenfalls von den jeweiligen Tenant-ILN´s geladen. Die Konfiguration kann wie folgt (in einer YML-Datei) durchgeführt werden:
-
Beispiel:
fssSharedClient: shared-client
Für die Multi-Mandantenfähigkeit ist es notwendig, für den sign-and-encrypt Producer des Outbound Workflows und den sign-Producer des Inbound Workflows die Nachrichten anhand der Mandanten zu routen. Dafür muss jeweils der Headername auf tenant gesetzt werden. Für die Headervalues ist eine Liste aller Mandanten anzugeben.
Somit kann für den Outbound Workflow die Nachricht anhand des Mandanten an den richtigen AS4 Outbound Sender geroutet werden. Für den Inbound Workflow wird das erstellte Receipt anhand des Mandanten an die richtigen AS4 Inbound Endpoints geroutet.
Dies kann wie im folgenden Beispiel erfolgen. .
-
Beispiel:
sign.and.encrypt.as4.message.producer.headerName=tenant sign.and.encrypt.as4.message.producer.headerValues=9903111000003,9900794000004 sign.as4.message.producer.headerName=tenant sign.as4.message.producer.headerValues=9903111000003,9900794000004
Anhang: Gesamtkonfiguration
Im Standard verteilt sich die Konfiguration auf zwei Konfigurationsdateien application.properties
sowie application.yml
.
Folgende Konfiguration reicht in einem Standard-System aus:
application.properties
:
fss.server.api.url=http://fss:2222/fss/api/v1
## Page size for fss requests
fss.page.size.value=100
#==== RabbitMQ
spring.rabbitmq.host=rabbitmq3
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=${RABBITMQ_PASSWORD}
application.yml
:
client-tenant:
fssSharedClient: shared-client
Allgemeine Hinweise zur Konfiguration finden Sie hier.
View Me Edit Me