## Signering af payload

Dette kapitel beskriver, hvordan man digitalt signerer XML-dokumenter ved hjælp af OCES (Offentlige Certifikater til Elektronisk Service) certifikater. Implementeringen understøtter flere signaturtyper til forskellige brugsscenarier i den danske digitale infrastruktur. Signeringen af dokumentet er ens for både SOAP og HTTP.

### Signaturtyper

1. Systemcertifikat-signering

   Bruges til standard dokumentoperationer såsom datahentning og søgning. Dette skal bruges som standard, medmindre andet er angivet.

2. Uigenkaldelighedscertifikat-signering

   Bruges til juridisk bindende dokumenter, der ændrer eksisterende data.

3. Disponentsignering

   Bruges til juridisk bindende dokumenter, hvor en person handler på vegne af en anden person eller virksomhed.

De fleste endpoints kræver stadig, at du signerer dokumentet. Hvis du er i tvivl om, hvilken signaturtype der skal anvendes, så tjek request-meddelelsens XSD i controller-dokumentationen. I de fleste tilfælde vil systemcertifikat-signering være det korrekte valg.

Anvendelse og implementering af signaturtyper kan findes i referenceklienten ved at undersøge følgende metoder:

    1
    Unresolved directive in signing.adoc - include::{javaDir}/SigningMethodsOverview.java[]

### Signaturens indhold

Signaturen består af en krypteret streng, der tilføjes til XML’en, som sendes i request body.

I øjeblikket understøtter S2S-serveren RSA_SHA1, RSA_SHA256 og RSA_SHA512 algoritmer til signaturmetoder samt RSA_SHA1 og RSA_SHA256 til digest. Oprettelse af signaturer med andre algoritmer vil medføre afvisning af dokumentet. Af sikkerhedsmæssige årsager anbefales det at bruge mindst RSA_SHA256, da RSA_SHA1 ikke længere anses for at være sikker.

Alle signaturer følger XML Digital Signature-specifikationen og inkluderer:

- SignedInfo: Indeholder canonicalization-metode, signaturalgoritme og referencer

- KeyInfo: Indlejrer det X.509-certifikat, der er brugt til signering

- Signature Value: Den faktiske kryptografiske signatur

Forskelle mellem signeringsmetoder:

Disponentsignaturer | Basis signaturer
--- | ---
Bruger XPath-filtrering til kun at signere specifikke dele af dokumentet, mens metadata og administrative elementer udelades | Hele dokumentet signeres i et dedikeret element til sidst i XML’en
Bruger CanonicalizationMethod.INCLUSIVE | Bruger CanonicalizationMethod.EXCLUSIVE

For disponentsignaturer vil HTTP XML API kontrollere, at det korrekte XPath-udtryk benyttes. En af følgende udtryk kan bruges til at udelade dele af dokumentet fra signeringen.

XPATH_SUBSET_V1

    Unresolved directive in signing.adoc - include::{javaDir}/XpathSubsetv1.java[]

XPATH_SUBSET_V2

    Unresolved directive in signing.adoc - include::{javaDir}/XpathSubsetv2.java[]

Her er et eksempel fra referenceklienten på, hvordan du kan inkludere XPath i dit projekt:

    1
    Unresolved directive in signing.adoc - include::{javaDir}/XpathInclude.java[]

### Eksempler på anvendelse

Da S2S referenceklienten forventer, at XML’en videregives som en String, vil de nuværende eksempler parse til Document ved hjælp af hjælpefunktioner.

Ved dataudtræk er en simpel signatur tilstrækkelig:

    1
    Unresolved directive in signing.adoc - include::{javaDir}/SignBasic.java[]

Når du skal ændre eller tilføje nye data, skal signering med mulighed for benægtelse anvendes. Eksemplet nedenfor viser et tilfælde, hvor en disponent er involveret i oprettelsen af dokumentet. Dette kræver to typer signaturer på samme tid:

    1
    Unresolved directive in signing.adoc - include::{javaDir}/SignDisponentRepudiation.java[]