GithubHelp home page GithubHelp logo

gematik / ref-epa-vauchannel Goto Github PK

View Code? Open in Web Editor NEW
5.0 15.0 3.0 2.04 MB

Possible solution for communication of an ePA-Client and a VAU utilizing the vau-channel-protocol according to gemSpec_Krypt

License: Other

Java 100.00%
epa reference-implementation

ref-epa-vauchannel's Introduction

Basismodul VAU-Kanal, Version 1.3.10

Überblick

Das vorliegende Modul zeigt exemplarisch, wie das im Spezifikationsdokument [gemSpec_Krypt] normativ festgelegte Kommunikationsprotokoll zwischen VAU und ePA-Clients implementiert werden kann.

Spezifikationsbasis ist "Release 4.0.2".

Aufbau des Moduls

Die Implementierung erfolgt in Java (Version 11). Buildsystem ist Apache Maven (Version 3.6.1).

  • vauchannel ist das maven reactor module, das die einzelnen Teilmodule in einem Build baut.
  • vauchannel-contract-2-java legt das Format der ausgetauschten JSON-Nachrichten per JSON Schema (draft-04) und damit unabhängig von der Implementierungssprache fest. Aus den Schemas werden Java Klassen generiert.
  • vauchannel-protocol implementiert das Protokoll mit der Verarbeitung der Nachrichten in der Javaklasse VAUProtocol.java. Die Definition des Kommunikationsprotokoll zwischen VAU und ePA-Clients aus [gemSpec_Krypt] Kapitel 6 werden in VAUProtocol.java detailliert kommentiert auf die Java-Implementierung gemappt. Abgedeckt sind
    • der Handshake,
    • der verschlüsselte Nutzdatentransport,
    • das Fehlerhandling. Alle benötigten kryptografischen Funktionen werden über ein Interface VAUProtocolCrypto angesprochen. Die konkrete Implementierung des Interfaces ist damit unabhängig von der Protokollimplementierung. Sessioninformationen werden in der VAUProtocolSession abgelegt.
  • vauchannel-cxf zeigt die Einbettung in die WebService-Bibliothek Apache CXF (XML/SOAP für die fachlichen Services und JSON/REST für das VAUProtokoll). Der VAU-Kanal startet und endet in dieser Einbettung in CXF-spezifischen Interceptoren. Die konkrete Implementierung des VAUProtokolls mit Kryptofunktionen und Ablage der Sessioninformationen wird als "dependency injected".
  • vauchannel-server zeigt exemplarisch die Umsetzung der serverseitigen Endpunkte für Handshake und fachlichen Service (hier ein sayHello-Service) als Spring-Boot-Anwendung. Nicht thematisiert:
    • Das Ansprechen von Handshake-Service und OpenContext-Service unter einem Interface, das beispielsweise durch Trennung der Anfragen über den HTTP-Header Content-Type in einem vorgelagerten Gateway erfolgen kann.
    • Die Verwaltung mehrerer VAUProtocolSession.
  • vauchannel-client implementiert einen Spring-Boot-Client, der gegen einen laufenden vauchannel-server Integrationstests ausführt.

Bauen

Das Modul vauchannel wird samt seinen Untermodulen wie folgt gebaut:

mvn clean install

Das Ergebnis des Builds sollte etwa so aussehen:

[INFO] ------------------------------------------------------------
[INFO] Reactor Summary for vauchannel 1.3.10:
[INFO]
[INFO] vauchannel ............................. SUCCESS [  0.256 s]
[INFO] vauchannel-contract-2-java ............. SUCCESS [  2.333 s]
[INFO] vauchannel-protocol .................... SUCCESS [  6.351 s]
[INFO] vauchannel-cxf ......................... SUCCESS [  0.686 s]
[INFO] vauchannel-server ...................... SUCCESS [  7.882 s]
[INFO] vauchannel-client ...................... SUCCESS [  1.019 s]
[INFO] ------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------

Starten

Den Server starten

cd vauchannel-server/target
java -jar vauchannel-server-1.3.10.jar

und vom Client aus Integrationstests ausführen

cd vauchannel-client
mvn verify -Ptest

Release-Notes

V1.3.10, 2021.12.21

Interne Anpassungen für die Veröffentlichung über Maven Central.

V1.3.9, 2021.12.20

Upgrade von log4j

V1.3.8, 2021.03.15

Interne Anpassungen für die Veröffentlichung über Maven Central.

V1.3.7, 2021.03.12

Die Generierung der OCSPResponse wurde gemäß Anforderung GS-A_4693-01 [gemSpec_PKI] um die OCSP-Extension "certHash" erweitert.
Außerdem wird nun in der OCSP-Response gemäß RFC6960 folgendes sichergestellt:

  • Das Feld CertID wird mit den Informationen des CA-Zertifikates befüllt
  • Die ResponderID wird basierend auf dem Key des OCSP-Signers berechnet
  • Das öffentliche Zertifikat des OCSP-Signers wird in der Response mitgeliefert

V1.3.6, 2020.10.28

  • Die Unterstützung der Deserialisierung des "Time"-Felds in VAUServerError-Nachrichten gemäß der Kodierung nach ISO-8601 (Anforderung "A_16851 - VAU-Protokoll: VAUServerError-Nachrichten") wurde optimiert.

V1.3.5, 2020.08.06

  • Fehlermeldungen, die vom Kontextmanager zurückgegeben werden, werden nicht als VAUServerError transportiert.
  • Eine leere OCSPResponse wird in der Nachricht VAUClientSigFin gemäß A_17070-01 als leere Zeichenkette übertragen.
  • Bei der AES-Verschlüsselung im VAU-Kanal muss gemäß A_16945-01 (Client) und A_16952-01 (Server) der Initialisierungsvektor den Nachrichtenzähler enthalten. Dieser wurde bisher nicht in den Initialisierungsvektor übernommen, was durch die Änderung korrigiert wird. Da der Wert jeweils nicht von der Gegenseite geprüft wird, hat die Korrektur keinen Einfluß auf die Interoperabilität.

V1.3.4, 2020.07.27

Bei der Prüfung der Clientidentität an Hand der Nachricht VAUClientSigFinMessage wurden die Hash-Werte zu VAUClientHelloData und VAUServerHelloData aus der Nachricht VAUClientSigFinMessage verwendet. Das wurde korrigiert: Bei der Prüfung werden jetzt die vom Server verifizierten Hashes verwendet.

V1.3.3, 2020.05.07

Das Encoding aus dem HTTP-ContentType-Header wird im CXF-AESInterceptor nun korrekt durch den verschlüsselten Kanal geleitet. Dadurch wird der HTTP-Content-Type für Typ (2) Nachrichten spezifikationskonform gemäß "A_16884 - VAU-Protokoll: Nachrichtentypen und HTTP-Content-Type".

V1.3.2, 2020.03.26

Die mit V1.3.1 eingeführte Hülle um die ECDSA-Signatur wurde wieder herausgenommen. Der Stand diesbezüglich entspricht jetzt wieder dem von V1.3.0. Hintergrund: Aus Gründen der Kompatibilität zwischen verschiedenen VAU-Protokollversionen sollen Parameter, welche die ECDSA/RSA-Signatur charakterisieren, zukünftig mit der Signatur übertragen werden. Anstatt aber auf ASN.1-Ebene diese Parameter zu platzieren ist angedacht, in einer zukünftigen Spezifikationsversion die Parameter auf JSON-Ebene zu transportieren.

V1.3.1, 2020.03.19

  • Neu: Serverzertifikat wird gegen TSL sowie per OCSP geprüft.
  • Fehlerbehebung: Die Einbettung der ECDSA-Signaturen wird in Aktor korrigiert und an die Spezifikation angepasst. Zur Anforderung [A_16901-0] ist erläutert „Die ECDSA-Signatur MUSS nach [TR-03111#5.2.2. X9.62 Format] (inkl. OID "ecdsa-with-Sha256") kodiert sein.“ Die Sequenz mit den zwei „Integer“ (r und s aus der ECDSA-Signatur) ist umhüllt von einer Sequence und am Anfang ist die OID „ecdsaWithSHA256“ aufgeführt. Diese Hülle hatte bisher bei allen VAU-Kanal ECDSA-Signaturen im Aktor gefehlt. Wie die Hülle aussieht erläutert das Beispiel in gemSpec_Krypt#5.2 nach „Und am Ende des Zertifikats befindet sich die ECDSA-Signatur“:
535  10:   SEQUENCE {
537   8:     OBJECT IDENTIFIER ecdsaWithSHA256 (1 2 840 10045 4 3 2)
       :     }
547  73:   BIT STRING, encapsulates {
550  70:     SEQUENCE {
552  33:       INTEGER
       :         00 A5 0E AA 18 74 F1 F7 B2 2C 77 38 28 58 7F 7F
       :         5B 7D B2 B7 8A E4 B9 D5 22 B3 4C 71 19 9E 3C 60
       :         E5
587  33:       INTEGER
       :         00 93 43 8A 6E A2 5E 58 60 80 19 62 4E F8 99 F8
       :         9D DC 90 4E BC C0 55 FD 78 0F 57 65 A9 4B FF 7D
       :         CA
       :       }
       :     }
       :   }
```</del>

### V1.3.0, 2020.03.11
* **Neu:** Anpassung auf Spezifikationsstand zum Online-Produktivbetrieb, Release 3.1.3.

### V1.2.0, 2019.12.18
* **Optimierung:** Vollständiger HTTP-Body der entschlüsselten Nachricht wird geloggt.
* **Optimierung:** Bessere Unterstützung für die Umsetzung der Anforderungen 
"A_14545 - Komponente ePA-Dokumentenverwaltung - Operationen des Dokumentenmanagements nur über sicheren Kanal nutzbar"
und
"A_18714 - Komponente ePA-Dokumentenverwaltung - Verhalten des Kontextmanagements bei ungeöffnetem Verarbeitungskontext"
* **Optimierung:** Unit-Tests zum Fehlerhandling erweitert

### V1.1.1, 2019.10.23
* **Fehlerbehebung:** Eine Einschränkung für den Transport großer Dokumente über den VAU-Kanal im Modul vauchannel-cxf wurde behoben.


### V1.1.0, 2019.09.18
* **Neu:** Anpassung auf Spezifikationsstand zum Online-Produktivbetrieb, Release 3.1.2.
* **Neu:** Insbesondere wurde Change C_7029 implementiert, der für einen verschlüsselten Transport 
des Content-Type HTTP-Headers sorgt. 


### V1.0.0, 2019.09.03
* **Neu:**  Initiale Implementierung gemäß der Spezifikationsdokumente zum Online-Produktivbetrieb, Release 3.1.1.

ref-epa-vauchannel's People

Contributors

gematik-entwicklung avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ref-epa-vauchannel's Issues

Test cases do not work directly after start, second time works

Hi,
when running the test cases the first time the following fails:

...
[ERROR] Tests run: 9, Failures: 0, Errors: 3, Skipped: 0, Time elapsed: 148.082 s <<< FAILURE! - in de.gematik.ti.vauchannel.client.VauChannelIT
[ERROR] GF_AccessDeniedFromService  Time elapsed: 61.412 s  <<< ERROR!
javax.ws.rs.ProcessingException: java.net.SocketTimeoutException: SocketTimeoutException invoking http://localhost:9094/services/handshake: Read timed out
	at de.gematik.ti.vauchannel.client.VauChannelIT.vAUProtocolHandshake(VauChannelIT.java:161)
	at de.gematik.ti.vauchannel.client.VauChannelIT.GF_AccessDeniedFromService(VauChannelIT.java:112)
Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking http://localhost:9094/services/handshake: Read timed out
	at de.gematik.ti.vauchannel.client.VauChannelIT.vAUProtocolHandshake(VauChannelIT.java:161)
	at de.gematik.ti.vauchannel.client.VauChannelIT.GF_AccessDeniedFromService(VauChannelIT.java:112)
Caused by: java.net.SocketTimeoutException: Read timed out
	at de.gematik.ti.vauchannel.client.VauChannelIT.vAUProtocolHandshake(VauChannelIT.java:161)
	at de.gematik.ti.vauchannel.client.VauChannelIT.GF_AccessDeniedFromService(VauChannelIT.java:112)

[ERROR] GF  Time elapsed: 60.108 s  <<< ERROR!
javax.ws.rs.ProcessingException: java.net.SocketTimeoutException: SocketTimeoutException invoking http://localhost:9094/services/handshake: Read timed out
	at de.gematik.ti.vauchannel.client.VauChannelIT.vAUProtocolHandshake(VauChannelIT.java:161)
	at de.gematik.ti.vauchannel.client.VauChannelIT.testGF(VauChannelIT.java:58)
	at de.gematik.ti.vauchannel.client.VauChannelIT.GF(VauChannelIT.java:65)
Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking http://localhost:9094/services/handshake: Read timed out
	at de.gematik.ti.vauchannel.client.VauChannelIT.vAUProtocolHandshake(VauChannelIT.java:161)
	at de.gematik.ti.vauchannel.client.VauChannelIT.testGF(VauChannelIT.java:58)
	at de.gematik.ti.vauchannel.client.VauChannelIT.GF(VauChannelIT.java:65)
Caused by: java.net.SocketTimeoutException: Read timed out
	at de.gematik.ti.vauchannel.client.VauChannelIT.vAUProtocolHandshake(VauChannelIT.java:161)
	at de.gematik.ti.vauchannel.client.VauChannelIT.testGF(VauChannelIT.java:58)
	at de.gematik.ti.vauchannel.client.VauChannelIT.GF(VauChannelIT.java:65)

[ERROR] GF_2x  Time elapsed: 21.648 s  <<< ERROR!
de.gematik.ti.vauchannel.protocol.VAUProtocolException: VAUClientSigFin invalid
	at de.gematik.ti.vauchannel.client.VauChannelIT.vAUProtocolHandshake(VauChannelIT.java:164)
	at de.gematik.ti.vauchannel.client.VauChannelIT.testGF(VauChannelIT.java:58)
	at de.gematik.ti.vauchannel.client.VauChannelIT.GF_2x(VauChannelIT.java:70)

...
[ERROR] Errors: 
[ERROR]   VauChannelIT.GF:65->testGF:58->vAUProtocolHandshake:161 » Processing java.net....
[ERROR]   VauChannelIT.GF_2x:70->testGF:58->vAUProtocolHandshake:164 » VAUProtocol VAUCl...
[ERROR]   VauChannelIT.GF_AccessDeniedFromService:112->vAUProtocolHandshake:161 » Processing
...

Running them again works.

/Manuel

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.