Votre navigateur ne prend pas en charge le javascript, dès lors, certaines fonctionnalités ne sont pas disponibles
Échanger des données via des services web

Informations techniques

Sécurité - WS-Security SAML Token Profile / Holder-of-Key

L’ensemble des services de la plateforme SOA (à l’exception du service SecurityTokenService) doivent être appelé avec un token SAML reçu par un service central d’authentification : SecurityTokenService (STS) en suivant le standard de OASIS WS-Trust.

Le processus d’authentification se passe comme ceci :

  1. Le service client s’authentifie une fois à STS avec un certificat X.509.
  2. Il obtient de STS un token signé SAML qui reste valide durant 1 heure.
  3. Avec ce token, le client peut appeler différents webservices pendant une heure.

Par un claim, le client indique pour quelle entreprise et qualité il souhaite agir. Le claim correspond au numéro d’expéditeur obtenu lors de l’activation de du canal webservice.

Pour information: le mécanisme de STS doit être implémenté avant de pouvoir appeler un service business.

Etape par étape

Etape 1

Le service consumer envoie un RequestSecurityToken (RST) au STS avec la demande d'obtenir un token SAML 1.1. Le numéro d'expéditeur est spécifié comme « claim » afin d'indiquer pour quelle entreprise et qualité le service consumer souhaite demander un token. Le service consumer signe la SOAP request suivant la x.509 _SHA256 security policy. Le certificat utilisé doit correspondre au certificat chargé antérieurement dans la Gestion des accès.

Exemple RST

                    <wst:RequestSecurityToken xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512" xmlns:auth="http://schemas.xmlsoap.org/ws/2006/12/authorization">
                        <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://schemas.xmlsoap.org/ws/2006/12/authorization/authclaims">
                                <auth:ClaimType Uri="urn:be:smals:expeditor:number">
                                    <auth:Value>987654</auth:Value>
                                </auth:ClaimType>
                            </wst:Claims>
                    </wst:RequestSecurityToken>
                  

Etape 2

Après authentification, le STS répondra par une RequestSecurityTokenResponse (RSTR) qui contient le token SAML demandé. La SAML assertion peut être filtrée avec xpath (//soapenv:Body/wst:RequestSecurityTokenResponse/wst:RequestedSecurityToken/*).

Exemple RSTR

                    <wst:RequestSecurityTokenResponse xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
                        xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
                        xmlns:auth="http://schemas.xmlsoap.org/ws/2006/12/authorization">
                        <wst:TokenType>http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1 </wst:TokenType>
                            <wst:RequestedSecurityToken>
                                <saml:Assertion xmlns="" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" 
                                    xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" 
                                    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"  
                                    AssertionID="ID_00827a34-1eec-4bf4-a7bf-1c45b1bc2d61"  IssueInstant="2011-07-07T10:02:04.685Z"  
                                    Issuer="http://services.socialsecurity.be/sts"  
                                    MajorVersion="1" MinorVersion="1"  
                                    wsu:Id="ID_00827a34-1eec-4bf4-a7bf-1c45b1bc2d61">
                                    <saml:Conditions NotBefore="2011-07-07T10:02:04.538Z" NotOnOrAfter="2011-07-07T11:02:04.538Z"/>
                                    <saml:AuthenticationStatement AuthenticationInstant="2011-07-07T10:02:04.685Z" 
                                    AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:X509-PKI"> ... </saml:AuthenticationStatement>
                                    <saml:AttributeStatement> ... </saml:AttributeStatement>
                                    <dsig:Signature  xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">... </dsig:Signature>
                                </saml:Assertion>
                            </wst:RequestedSecurityToken>
                            <wst:Lifetime>
                                <wsu:Created>2011-07-07T10:02:04.538Z</wsu:Created>
                                <wsu:Expires>2011-07-07T11:02:04.538Z</wsu:Expires>
                            </wst:Lifetime>
                    </wst:RequestSecurityTokenResponse>
                  

Le token SAML contient tous les attributs qui identifient le service consumer (numéro d’entreprise, qualité, numéro d'expéditeur).

Ces attributs sont évalués durant le contrôle d'accès du service business (autorisation). La structure XML est signée numériquement par le STS pour garantir l'authenticité. Le bloc wst:Lifetime indique dans quelle période le token SAML peut être réutilisé par le service consumer.

Etape 3

Avec un token SAML reçu du STS, le consumer peut invoquer plusieurs services business durant une heure.

Le header wsse:Security contient les parties suivantes :

  1. saml:Assertion est le token SAML signé par le STS. Les données xml ne peuvent pas être modifiées (pas de formatage, pas de modifications à l'espace de noms), sans quoi la signature numérique sera cassée.
  2. wsu:Timestamp d'une validité maximale de 5 minutes.
  3. ds:Signature avec signature numérique sur TMS et soapenv:Body. Chaque bloc est canonisé (Exclusive) et haché (SHA1). La signature même est du type RSA-SHA1. Le ds:KeyInfo réfère au saml:Assertion sur la base du AssertionID.

Note: Pour l'instant c'est pas possible de tester l'étape 3 en SoapUI 5.0. Dans WS-Security Configurations > Signature, il n'y a pas moyen de choisir l'assertion SAML comme Key Identifier Type.

Exemple de service business (simplifié)

La troisième opération de PICT (checkBrokeredAccess) nécéssite un token SAML de STS. Le but de l'opération est de copier le token SAML précédemment récupéré de l'étape 2 dans la requête vers le webservice business.

                    <soapenv:Envelope>
                        <soapenv:Header>
                            <wsse:Security>
                                <saml:Assertion AssertionID="ID_56eecf2a-a143-4ec9-ab85-479d8602122f" 
                                	IssueInstant="2011-07-07T07:15:16.772Z" 
                                    Issuer="http://services.socialsecurity.be/sts" 
                                    MajorVersion="1" 
                                    MinorVersion="1" 
                                    wsu:Id="ID_56eecf2a-a143-4ec9-ab85-479d8602122f">
                                    <saml:Conditions NotBefore="2011-07-07T07:15:16.619Z" 
                                    NotOnOrAfter="2011-07-07T08:15:16.619Z"/>
                                    <saml:AuthenticationStatement AuthenticationInstant="2011-07-07T07:15:16.772Z" 
                                    AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:X509-PKI"> ... </saml:AuthenticationStatement>
                                    <saml:AttributeStatement> ... </saml:AttributeStatement>
                                    <dsig:Signature> ... </dsig:Signature>
                                </saml:Assertion>
                                <wsu:Timestamp  wsu:Id="Timestamp">
                                    <wsu:Created>2011-07-07T07:15:17Z</wsu:Created>
                                    <wsu:Expires>2011-07-07T07:16:17Z</wsu:Expires>
                                </wsu:Timestamp>
                                <ds:Signature>
                                    <ds:SignedInfo>
                                        <ds:CanonicalizationMethod Algorithm="xml-exc-c14n#"/>
                                        <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                                        <ds:Reference URI="#id">
                                            <ds:Transforms>
                                                <ds:Transform Algorithm="xml-exc-c14n#"/>
                                            </ds:Transforms>
                                            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                                            <ds:DigestValue>di3JiPJM90D3P62ChO1d4Sy12+4=</ds:DigestValue>
                                        </ds:Reference>
                                        <ds:Reference URI="#Timestamp">
                                            <ds:Transforms>
                                                <ds:Transform Algorithm="xml-exc-c14n#"/>
                                            </ds:Transforms>
                                            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                                            <ds:DigestValue>C+GkwwH5RuXocsD0iphwUvmQpj0=</ds:DigestValue>
                                        </ds:Reference>
                                    </ds:SignedInfo>
                                    <ds:SignatureValue>kq+FG6qqdx...==</ds:SignatureValue>
                                    <ds:KeyInfo>
                                        <wsse:SecurityTokenReference>
                                            <wsse:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID">ID_56eecf2a-a143-4ec9-ab85-479d8602122f</wsse:KeyIdentifier>
                                        </wsse:SecurityTokenReference>
                                    </ds:KeyInfo>
                            	</ds:Signature>
                            </wsse:Security>
                        </soapenv:Header>
                        <soapenv:Body wsu:Id="id">
                            <pict:CheckBrokeredAccessControlRequest>
                                <type:Message>echo 7c83de86-d94d-499b-a4d6-cc9cc44c9719</type:Message>
                                <type:Timestamp>2010-12-23T15:12:07.821+01:00</type:Timestamp>
                            </pict:CheckBrokeredAccessControlRequest>
                        </soapenv:Body>
                    </soapenv:Envelope>