@@ -276,6 +276,198 @@ Im folgenden Beispiel wird die Bibliothek [nimbus-jose-jwt](https://connect2id.c
...
@@ -276,6 +276,198 @@ Im folgenden Beispiel wird die Bibliothek [nimbus-jose-jwt](https://connect2id.c
</Tabs>
</Tabs>
### Signaturprüfung der DVDV-Dienst gelieferten DestinationParameters (Header `jws-signature`)
Die vom DVDV-Dienst gelieferten Daten enthalten den `Zustellpunkt` sowie dessen Signatur `destinationParametersSignature`. Die destinationParametersSignature wird in diesem Fall im Header `jws-signature` der Response des Endpunktes `/destinations/{id}` zurückgegeben.
Bei der Signatur handelt es sich um eine Detached JSON Web Signature in der Compact Serialization (siehe https://datatracker.ietf.org/doc/html/rfc7515#section-3.1 und https://datatracker.ietf.org/doc/html/rfc7515#appendix-F).
#### Erzeugung der vollständigen Signatur inklusive Payload
Die Prüfung der Signatur kann nur auf eine vollständige Signatur erfolgen. Für die Umwandlung muss der Payload (`Zustellpunkt`) als Bas64Encoded String der Signature hinzugefügt werden.
Dabei ist für das Json des Payload zu beachten, dass :
- alle semantisch unbedeutenden nicht-druckbaren Zeichen (Leerzeichen, Tabs, Line Feed \n, Carriage Return \r) vor und nach den strukturierenden Zeichen ([, {, ], }, :, ,) aus dem JSON-Payload entfernt werden
- die Attribute des JSON-Objekts in alphabetischer Reihenfolge sortiert werden
new Base64URL(headerParameterOfJWS.substring(0, firstPoint)),
payload,
new Base64URL(headerParameterOfJWS.substring(firstPoint + 2))
);
```
</TabItem>
</Tabs>
#### Prüfung der vollständigen Signatur
Um die Signatur zu überprüfen, ist es notwendig auf die verwendeten Schlüssel (im Format JSON Web Key, kurz JWK) zugreifen zu können.
Der Zustelldienst stellt ein JSON Web Key Set (JWKS) öffentlich zugänglich über den Endpunkt /.well-known/jwks.json bereit.
Da der Zustelldienst mit mehreren Instanzen betrieben werden kann, kann es auch mehrere Endpunkte zum JWKS geben. Diese Endpunkte können dynamisch aus dem Payload (`Zustellpunkt`) erzeugt werden. Dabei setzt sich der Endpunkt aus dem Attribut `submissionUrl` + '/.well-known/jwks.json' zusammen.
Vor der eigentlichen Signatureprüfung müssen alle Grundvorraussetzungen des JWT bzw. des JWKS geprüft werden.
1. Prüfung auf erlaubten Algorithmus PS512 im Header des JWT.
2. Url zum JWKS aus dem Payload des JWT ermitteln und diese Url um den Pfad `/.well-known/jwks.json` erweitern. Dabei muss auch geprüft werden, ob die Url zum JWKS erlaubt ist.
3. Ermitteln des PublicKey über die KeyId die im Header hinterlegt ist.
4. Prüfung dass der PublicKey eine Länge von 4096 bit besitzt.
5. Prüfung das der PublicKey den Algorithmus PS512 verwendet.
6. Prüfung der Signatur.
<Tabs
defaultValue="java"
values={[
{ label: 'Java', value: 'java', },
]
}>
<TabItem value="java">
```java
private final static int PUBLICKEYSIZE = 4096;
private final static String DVDV_SUBMISSIONURL_KEY = "submissionUrl";
private final static String KEYSTORE_URL_ENDING = ".well-known/jwks.json";
private final static String[] VALID_KEYSTORE_URLS = new String[]{ "https://submission-api.fit-connect.example.org/v1/.well-known/jwks.json"};
throw new RuntimeException("KeyStoreUrl not set!");
if (!baseKeyStoreUrl.endsWith("/"))
baseKeyStoreUrl+="/";
baseKeyStoreUrl+= KEYSTORE_URL_ENDING;
try
{
return Optional.of(new URL(baseKeyStoreUrl));
}
catch (MalformedURLException e)
{
throw new RuntimeException("KeyStoreUrl not valid! MalformedURLException for url " + baseKeyStoreUrl);
}
}
```
```java
public void validateKeyStoreUrl(URL url)
{
if ( !VALID_KEYSTORE_URLS.contains(String.valueOf(url)) )
throw new RuntimeException("KeyStoreUrl not valid!");
}
```
</TabItem>
</Tabs>
### Verwaltungspolitische Gebiete ermitteln
### Verwaltungspolitische Gebiete ermitteln
Falls für die Abfrage der `destinationId` kein amtlicher Gemeindeschlüssel oder ein amtlicher Regionalschlüssel bekannt ist, kann über den Endpunkt <ApiLink api="routing-api" to="/areas" /> nach passenden verwaltungspolitischen Gebieten gesucht werden.
Falls für die Abfrage der `destinationId` kein amtlicher Gemeindeschlüssel oder ein amtlicher Regionalschlüssel bekannt ist, kann über den Endpunkt <ApiLink api="routing-api" to="/areas" /> nach passenden verwaltungspolitischen Gebieten gesucht werden.