Beveiliging van webservices

>  Veiligheid – WS-Security X.509 Certificate Token Profile

>  Veiligheid - WS-Security SAML Token Profile / Holder-of-Key

>  Veiligheid - TLS verbinding

Webservices op het SOA-platform worden op verschillende niveaus beveiligd. Op transportniveau is steeds een SSL/TLS-verbinding vereist. Op berichtniveau gebeurt de authenticatie van de service consumer op basis van X.509-certificaten.

De gebruikte WS-Security-standaarden staan beschreven in volgende specificaties:

Foutmelding

Wanneer het SOA-platform een request niet aanvaardt vanwege een securityfout, wordt een SOAP fault met de volgende error code teruggestuurd: SOA-01001 – Service call not authenticated.
 

1
2
3
4
5
6
7
8
9
10
11
12
<soapenv:Fault>
 <faultcode>soapenv:Client</faultcode>
 <faultstring>SOA-01001: Service call not authenticated.</faultstring>
  <detail>
   <urn:SystemError Id="Id-361d9c637de72d01a33bb672" xmlns:urn="urn:be:fgov:ehealth:errors:soa:v1">
     <Origin>Consumer</Origin>
     <Code>SOA-01001</Code>
     <Message xml:lang="en">Service call not authenticated.</Message>
     <urn:Environment>Production</urn:Environment>
     </urn:SystemError>
    </detail>
</soapenv:Fault>

 

Veiligheid – WS-Security X.509 Certificate Token Profile

Deze security policy is enkel van toepassing voor het oproepen van de SecurityTokenService (STS). Ze beschrijft hoe een SOAP-bericht met een X.509-certificaat moet ondertekend worden.

De wsse:Security header bevat volgende onderdelen:

  1. wsse:BinarySecurityToken met het consumer X.509v3-certificaat in base64-notatie;
  2. wsu:Timestamp met maximale geldigheid van 5 minuten;
  3. ds:Signature met digitale handtekening over BST, TMS en soapenv:Body. Elk blok wordt gecanonicaliseerd (Exclusive) en gehasht (SHA256) (<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>).

    De handtekening zelf is van het type RSA-SHA256 (voor een certificaat met RSA-vercijfering - <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>) of ECDSA-SHA256 (voor een certificaat ECC - <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256"/>)

Voorbeeld met PlatformIntegrationConsumerTest (vereenvoudigd)

De operatie checkAccessControl van PlatformIntegrationConsumerTest vereist een X.509 certificaat en handtekening. U test hiermee de geldigheid van uw certificaat en handtekening.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:urn="urn:be:fgov:ehealth:platformintegrationconsumertest:v1"
   xmlns:urn1="urn:be:fgov:ehealth:platformintegrationconsumertest:types:v1">
    <soapenv:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
         xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"
             ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"
             wsu:Id="X509-FC77E2C72083DA8E0F16711753508182856">…rbuk8x3PjISQVjsa1grLPH4lIucCYA==</wsse:BinarySecurityToken>
            <ds:Signature Id="SIG-FC77E2C72083DA8E0F16711753508252860" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                        <ec:InclusiveNamespaces PrefixList="soapenv urn urn1"xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                    </ds:CanonicalizationMethod>
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                    <ds:Reference URI="#TS-FC77E2C72083DA8E0F16711753508042855">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                                <ec:InclusiveNamespaces PrefixList="wsse soapenv urn urn1" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                            </ds:Transform>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                        <ds:DigestValue>9Ec830Iy7Z5H+2XOjISfBDxlHmav2B6hRNvrKO/KciY=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#id-FC77E2C72083DA8E0F16711753508182859">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                                <ec:InclusiveNamespaces PrefixList="urn urn1" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                            </ds:Transform>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                        <ds:DigestValue>IIl2PFRIe6Olae8SjrOKea+sovVPaAmzTTB6Gpa/+kg=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#X509-FC77E2C72083DA8E0F16711753508182856">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                                <ec:InclusiveNamespaces PrefixList="" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                            </ds:Transform>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                        <ds:DigestValue>MopA8Zl3j+3kSqI0VvpN1DDfrRiN1CmGZomUgx9XNnc=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>...WlQd2a66TRxHw==</ds:SignatureValue>
                <ds:KeyInfo Id="KI-FC77E2C72083DA8E0F16711753508182857">
                    <wsse:SecurityTokenReference wsu:Id="STR-FC77E2C72083DA8E0F16711753508182858">
                        <wsse:Reference URI="#X509-FC77E2C72083DA8E0F16711753508182856"
                         ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
                    </wsse:SecurityTokenReference>
                </ds:KeyInfo>
            </ds:Signature>
            <wsu:Timestamp wsu:Id="TS-FC77E2C72083DA8E0F16711753508042855">
                <wsu:Created>2022-12-16T07:22:30.803Z</wsu:Created>
                <wsu:Expires>2022-12-16T07:23:30.803Z</wsu:Expires>
            </wsu:Timestamp>
        </wsse:Security>
    </soapenv:Header>
    <soapenv:Body wsu:Id="id-FC77E2C72083DA8E0F16711753508182859" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <urn:CheckAccessControlRequest>
            <urn1:Message>Hello World</urn1:Message>
            <urn1:Timestamp>2014-12-30T15:29:03.157+01:00</urn1:Timestamp>
        </urn:CheckAccessControlRequest>
    </soapenv:Body>
</soapenv:Envelope>

 

Veiligheid - WS-Security SAML Token Profile / Holder-of-Key

Een groot aantal diensten moeten opgeroepen worden met een SAML-token van een centrale authenticatiedienst:  API Portal ( wcag.label.externalLink) (vul in de zoekfunctie de term 'IAM-STS-SecurityTokenService' in). Dit gebeurt volgens de OASIS WS-Trust-standaard.

Het authenticatieproces verloopt als volgt:

  1. De service consumer authenticeert zich één keer bij de STS met een X.509-certificaat.
  2. Hij ontvangt van de STS een ondertekend SAML-token dat gedurende een beperkte periode geldig is.
  3. Met dit token kan de consumer gedurende de geldigheidsperiode verschillende webservices oproepen.

Ter informatie: Dit STS-mechanisme moet u eenmalig implementeren alvorens een business service te kunnen oproepen.

Stap voor stap

Stap 1

De consumer stuurt een RequestSecurityToken (RST) naar STS met het verzoek om een SAML 1.1-token te verkrijgen. De consumer ondertekent de SOAP oproep volgens de X.509 _SHA256 security policy.

Voorbeeld RST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<wst:RequestSecurityToken Context="RC-7150fca4-1999-45b8-8284-a3944409a345" 
    xmlns:auth = "http://docs.oasis-open.org/wsfed/authorization/200706" 
    xmlns:ds = "http://www.w3.org/2000/09/xmldsig#"
    xmlns:wsa = "http://schemas.xmlsoap.org/ws/2004/08/addressing" 
    xmlns:wsp = "http://schemas.xmlsoap.org/ws/2004/09/policy" 
    xmlns:wsse = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd " xmlns:wst=" http : // docs.oasis-open.org/ws-sx/ws-trust/200512"> 
    <wst:TokenType>http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1</wst:TokenType>
    <wst:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</wst:RequestType>
    <wst:Claims Dialect="http://docs.oasis-open.org/wsfed/authorization/200706/authclaims">
        <auth:ClaimType Uri="urn:be:fgov:kbo-bce:organization:cbe-number"/>
        <auth:ClaimType Uri="urn:be:fgov:ehealth:1.0:certificateholder:enterprise:cbe-number"/>
    </wst:Claims>
    <wst:KeyType>http://docs.oasis-open.org/ws-sx/wstrust/200512/PublicKey</wst:KeyType>
</wst:RequestSecurityToken>

Stap 2

Na authenticatie zal de STS antwoorden met een RequestSecurityTokenResponse (RSTR) die het gevraagde SAML-token bevat. De SAML assertion kan met xpath gefilterd worden (//soapenv:Body/wst:RequestSecurityTokenResponse/wst:RequestedSecurityToken/*).

Voorbeeld RSTR

1
2
3
4
5
6
7
8
9
10
11
12
13
<wst:RequestSecurityTokenResponse Context = "RC-938ae2a2-6839-41ee-9c0e-7eab62a5a748" xmlns:wst = "http://docs.oasis-open.org/ws-sx/ws-trust/200512" > 
    <wst:RequestedSecurityToken> 
        <Assertion AssertionID = "_4d2f2572befc1c6a70493a35d3618c66" IssueInstant = "2022-12-16T07:46:12.258Z" Issuer = "urn:be:fgov:ehealth:sts:1_0" MajorVersion = "1" MinorVersion = "1"
        xmlns = "urn:oasis:names:tc:SAML:1.0:assertion"> 
            <Conditions NotBefore="2022-12-16T06:25:10.000Z" NotOnOrAfter="2022-12-16T07:30:10.000Z"/> 
            <AuthenticationStatement AuthenticationInstant = "2022-12-16T07:46:12.258Z" AuthenticationMethod = "urn:oasis:names:tc:SAML:1.0:am:X509-PKI" > ...</AuthenticationStatement>
            <AttributeStatement>...</AttributeStatement>
            <ds:Signature xmlns:ds = "http://www.w3.org/2000/09/xmldsig#" >...</ds:Signature>
        </Assertion>
    </wst:RequestedSecurityToken>
</wst:RequestSecurityTokenResponse>

 

De attributen in het token worden geëvalueerd tijdens de toegangscontrole (autorisatie) van de business diensten. De XML structuur is digitaal ondertekend door STS om de authenticiteit ervan te garanderen. Het blok Conditions geeft aan in welke periode het SAML token kan herbruikt worden door de consumer.

Stap 3

Met een SAML token ontvangen van STS kan de consumer gedurende de geldigheidsperiode van het token meerdere business diensten oproepen.

De wsse:Security header bevat volgende onderdelen:

  1. saml:Assertion is het door STS ondertekende SAML-token. De xml-data mogen niet worden gewijzigd (geen formattering, geen namespace-wijzigingen), anders wordt de digitale handtekening gebroken.
  2. wsu:Timestamp met maximale geldigheid van 5 minuten.
  3. ds:Signature met digitale handtekening over TMS en soapenv:Body. Elk blok wordt gecanonicaliseerd (Exclusive) en gehasht (SHA-256).

    De handtekening zelf is van het type :

    RSA-SHA256 (voor een certificaat met RSA-vercijfering - <ds:SignatureMethod     Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>)
    of
    ECDSA-SHA256 (voor een certificaat ECC - <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256"/>).

    De ds:KeyInfo verwijst naar de saml:Assertion op basis van de AssertionID.

 

Voorbeeld met PlatformIntegrationConsumerTest (vereenvoudigd)

De operatie checkBrokeredAccess van PlatformIntegrationConsumerTest vereist een SAML-token van STS. U test hiermee dat het token verkregen van STS in stap 2 correct gekopieerd wordt in de oproep naar de business webservice.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:be:fgov:ehealth:platformintegrationconsumertest:v1"
xmlns:urn1="urn:be:fgov:ehealth:platformintegrationconsumertest:types:v1"> 
    <soapenv:Header> 
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-
        utility - 1.0.xsd ">
            <Assertion AssertionID="_c0773aaeca35a5e45d14c6a08015fba1" IssueInstant="2022-12-16T08:08:57.482Z"
                       Issuer="urn:be:fgov:ehealth:sts:1_0" MajorVersion = "1"
            MinorVersion="1" xmlns="urn:oasis:names:tc:SAML:1.0:assertion" > 
                <Conditions NotBefore="2022-12-16T08:03:57.466Z" NotOnOrAfter="2022-12-16T09:13:57.466Z"/> 
                <AuthenticationStatement AuthenticationInstant = "2022-12-16T08:08:57.482Z" AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:X509-PKI" > ...</AuthenticationStatement>
                <AttributeStatement>...</AttributeStatement>
                <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
            </Assertion>
            <ds:Signature Id="SIG-FC77E2C72083DA8E0F16711781375072917" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                        <ec:InclusiveNamespaces PrefixList="soapenv urn urn1" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                    </ds:CanonicalizationMethod>
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                    <ds:Reference URI="#id-FC77E2C72083DA8E0F16711781375072916">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                                <ec:InclusiveNamespaces PrefixList="urn urn1" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                            </ds:Transform>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                        <ds:DigestValue>irwe7OSrrEbfPRL5Ah7Jo1T/oux5XNSj6S/H57QDEgI=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#TS-FC77E2C72083DA8E0F16711781373312907">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                                <ec:InclusiveNamespaces PrefixList="wsse soapenv urn urn1" xmlns:ec="http://www.w3.org/2001/10/xml-excc14n#"/>
                            </ds:Transform>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                        <ds:DigestValue>s3bZR8dkKVkxgQ2E/+c7654gyAH90KVK2BfgYqtUIB4=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>Kc7YG...pRI7A==</ds:SignatureValue>
                <ds:KeyInfo Id="KI-FC77E2C72083DA8E0F16711781375072914">
                    <wsse:SecurityTokenReference wsse11:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1"
                      wsu:Id="STRFC77E2C72083DA8E0F16711781375072915"
                      xmlns:wsse11 = "http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd" > 
                        <wsse:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID">_c0773aaeca35a5e45d14c6a08015fba1</wsse:KeyIdentifier>
                    </wsse:SecurityTokenReference>
                </ds:KeyInfo>
            </ds:Signature>
            <wsu:Timestamp wsu:Id="TS-FC77E2C72083DA8E0F16711781373312907">
                <wsu:Created>2022-12-16T08:08:57.331 Z</wsu:Created>
                <wsu:Expires>2022-12-16T08:09:57.331Z</wsu:Expires>
            </wsu:Timestamp>
        </wsse:Security>
    </soapenv:Header>
    <soapenv:Body wsu:Id="id-FC77E2C72083DA8E0F16711781375072916" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <urn:CheckBrokeredAccessControlRequest>
            <urn1:Message>Hello World</urn1:Message>
            <urn1:Timestamp>2014-12-30T15:29:03.157+01:00</urn1:Timestamp >
        </urn:CheckBrokeredAccessControlRequest>
    </soapenv:Body>
</soapenv:Envelope>

 

Veiligheid - TLS verbinding

Op transportniveau moet de service consumer verplicht een TLS -verbinding maken. Daardoor is hij zeker van de identiteit van de serviceprovider (SOA-platform) en worden gegevens in transit beveiligd door encryptie.

De servercertificaten van het SOA-platform zijn gevalideerd door het  Sectigo ( wcag.label.externalLink)  en moeten door de service consumer aanvaard worden.

Chaining

1
2
3
Sectigo (AAA) 
|_ USERTRUST RSA CERTIFICATION AUTHORITY
    |_GEANT OV RSA CA 4

 

of

Chaining

1
2
USERtrust RSA Certification Authority (avec le nom amical «SECTIGO») 
|_ |_GEANT OV RSA CA 4

 

Download de zip met de Sectigo-certificaten (wcag.label.file wcag.label.externalLink)

Opgelet: de servercertificaten worden op regelmatige basis vernieuwd, en dat geldt ook voor de CA die de certificaten uitgeeft.

Ter informatie: de acceptatieomgeving ( wcag.label.externalLink) is bedoeld voor het uitvoeren van testen voordat de productieomgeving wordt gebruikt.

U kunt de certificaten downloaden met een browser of via het openssl-commando:

1
>> openssl s_client -showcerts -connect services.ehealth.fgov.be:443

Voorbeeld met PlatformIntegrationConsumerTest

De eerste operatie van PlatformIntegrationConsumerTest (checkConnection) heeft geen beveiling op message-niveau en daarom geen wsse:Security-blok in de SOAP header. U test hiermee de SSL/TLS verbinding met het SOA platform.

1
2
3
4
5
6
7
8
9
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:be:fgov:ehealth:platformintegrationconsumertest:v1"
xmlns:urn1="urn:be:fgov:ehealth:platformintegrationconsumertest:types:v1">
    <soapenv:Header/>
    <soapenv:Body>
        <urn:CheckConnectionRequest>
            <urn1:Message>Hello World</urn1:Message>
            <urn1:Timestamp>2014-12-30T15:29:03.157+01:00</urn1:Timestamp>
        </urn:CheckConnectionRequest>
    </soapenv:Body>
</soapenv:Envelope