In dit hoofdstuk wordt de inhoud van het SAML transactietoken besproken die bij berichtauthenticatie met behulp van de UZI-pas/servercertificaat wordt gebruikt. Het SAML transactietoken bevat informatie over de toegepaste authenticatie en identificatie van de zorgverlener/medewerker/organisatie. Het SAML transactietoken is een op XML gebaseerd SAML assertion en heeft tot doel de assertions (bewijs van een bewering) over te brengen tussen partijen.
...
Element/@Attribute | 0..1 | Omschrijving |
---|---|---|
@ID | 1 | Unieke identificatie van de Assertion |
@Version | 1 | Versie van het SAML Protocol. Vaste waarde moet zijn 2.0 |
@IssueInstant | 1 | Tijdstip van uitgifte van de Assertion. |
Issuer | 1 | Bevat het OrganisatieID van de zendende applicatie. |
@NameQualifier | 0 | Niet gebruiken |
@SPNameQualifier | 0 | Niet gebruiken |
@Format | 1 | Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity" |
@SPProviderID | 0 | Niet gebruiken |
Signature | 1 | Bevat de handtekening over de assertion zoals gezet met behulp van de UZI pas van de zorgverlener (Z) of de UZI medewerkerpas (N) van de medewerker. De handtekening dient geplaatst te zijn met behulp van het authenticatie certificaat op de pas. |
Subject | 1 | De zorgverlener/medewerker die zich authenticeert. |
BaseID | 0 | Niet gebruiken |
NameID | 1 | Bevat zowel de UZI van de geauthenticeerde zorgverlener/medewerker alsmede diens rolcode. |
EncryptedID | 0 | Niet gebruiken |
SubjectConfirmation | 1 | Moet aanwezig zijn |
@Method | 1 | 'urn:oasis:names:tc:SAML:2.0:cm:holder-of-key' |
SubjectConfirmationData | 0 | Niet gebruiken |
@Recipient | 0 | Niet gebruiken |
@NotOnOrAfter | 0 | Niet gebruiken |
@InResponseTo | 0 | Niet gebruiken |
@NotBefore | 0 | Niet gebruiken |
@Address | 0 | Niet gebruiken |
KeyInfo | 1 | Bevat de X509 Issuer.serial van de medewerkerspas of het servercertificaat |
Conditions | 1 | Moet aanwezig zijn |
@NotBefore | 1 | Moet aanwezig zijn. |
@NotOnOrAfter | 1 | Moet aanwezig zijn. Mag maximaal 90 minuten na @NotBefore liggen. |
Condition | 0 | Niet gebruiken |
AudienceRestriction | 1 | Moet aanwezig zijn |
Audience | 1 | urn:IIroot:2.16.840.1.113883.2.4.6.6:IIext:1 (is de ZIM) |
ProxyRestriction | 0 | Niet gebruiken |
Advice | 0 | Niet gebruiken |
AuthnStatement | 1 | Moet aanwezig zijn |
@AuthnInstant | 1 | Tijdstip van authenticatie van de gebruiker (Subject) of applicatie |
@SessionIndex | 0 | Niet gebruiken |
AuthnContext | 1 | Moet aanwezig zijn |
AuthnContextClassRef | 1 | Ingeval van ondertekening met pas: urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI |
AttributeStatement | 1 | Moet aanwezig zijn |
Attribute | 0..1 | Moet aanwezig zijn indien bericht aan één patient is gerelateerd. |
@Name | 1 | Vaste waarde: "burgerServiceNummer" |
AttributeValue | 0..1 | Het BSN van de patient. . |
Attribute | 1 | Moet aanwezig zijn |
@Name | 1 | Vaste waarde: "messageIdRoot" |
AttributeValue | 1 | De waarde van de messageIdRoot bijvoorbeeld:2.16.528.1.1007.3.3.1234567.1 |
Attribute | 1 | Moet aanwezig zijn |
@Name | 1 | Vaste waarde: "messageIdExt" |
AttributeValue | 1 | Het MessageId van het bericht.. |
Attribute | 1 | Moet aanwezig zijn |
@Name | 1 | Vaste waarde: "InteractionId" |
AttributeValue | 1 | Het InteractionId van het Bericht (het extension-element). |
Attribute | 0..1 | Moet aanwezig zijn bij de Generieke Query |
@Name | 1 | Vaste waarde: "contextCodeSystem" |
AttributeValue | 0..1 | 2.16.840.1.113883.2.4.3.111.15.1 |
Attribute | 0..1 | Moet aanwezig zijn bij de Generieke Query |
@Name | 1 | Vaste waarde: "contextCode" |
AttributeValue | 0..1 | De contextcode uit de Generieke query. |
Attribute | 0..1 | Moet aanwezig zijn indien gebruik gemaakt is van een mandaat |
@Name | 1 | Vaste waarde: "autorisatieregel/context" |
AttributeValue | 0..1 | URI waar de autorisatieregel/context gevonden kan worden waarbinnen het mandaat gegeven wordt. |
Attribute | 0..1 | Moet aanwezig zijn indien gebruikt wordt binnen AORTA infrastructuur |
@Name | 1 | Vaste waarde: "applicationID" |
AttributeValue | 0..1 | ApplicatieID van de applicatie |
...
Bij het gebruik van de namespace-prefixes is het van belang deze na het ondertekenen niet meer te veranderen, dit maakt de digitale handtekening ongeldig. |
Anchor | ||||
---|---|---|---|---|
|
De volgende paragrafen beschrijven de verschillende kenmerken en beveiligingsgerelateerde gegevens die het SAML transactietoken onderscheiden, zoals in [IH tokens generiek] beschreven is.
Code Block |
---|
<saml:Assertion ... xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"> |
Het SAML transactietoken begint met het Assertion element en een verwijzing naar de XML SAML namespace voor SAML 2.0 assertions. De attributen behorende bij het Assertion element wordt in paragraaf 2.3.1 Uniekheid beschreven.
Anchor | ||||
---|---|---|---|---|
|
Code Block |
---|
ID="token_ dd1c1f96-f0b0-4026-a978-4d724c0a0a4f" |
...
IssueInstant="2009-06-24T11:47:34Z" |
...
Version="2.0"> |
De volgende attributen van het SAML assertion element maken van de SAML assertion een uniek gegeven, uitgegeven door de verzender van het bericht. Het attribuut ID identificeert op een unieke wijze de assertion. De assertion mag slechts eenmalig als token gebruikt worden. De waarde moet mondiaal uniek zijn voor AORTA berichten, zodat bij samenvoegen van meerdere XML bestanden (in een HL7v3 batch of anderszins) de waarde uniek blijft.
...
Het attribuut IssueInstant is een tijdsmoment van uitgifte van de SAML assertion. De tijdswaarde is gecodeerd in UTC. Het attribuut Version is de gebruikte SAML versie van de SAML assertion. De aanduiding voor de versie van SAML gedefinieerd in deze specificatie is "2.0".
Anchor | ||||
---|---|---|---|---|
|
Code Block |
---|
<saml:Issuer> |
...
<!-- De Issuer verwijst naar de organisatie van waaruit het totale bericht verstuurd wordt.--> |
...
urn:IIroot:2.16.528.1.1007.3.3:IIext:12345678 |
...
</saml:Issuer> |
De URA wordt uitgedrukt met behulp van een URN (Uniform Resource Name). De URN is opgebouwd uit:
...
urn:IIroot:2.16.528.1.1007.3.3:IIext:12345678
Anchor | ||||
---|---|---|---|---|
|
Code Block |
---|
<saml:Subject> |
...
<saml:NameID> |
...
123456789:01.015 |
...
</saml:NameID> |
...
<saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:holder-of-key"> |
...
<saml:SubjectConfirmationData> |
...
<saml:KeyInfo> |
...
<ds:X509Data> |
...
<ds:X509IssuerSerial> |
...
<ds:X509IssuerName>CN=...,...,O=...,C=NL</ds:X509IssuerName> |
...
<ds:X509SerialNumber>...834756977854956...</ds:X509SerialNumber> |
...
</ds:X509IssuerSerial> |
...
</ds:X509Data> |
...
</saml:KeyInfo> |
...
</saml:SubjectConfirmationData> |
...
</saml:SubjectConfirmation> |
...
</saml:Subject> |
De Subject verwijst naar de UZI van de zorgverlener/medewerker die de assertion heeft gegenereerd in combinatie met de rolcode van diezelfde zorgverlener/medewerker gescheiden door een dubbele punt (:).
...
Voor een beschrijving van de opbouw van de KeyInfo wordt verwezen naar hoofdstuk 4.4.3 Certificaatverwijzingen in document [IH tokens generiek].
Anchor | ||||
---|---|---|---|---|
|
Code Block |
---|
saml:Conditions |
...
NotBefore="2009-06-24T11:47:34Z" |
...
NotOnOrAfter="2009-06-24T11:52:34Z"> |
Het attribuut NotBefore is de tijd waarop de SAML assertion geldig wordt. Dit hoeft niet de tijd te zijn waarop het bericht is aangemaakt. Het is mogelijk NotBefore in de toekomst te zetten, en het bericht na deze tijd pas te verzenden.
...
Het inperken van bepaalde partijen (AudienceRestriction) waarvoor de assertion bedoeld is wordt beschreven in paragraaf 2.3.5 Ontvanger.
De subelementen OneTimeUse en ProxyRestriction worden niet gebruikt binnen het <Conditions> element bij berichtauthenticatie met behulp van de UZI-pas.
Anchor | ||||
---|---|---|---|---|
|
Code Block |
---|
<saml:AudienceRestriction> |
...
<!-- Root en extensie van de ZIM --> |
...
<saml:Audience>urn:IIroot:2.16.840.1.113883.2.4.6.6:IIext:1</saml:Audience> |
...
</saml:AudienceRestriction> |
In de AudienceRestriction wordt beschreven aan wie de SAML assertion is gericht. De waarden in de elementen zijn (voorlopig) vaste waarden. Voor de <Audience> parameter is (ook) gekozen voor URN, zie voor opbouw paragraaf 2.3.2 Afzender.
Anchor | ||||
---|---|---|---|---|
|
Code Block |
---|
<saml:AuthnStatement |
...
AuthnInstant="2009-06-24T11:47:34" |
...
SessionIndex="token_2.16.528.1.1007.3.3.1234567.1_0123456789"> |
Het subject, een zorgverlener of medewerker, in de SAML assertion is geauthenticeerd door middel van een authenticatiemiddel op een gegeven moment.
Code Block |
---|
<saml:AuthnContext> |
...
<saml:AuthnContextClassRef> |
...
urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI |
...
</saml:AuthnContextClassRef> |
...
</saml:AuthnContext> |
Als het transactietoken ondertekend is met het servercertificaat dan dient de AuthnContextClassRef de waarde urn:oasis:names:tc:SAML:2.0:ac:classes:X509 te krijgen .
...
Binnen de SAML-specificatie geeft men een authenticatie-context (AuthnContext) mee die de context van het gebruikte authenticatiemiddel aangeeft. Hiervoor zijn een aantal contexten gespecificeerd, zie [SAMLAuthnContext], die gebruikt worden als referentiekader voor de communicatie tussen de ZIM en andere componenten zoals GBZ applicaties.
Code Block |
---|
</saml:AuthnStatement> |
Afsluiting authentication statement.
Anchor | ||||
---|---|---|---|---|
|
Code Block |
---|
<saml:AttributeStatement> |
De volgende attributen zijn gegevens uit het HL7v3 bericht die met de authenticatie meegetekend worden. Dit zijn kopieën van gegevens die elders in hetzelfde HL7v3 bericht voorkomen. De volgorde van de attributen in het AttributeStatement is niet relevant. Er mogen geen andere attributen opgenomen worden in het AttributeStatement dan hier beschreven is.
InteractionId
Code Block |
---|
<saml:Attribute Name="interactionId"> |
...
<saml:AttributeValue>QURX_IN990011NL</saml:AttributeValue> |
...
</saml:Attribute> |
Het attribuut interactionId wordt altijd meegetekend. De interactionId geeft een directe relatie met het berichttype. Dit attribuut meesturen verhindert veel soorten aanvallen, bijvoorbeeld het token van een query kapen en proberen deze te hergebruiken voor het afhandelen van verzoeken van patiënten en hun vertegenwoordigers om inzage te verkrijgen in de verwijsindex.
contextCode
Code Block |
---|
<saml:Attribute Name="contextCodeSystem"> |
...
<saml:AttributeValue>2.16.840.1.113883.2.4.3.111.15.1</saml:AttributeValue> |
...
</saml:Attribute> |
...
<saml:Attribute Name="contextCode"> |
...
<saml:AttributeValue>KZDI</saml:AttributeValue> |
...
</saml:Attribute> |
In het geval er sprake is van een opvraag op basis van een context dient ook de contextCode meegetekend te worden. Dit is in principe alleen het geval bij de generiekeQueryZorggegevens. Bij deze generieke query is het trigger event niet meer voldoende om de intentie van de verzender aan te geven, aangezien deze altijd gelijk is. Door het toevoegen van de contextCode wordt deze intentie wel weer expliciet gemaakt. De codes zijn te vinden in het vocab bestand 2.16.840.1.113883.2.4.3.111.15.1.xml.
messageId
Code Block |
---|
<saml:Attribute Name="messageIdRoot"> |
...
<saml:AttributeValue>2.16.528.1.1007.3.3.1234567.1</saml:AttributeValue> |
...
</saml:Attribute> |
...
<saml:Attribute Name="messageIdExt"> |
...
<saml:AttributeValue>0123456789</saml:AttributeValue> |
...
</saml:Attribute> |
De Attributen messageIdRoot en messageIdExt vormen een uniek gegeven, uitgegeven door de verzender van het HL7v3-bericht. De combinatie van de attribuutwaarden messageIdRoot en messageIdExt moeten gelijk zijn aan het uiteindelijk gebruikte HL7v3 message.Id.
burgerServiceNummer
Code Block |
---|
<saml:Attribute Name="burgerServiceNummer"> |
...
<saml:AttributeValue>950052413</saml:AttributeValue> |
...
</saml:Attribute> |
Voor berichten die betrekking hebben op een enkele patiënt, wordt het burgerServiceNummer (BSN) van de patiënt opgenomen. Dit maakt ook weer vele aanvallen onmogelijk, namelijk gegevens van een andere patiënt proberen op te vragen. Dit geldt voor alle berichten die betrekking hebben op één en niet meer dan één patiënt.
...
Alleen indien gebruik gemaakt wordt van een mandaat dient het volgende attribuut toegevoegd te worden:
Code Block |
---|
<saml:Attribute Name="autorisatieregel/context"> |
...
<saml: |
...
AttributeValue>https://goedbeheerdziekenhuis/autorisatieregels/medicatiecontext/v2 </saml:AttributeValue> |
...
</saml:Attribute> |
In het voorbeeld is voor een URL gekozen.
...
Indien het transactietoken gebruikt wordt binnen de AORTA infrastructuur is het applicatieID verplicht:
Code Block |
---|
<saml:Attribute Name="applicationID"> |
...
<!-- Applicatie-id van de GBZ-applicatie, zoals toegekend bij aansluiting.--> |
...
<saml:AttributeValue>urn:IIroot:2.16.840.1.113883.2.4.6.6:IIext:? </saml:attributeValue> |
...
</saml:Attribute> |
Het applicatie-id van de afzender die deze SAML assertion heeft gecreëerd en de gebruiker authenticeert. De Issuer wordt uitgedrukt met behulp van een URN (Uniform Resource Name). De URN is opgebouwd uit:
...
Het attributen statement blok ziet er dan bijvoorbeeld zo uit (de volgorde van de attributen is niet relevant):
Code Block |
---|
<saml:AttributeStatement> |
...
<saml:Attribute Name="interactionId"> |
...
<saml:AttributeValue>QURX_IN990011NL</saml:AttributeValue> |
...
</saml:Attribute> |
...
<saml:Attribute Name="messageIdRoot"> |
...
<saml:AttributeValue>2.16.528.1.1007.3.3.1234567.1</saml:AttributeValue> |
...
</saml:Attribute> |
...
<saml:Attribute Name="messageIdExt"> |
...
<saml:AttributeValue>0123456789</saml:AttributeValue> |
...
</saml:Attribute> |
...
<saml:Attribute Name="burgerServiceNummer"> |
...
<saml:AttributeValue>950052413</saml:AttributeValue> |
...
</saml:Attribute> |
...
<saml:Attribute Name="autorisatieregel/context"> <saml: |
...
AttributeValue>https://goedbeheerdziekenhuis/autorisatieregels/medicatiecontext/v2</saml: |
...
AttributeValue> </saml:Attribute> |
...
<saml:Attribute Name="applicationID"> |
...
<saml:AttributeValue>urn:IIroot:2.16.840.1.113883.2.4.6.6:IIext:300 |
...
</saml:AttributeValue> |
...
</saml:Attribute> |
...
</saml:AttributeStatement> |
Tenslotte wordt het attributen statement blok afgesloten met
...
</saml:AttributeStatement>
Anchor | ||||
---|---|---|---|---|
|
Om de integriteit en onweerlegbaarheid van het SAML transactietoken te waarborgen wordt een XML Signature geplaatst, zoals beschreven in [IH tokens generiek]. Na plaatsen van de XML Signature kan de ontvanger, met gebruikmaking van het persoons- of organisatiegebonden PKIoverheid-certificaat van de verzender en de CA certificaten zoals verstrekt door PKIoverheid, onomstotelijk vaststellen dat het SAML transactietoken ondertekend is met de privé sleutel behorend bij het gebruikte certificaat van de zorgmedewerker of de organisatie.
...
- Voor het berekenen van de hashwaarde wordt SHA-256 gebruikt.
- Voor de digitale handtekening in AORTA wordt gebruik gemaakt van een RSA handtekening over een SHA-256 digest.
Omdat de XML Signature onderdeel is van het SAML transactietoken en in het SAML transactietoken geplaatst wordt, moet er een "enveloped-signature" transformatie uitgevoerd worden die de Signature tags uit het SAML transactietoken verwijderd gevolgd door een “exc-c14n transformatie” (zie ook [SAML Core] §5.4.3 en §5.4.4). |
Anchor | ||||
---|---|---|---|---|
|
De headers
Eerst wordt het SAML transactietoken – het <saml:Assertion ...> element aangemaakt en gevuld met die elementen, zoals beschreven in paragraaf 2.3 Inhoud.
Code Block |
---|
<saml:Assertion |
...
ID="token_2.16.528.1.1007.3.3.1234567.1_0123456789" |
...
IssueInstant="2009-06-24T11:47:34Z" |
...
Version="2.0" |
...
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"> |
...
... Zie paragraaf 2.3 Inhoud ... |
...
</saml:Assertion> |
Het XML Signature blok is onderdeel van het SAML transactietoken. Het XML Signature blok komt na het <saml:Issuer> element. Na de Signature volgt de rest van de inhoud van de assertion.
Code Block |
---|
<saml:Assertion |
...
ID="token_2.16.528.1.1007.3.3.1234567.1_0123456789" |
...
IssueInstant="2009-06-24T11:47:34Z" |
...
Version="2.0" |
...
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"> |
...
<saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"> |
...
urn:IIroot:?:IIext:? |
...
</saml:Issuer> |
...
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> |
...
<ds:SignedInfo> |
...
... |
...
</ds:SignedInfo> |
...
<ds:SignatureValue>Wuwn...5e4=</ds:SignatureValue> |
...
<ds:KeyInfo> |
...
<ds:X509Data> |
...
<X509IssuerSerial> |
...
<X509IssuerName>CN=De Auteur CA,O=Nictiz,C=NL</X509IssuerName> |
...
<X509SerialNumber>359724...41160195</X509SerialNumber> |
...
</X509IssuerSerial> |
...
</ds:X509Data> |
...
</ds:KeyInfo> |
...
</ds:Signature> ... |
...
... Zie paragraaf 2.3 Inhoud ... |
...
</saml:Assertion> |
Indien de Signature aangemaakt wordt moet niet meer met de strings (saml:Assertion en SignedInfo) gemanipuleerd worden, maar ze moeten octet-voor-octet overgenomen worden in het bericht. Strikt genomen is het toegestaan wijzigingen aan te brengen die door canonicalisatie bij de ontvanger weer opgeheven worden, maar wanneer de digitale handtekening door middel van strings wordt opgebouwd, is het een foutgevoelige handeling.
...
Het SAML transactietoken met daarin de digitale handtekening wordt in het WS-Security SOAP Header gezet. Op het <wss:Security> element moet een soap:mustUnderstand="1" vlag opgenomen worden, die aangeeft dat de ontvanger dit security element moet verwerken en een soap:actor="http://www.aortarelease.nl/actor/zim" die aangeeft dat de ZIM dit security element verwerkt.
Code Block |
---|
<soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> |
...
... |
...
<wss:Security xmlns:wss= |
...
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" |
...
soap:actor="http://www.aortarelease.nl/actor/zim" soap:mustUnderstand="1"> |
...
<saml:Assertion ... > |
...
<saml:Issuer>...</saml:Issuer> |
...
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> |
...
<ds:SignedInfo> |
...
... |
...
</ds:SignedInfo> |
...
<ds:SignatureValue>Wuwn...5e4=</ds:SignatureValue> |
...
<ds:KeyInfo> |
...
<ds:X509Data> |
...
... |
...
</ds:X509Data> |
...
</ds:KeyInfo> |
...
</ds:Signature> |
...
... Zie paragraaf 2.3 Inhoud ... |
...
</saml:Assertion ... > |
...
</wss:Security> |
...
</soap:Header> |