1. Indledning
Det primære mål for SOSI-biblioteket er at indkapsle det meste af den komplekse logik i SOSI-konceptet bag et meget simpelt API.
Det har været vores mål at konstruere et enkelt indgangspunkt for alle udviklere (en factory-klasse), hvorfra det er muligt at erhverve enkle modelobjekter (POJO's 1 ), der repræsenterer kernekoncepterne i SOSI-skemaet, f.eks. en meddelelse eller et ID-kort.
Når udviklerne har konstrueret disse modelobjekter, er det muligt at "serialisere" dem til XML og vice versa. Deserialisering (fra XML til modelobjekter) udføres også gennem factory-klassen. Nedenfor vises et meget simpelt flow, hvor en serviceforbruger (f.eks. et medicinsystem) opretter en anmodning, indsætter data i anmodningen, serialiserer den til XML og sender den til en serviceforbruger.
2. Oversigt
Følgende afsnit giver en oversigt over den funktionalitet Seal.Java tilbyder:
Farvekoderne er de samme som i STS anvenderguiden:
Farve | Beskrivelse |
---|---|
DGWS | |
Borger | |
Medarbejder | |
Øvrig funktionalitet |
Funktion / Omveksling | Java klasse | Java metode | Beskrivelse | Benyttes af (STS / NTIdP) |
---|---|---|---|---|
DGWS system ID-kort | SOSIFactory |
STS (NewSecurityTokenService service) |
||
deserializeSecurityTokenRequest() | Kan deserialisere en XML streng til et SecurityTokenRequest objekt. | |||
copyToVOCESSignedIdCard() | Genererer et signeret ID-kort. | |||
createNewSecurityTokenResponse() | Opretter et SecurityTokenResponse objekt der indeholder det signerede ID-kort. | |||
createNewSecurityTokenErrorResponse() | Hvis verifikation af det medsendte ID-kort fejler, så returneres SecurityTokenResponse objekt indeholdende fejlbeskeden. | |||
Bootstrap Token til OIOIDWS Token | OIOSAMLFactory | STS (Bst2Idws service) | ||
createOIOBootstrapToIdentityTokenRequestModelBuilder() | Kan deserialisere en xml streng til et OIOBootstrapToIdentityTokenRequest objekt. | |||
createCitizenIdentityTokenBuilder() |
Benyttes i forbindelse med oprettelse af nyt IdentityToken. |
|||
createOIOBootstrapToIdentityTokenResponseDOMBuilder() |
Opretter et nyt OIOBootstrapToIdentityTokenResponseDOMBuilder objekt der indeholder det signerede IdentityToken. (Den oprettes direkte udenom Factory-klassen). |
|||
OIOSAML Token til DGWS ID-kort | OIOSAMLFactory | STS (OIOSaml2Sosi service) | ||
createOIOSAMLAssertionToIDCardRequestModelBuilder() | Kan deserialisere en xml streng til et OIOSAMLAssertionToIDCardRequest objekt. | |||
UserIDCard |
Der oprettes et nyt UserIDCard objekt direkte udenom Factory-klassen. ID-kortet signeres også vha. direkte kald til UserIDCard.sign(). |
|||
createOIOSAMLAssertionToIDCardResponseDOMBuilder() | Opretter et nyt OIOSAMLAssertionToIDCardResponseDOMBuilder objekt der indeholder det signerede ID-kort. | |||
Digital signering og validering | SignAndValidate | |||
sign() | Bruges til signering af både DGWS og IDWS tokens. | |||
validateDGWS() | Validering af DGWS tokens. | |||
validateIDWS() | Validering af IDWS tokens. | |||
Kryptering / dekryptering | EncryptionUtility | |||
encrypt() | kryptere et element vha. den medsendte public nøgle. | |||
decrypt() | dekryptere et element vha. den medsendte private nøgle. | |||
decryptAndDetach() | dekryptere et element vha. den medsendte private nøgle og returnere det i en ny node der ikke er forbundet til det oprindelige dokument. | |||
generatePrivateKeyFromString() | Generer et PrivateKey objekt ud fra en private nøgle (streng) og en krypteringsalgoritme. |
3. Biblioteker
3.1. Standard SOSI-factory
Fra version 2.6.1 er det muligt at anvende SOSIFacotry uden at bruge en SigntureProvider eller CredentialVault, så længe man ikke bruger funktionalitet der anvender signering. Ved forsøg på at gøre dette får man fejlbeskeden:
You cannot sign an IDCard using a SOSIFactory constructed without SignatureProvider or CredentialVault!
3.2. IDWSH-factory
Fra version 2.1 inkluderer Seal.Java nu IDWSHFactory. Version 2.1 markerer begyndelsen af IDWSH-support. Det formodes at fremdidige versioner af Seal.Java vil udvide support og arbejdsgang ved hjælp af IDWSH.
Seal.Java 2.1 understøtter kun IDWSH IdentityToken. Strømmen til konstruktion og anvendelse af IdentityToken er vist nedenstående figur.
3.3. OIOSAML-factory
I Seal 2.1.4 blev OIOSAMLFactory introduceret, som giver funktionalitet til at oprette, analysere, underskrive og validere OIOWS-Trust-meddelelser, der bruges ved udveksling af OIOSAML-påstande, der er udstedt af og IdP til SOSI IDCards.
3.3.1. BST2IDWS
Nedenstående er et simplificeret eksempel på hvordan SOSIFactory benyttes til at oprette et bst2idws request med et indlejret OIO2BST bootstraptoken.
3.3.2. BST2SOSI
Oprettelsen af et bst2sosi request er meget i stil med et bst2idws request:
3.4. OIOBSTSAMLAssertion-factory
OIOBSTSAMLAssertionFactory benyttes til at oprette OIO bootstraptoken objekter givet et xml element.
Sådanne bootstraptokens kan enten være for medarbejdere (hertil benyttes createOIOBSTSAMLAssertion(...)) eller borgere (hertil benyttes createOIOBSTCitizenSAMLAssertion(...)), og identificeres ud fra deres spec version attribut.
3.5. OIOIDWS-factory
Siden Seal 2.5.10 understøttes OIO IDWS.
Eksempel på brug af IDWS hjælpeklasser for service udbydere.
4. Federations
Når SOSIFactory er oprettet, er det let at komme i gang. Overvej følgende kodestykker, der indeholder kode til opbygning af en anmodning (request) som sendes til en tjenesteudbyder (Service provider).
4.1. Service Consumer
Properties properties = ...; SOSITestFederation testFederation = new SOSITestFederation(properties); CredentialVault credentialVault = ...; // construct or resolve credentialvault here SOSIFactory factory = new SOSIFactory(testFederation, credentialVault, properties); Request request = factory.createNewRequest( false, // don’t require non-repudiation receipt null // Optional flow-ID (not used here) ); IDCard idCard = ...; // resolve ID-card here request.setIDCard(idCard); Element body = ...; // build body DOM element here request.setBody(body); Document domDocument = request.serialize2DOMDocument(); String xml = XmlUtil.node2String(domDocument, false, true); //Send xml to Service provider here
Det reelle arbejde ligger i følgende linier:
Linie 1: Specificering af egenskaber for SOSI, se senere for reference til SOSI-egenskaber
Linie 3: Opbygge/finde instans af Credential Vault.
Linie 11: Opbygge/finde instans af ID-kort.
Linie 15: Opbygning af indhold til XML
Linie 20: Sende XML til serviceprovider
4.2. Service Provider
På den "anden side" hos serviceudbyderen bruges biblioteket således. Også her håndterer udvikleren kun ting, der er relateret til forretningsopgaven.
Properties properties = ...; Federation federation = new SOSIFederation(properties); CredentialVault credentialVault = ...; // construct or resolve credentialvault here SOSIFactory factory = new SOSIFactory(federation, credentialVault, properties); // This implicitely verifies the STS signature on the ID card etc. Request request = factory.deserializeRequest(xml); IDCard idCard = request.getIDCard(); // use ID card attributes for authorization here Element body = request.getBody(); // use information in body for business logic here Reply reply = factory.createNewReply( request, // dgws version and”In response to” ID null // Optional flow-ID set to null ); reply.setIDCard(idCard); Element replyBody = ...; // build reply body DOM element here reply.setBody(replyBody); Document domDocument = reply.serialize2DOMDocument(); String replyXML = XmlUtil.node2String(domDocument, false, true); // Send replyXML to Service provider here
5. Konvertering af OCES3-certifikater
OCES3-certifikaterne bruger krypteringsalgoritment AES256 i stedet for 3DES der bruges i OCES2-certifikater. Java 8 understøtter ikke denne krypteringsalgoritme og det er den Java version skal anvendes på NSP.
5.1. Se indholdet af et OCES3-certifikat
Hvis man blot vil se certifikatet, så kan man gøre det vha. OpenSSL og dermed bruge Java 8:
openssl pkcs12 -nodes -in NSTSSnullAnull_Olsen.p12
Indtast nu certifikatets password.
5.2. Skift password af et OCES3-cetifikat
Det er muligt at transformere certifikatet fra AES256 til 3DES vha. OpenSSL og man kan samtidig skifte certifikatets password. Det kan gøres i to skridt:
openssl pkcs12 -in NSTSSnullAnull_Olsen.p12 -out NSTSSnullAnull_Olsen.pem -nodes
Indtast nu det medsendte password der blev udleveret sammen med certifikatet.
Indtast nu sidste del af kommandoen:
openssl pkcs12 -export -out NSTSSnullAnull_Olsen-new.p12 -in NSTSSnullAnull_Olsen.pem
Der bliver spurgt om certifikatets nye password - brug f.eks. Test1234.
Det nye certifikat findes i filen NSTSSnullAnull_Olsen-new.p12
Det er nu muligt at se certifikatet med keytool. Eksempel hvor certifikatets password er Test1234:
keytool -v -list -keystore NSTSSnullAnull_Olsen-new.p12 -storepass Test1234
6. Tidsangivelser
Seal håndterer tidsangivelser i forhold til DGWS standarden, som angiver følgende format:
yyyy-mm-ddThh:MM:ssZ
Seal accepterer også tidsstempler i lokal tid (uden 'Z') og med fraktioner af sekunder (disse ignoreres).
Eksempler på gyldige tidsangivelser:
- 2020-01-01T12:00:00Z
- 2020-01-01T12:00:00
- 2020-01-01T12:00:00.555Z (tolkes som 2020-01-01T12:00:00Z)
- 2020-01-01T12:00:00.555 (tolkes som 2020-01-01T12:00:00)
Eksempler på ugyldige tidsangivelser:
- 2020-01-01T12:00:00+01
- 2020-01-01T12:00
7. Properties
Navn | Beskrivelse | Default værdi | Gældende fra |
---|---|---|---|
sosi:certificateloader.timeout | Read timeout på hentning af intermediate certifikater. Sættes i millisekunder. | 3000 | 2.6.12 |
- Plain Old Java Objects - https://en.wikipedia.org/wiki/Plain_old_Java_object