documentation technique de l'API Arkea openbanking : CMA - API
Renouvellement certificat
https://donjon.intra.monext.fr/heimdall/details_certificat.php?id=10872
https://donjon.intra.monext.fr/heimdall/details_certificat.php?id=10871
Avant d'installer les certificats sur nos machines, il faut se synchroniser avec Arkéa sinon l'API sera KO
Instruction Arkéa :
Pour rappel vous avez deux certificats en production pour appeler nos API dont les common Name sont :
- monext_client2_api_arkea
- monext_client1_api_arkea
Lors des appels à nos api vous avez besoin de deux informations :
- clientId : identifiant de Monext dans le proxy ARKEA
- KID : empreinte du certificat
Vous possédez deux identifiants dans le proxy ARKEA, 1 par certificat.
Pour le certificat monext_client1_api_arkea :
- clientId : CWxPGACe9FzXZ2Vpsnpdi5hHKFH36jsP
- KID : 81:AD:9F:0F:CF:33:C0:72:8F:08:F2:FB:44:95:9E:4F:06:79:DD:05:BF:0F:B1:E4:BB:4B:91:A8:35:D6:C5:15 (à remplacer par la nouvelle empreinte du certificat qui remplace monext_client1_api_arkea)
Pour le certificat monext_client2_api_arkea :
- clientId : RSBdxEimBwxc65GzMG6axga5n2ylfCke
- KID : 7F:A3:C7:2B:D5:85:E7:84:B6:DA:58:17:52:BA:9E:FA:97:B7:D2:3A:04:00:9E:BC:15:8B:DF:B9:02:A0:12:12 (à remplacer par la nouvelle empreinte du certificat qui remplace monext_client2_api_arkea)
Il va falloir recalculer le KID que vous utilisez car c'est une empreinte du certificat.
Pour calculer cette empreinte voici la commande a effectué :
- openssl x509 -fingerprint -sha256 -in VOTRE_CERTIFICAT.crt -noout
Dans cette commande il faudra remplacer VOTRE_CERTIFICAT par le nom de votre certificat. Le résultat doit avoir le même format que les KID mentionné plus haut.
Mais qu’est-ce que c'est?
Cette brique permet d'appeler des services WEB à partir d'appels RequestReply sur le MOM.
Son application principale est l’interfaçage avec les API Arkea.
Son nom dans l'interface HDCTRL est B.GTW.ARKEA
Elle traite les demandes arrivant dans la queue B.GTW.ARKEA_RR, les redirige vers les serveurs d'Arkea en ajoutant des données d'identification et de contrôle.
La signature des requêtes envoyées à Arkea se fait avec une clef privée générée par la cellule sécurité MONEXT. Les services Arkea vérifient les requêtes à l'aide de la clef public qui leur a été fournie.
Chaque client a son jeu de clefs.
Techniquement c'est une application mbs-lite dont le business se trouve ici : https://nexus.intra.monext.fr:10130/nexus/service/local/repositories/jindus-repo-ep-fingw-public/content/monext/mtf/finc/financial-gateway-business/1.0.2/financial-gateway-business-1.0.2.zip
Elle doit avoir dans son environnement ces trois variables :
| nom | valeur | description |
|---|---|---|
| JAVA_HOME | /OPT/jvm/jre-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/ | repertoire d'installation du jdk/jre |
| MBS_LITE_HOME | /USR/${USER}/jfrm-lsol-mbs-lite | repertoire de mbs-lite |
| MBS_LITE_OPTS | "-server -Xms128m -Xmx128m -Dcom.sun.management.jmxremote" | options de lancement de mbs-lite |
Les fichiers de configuration jfrm et applicatif ainsi que la création du keystore sont décrits dans la suite du document.
Service RequestDo requête :
- Demande
public class RequestDo extends RequestBean implements Serializable {
private static final long serialVersionUID = 1L;
@SpecField(description = "la plateforme a solliciter et déjà paramétrée")
public String domain;
@SpecField(description = "Dans le cas d'une plateforme multiclient, choix du client")
public String client_id;
@SpecField(description = "protocol, host et port",sampleValues = {"http://host:port"})
public String server;
@SpecField(description = "path", sampleValues = "/accounts/api/v1/persons/65922750/accounts")
public String path;
@SpecField(description = "donnees a renseigner dans le Header HTTP")
public HeaderElement[] headers;
@SpecField(description = "type)", sampleValues = {"POST","GET"})
public String type;
@SpecField(description = "body",sampleValues = {"Map","String"})
public Object body;
@SpecField(description = "chartset en entree, non encore implemente")
public String inputCharset;
@SpecField(description = "chartset en sortie")
public String outputCharset;
@SpecField(description = "content type au standard HTTP",sampleValues = {"application/json"})
public String contentType;
@SpecField(description = "version HTTP",sampleValues = {"1.1"})
public String httpVersion;
@SpecField(description = "timeout du traitement en millisecondes",sampleValues = {"10000"})
public Long timeout;
@SpecField(description = "connexion timeout en millisecondes",sampleValues = {"3000"})
public Long connectionTimeout;
@SpecField(description = "user d'authentification standard HTTP")
public String uid;
@SpecField(description = "password d'authentification standard HTTP",sensibleData = true)
public String puid;
@SpecField(description = "Est-ce que la requete nécessite une signature JWS", sampleValues = {"true", "false"})
public String needJWS;
}
- Réponse:
public class RequestDoResponse extends ResponseBean implements Serializable {
private static final long serialVersionUID = 1L;
public Object content;
public HeaderElement[] headers;
public Integer httpCode;
public String httpLabel;
}
Exemple JSON :
{
"RequestDo": {
"client_id": "kZbp4BpMu8LvL1NhPf3GEPvoGipn9a0Z",
"path": "/accounts/1A17660007/transactions",
"body": null,
"b2b": "MONEXT",
"domain": "arkeapi",
"type": "GET"
}
{
"RequestDoResponse": {
"returnCode": 0,
"returnLabel": "success",
"returnPid": "191015T065101892S00156801",
"returnModId": "B.GTW.ARKEA(R01)",
"b2b": "MONEXT",
"content": {
"errordate": "2019-10-15T08:51:02.78214",
"fishtag": "AmariePourpre531",
"url": "/account-api/api/v1/accounts/1A17660007/transactions",
"httpcode": 404,
"messages": [
{
"level": "ERROR",
"message": "Account 1A17660007 not found",
"code": "ACCOUNT_NOT_FOUND"
}
]
},
"headers": [
{
"name": "Date",
"value": "Tue, 15 Oct 2019 06:51:02 GMT"
},
{
"name": "Content-Type",
"value": "application/json;charset=UTF-8"
},
{
"name": "Content-Length",
"value": "245"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "X-Arkea-Methodes-Process-Time",
"value": "267"
},
{
"name": "X-Arkea-Methodes-Fishtag",
"value": "AmariePourpre531"
},
{
"name": "X-Content-Type-Options",
"value": "nosniff"
},
{
"name": "X-XSS-Protection",
"value": "1; mode=block"
},
{
"name": "Cache-Control",
"value": "no-cache, no-store, max-age=0, must-revalidate"
},
{
"name": "Pragma",
"value": "no-cache"
},
{
"name": "Expires",
"value": "0"
},
{
"name": "X-Frame-Options",
"value": "DENY"
},
{
"name": "Server",
"value": "ARandomServer"
}
],
"httpCode": 404,
"httpLabel": ""
}
}
Installation MBSLite
L'installation doit donc débuter par celle de MBSLite en dernière version: Installation MBSLite
Nb: il faut allouer 512m à la jvm dans .ENVIRON: export MBS_LITE_OPTS="-server -Xms512m -Xmx512m -Dcom.sun.management.jmxremote"
Installation de l'application
L'installation de l'application se fait directement via MBSLite après avoir valorisé les éléments ci-dessous dans jfrm-lsol-mbs-lite/conf/jfrm-jvmprops.properties
NEXUS.REPO=jindus-repo-ep-fingw-public NEXUS.GID=monext.mtf.finc NEXUS.AID=financial-gateway-business NEXUS.TYPE=zip
Nb: il faut valoriser manuellement la version de l'application, qui est actuellement 1.0.2
Configuration
Fichier des propriétés du jfrm a adapter a l'environnement
APP.CONF=B.GTW.ARKEA@RENNES_PROD_1,port=11001,shutdown_wait=5 APP.MOM=user=b-gtw-arkea,password=secret keystore.props.file=/USR/epgtwr/jfrm-lsol-mbs-lite/conf/financial-gtw.keystore
Fichier de configuration des clients dont le chemin d' accès et le nom sont indiques dans le fichier des propriétés du jfrm (jfrm-lsol-mbs-lite/conf/jfrm-jvmprops.properties).
| nom | valeur | description |
|---|---|---|
| CONFIG.default.timeout | 30000 | délai d'attente en ms d'une réponse suite a une demande au service API Arkea |
| CONFIG.default.connectionTimeout | 3000 | delai d'attente en ms avant de de déclarer une connexion au service API Arkea hots délai |
| CONFIG.default.httpVersion | 1.1 | Version du protocole http a utiliser |
| ONFIG.default.jws.keystore.name | keystore.jks | nom du keystore de stockage des clefs privées (type jceks) |
| CONFIG.default.jws.keystore.password | secret | mot de passe d’accès au keystore et aux clefs |
| CONFIG.default.jws.keystore.type | jkcse | type du keystore, si omis valeur de keystore.type dans le fichier jre/lib/security/java.security |
| CONFIG.default.api.client.id | N/A | identifiant client a utiliser si il n'est pas spécifié dans une demande |
| CONFIG.default.api.audience | arkeapi | paramètre audience utilisé pour la création des JWS |
| CONFIG.default.api.issuer | Monext-PROD | paramètre issuer utilisé pour la création des JWS |
| CONFIG.default.api.need.token | true | booléen indiquant si il faut demander un token pour accéder au service API Arkea |
| CONFIG.default.api.need.jws | true | booléen indiquant si il faut ajouter une signature JWS pour chaque appel au service API Arkea |
| CONFIG.default.api.host.header | api-arkea-monext.s.arkea.com | Valeur de l'entete http Host a fournir |
| CONFIG.noclient1.jws.key.alias | donnée par Arkea | noclient1 est une valeur fournie par Arkea la valeur correspond au key-id du JWS |
| CONFIG.arkeapi.token.ttl | 10 | Durée de vie du token retournée par le service API Arkea, en secondes. Un décalage de temps sur les serveurs du service API Arkea invalide un token alors qu'il est encore valide. |
| CONFIG.default.autorisation.url | https://10.249.180.132:8443/oauth-clientjwt/token | Url a appeler pour obtenir un token d’accès au service API Arkea |
| CONFIG.default.url | https://10.249.176.132:8443 | Url D’accès au service API Arkea |
| CONFIG.default.path.prefix.jws | /pi | Préfixe utilisé pour construire le path dans le JWS |
| CONFIG.default.path.prefix.url | /pi | Préfixe utilisé pour construire le path de la requête d’accès au service API Arkea |
#paramétrage générique #délai d'attente d'une réponse suite à l’émission d'une demande CONFIG.default.timeout=30000 #délai de connexion au service CONFIG.default.connectionTimeout=3000 #version du protocole http CONFIG.default.httpVersion=1.1 #nom du keystore java, stockage de la clef privée et du certificat associé CONFIG.default.jws.keystore.name=keystore.jks CONFIG.default.jws.keystore.password=secret CONFIG.default.jws.keystore.type=jceks #client par defaut si il n'est pas indiqué dans la requête CONFIG.default.api.client.id=noclient1 CONFIG.default.api.audience=arkeapi #Config de production CONFIG.default.api.issuer=Monext-PROD #est-ce qu'il faut demander un token d’accès au service ? Par défaut oui. CONFIG.default.api.need.token=true #est-ce au'il faut signer la requete avec une signature JWS/JWT ? Par défaut oui. CONFIG.default.api.need.jws=true #entête host de la requête http #recette / integration CONFIG.default.api.host.header=api-arkea-monext.hml.s.arkea.com #production CONFIG.default.api.host.header=api-arkea-monext.s.arkea.com #alias dans le keystore Arka (key-id) , si absent c'est le fingerprint sha256 du certificat qui est utilisé CONFIG.noclient1.jws.key.alias=FD3D1BB88FE3346769F19494282CAC653FAE31163322DCB54B7EE78AB4F7E35A CONFIG.noclient2.jws.key.alias=8D3D1BB88FE3346769F19494282CAC653FAE31163322DCB54B7EE78AB4F7E353 #durée de vie du token retournée par l'API Arkea avant demande de renouvellement #augmenter cette valeur pour diminuer les demandes d'autorisation d’accès au service #la duree de vie associée au token retourne n'est pas fiable CONFIG.arkeapi.token.ttl=10 #url du service d’obtention du token d’accès CONFIG.default.autorisation.url=https://10.249.176.132:8443/oauth-clientjwt/token #url du service Arkeapi (adresse sur Brest epa2p1 : 10.49.180.132) CONFIG.default.url=https://10.249.180.132:8443 #préfixe utilisé pour la génération du JWS CONFIG.default.path.prefix.jws=/pi #préfixe d’accès au service #path final = CONFIG.default.path.prefix.url + path CONFIG.default.path.prefix.url=/pi #paramétrage facultatif #CONFIG.default.proxy.uid= #CONFIG.default.proxy.puid= #CONFIG.default.proxy.host=localhost #CONFIG.default.proxy.port=3128
Génération du keystore
Le keystore héberge les clefs privées qui servent a chiffrer les JWS. Chaque client a la sienne, elle est identifiée, dans le keystore, grâce a un alias dont la valeur est le client-id.
Les mots de passe utilisés pour le keystore et les clefs privées doivent être identiques.
Une clef privée et son certificat sont livrés au format PEM, il faut passer par un format intermédiaire PKCS12 pour les importer dans un keystore java. L'alias dans le keystore de cette clef est le numéro du client (client-id).
Dans l'exemple le type du keystore est jceks, mail il est possible d'utiliser un format standard comme pkcs12, dans ce cas il faut modifier le fichier de configuration financial-gtw.keystore (CONFIG.default.jws.keystore.type) et le paramètre -deststoretype de la commande keytool.
Voici la liste des commandes :
# gtw-monext-rec.crt et gtw-monext-rec.key sont des fichiers fournis par le service idoine, # le clientt-id est kZbp4BpMu8LvL1NhPf3GEPvoGipn9a0Z # generation du fingerprint qu'il faudra mettre dans le fichier financial-gtw.keystore section alias # il faudra que Arkea utilise l'une ou l'autre des méthodes # premiere methode openssl x509 -noout -fingerprint -sha256 -inform pem -in gtw-monext-rec.crt | cut -f 2 -d= | tr -d : A2AB991BA1B72E1509FE05E5C259440405CB06B2B1346650DE942C40209EABD5 # dans le fichier financial-gtw.keystore # ajouter CONFIG.kZbp4BpMu8LvL1NhPf3GEPvoGipn9a0Z.jws.key.alias=A2AB991BA1B72E1509FE05E5C259440405CB06B2B1346650DE942C40209EABD5 # seconde méthode cat gtw-monext-rec.crt | openssl dgst -sha256 | cut -f 2 -d= | tr [a-z] [A-Z] 8D3D1BB88FE3346769F19494282CAC653FAE31163322DCB54B7EE78AB4F7E353 # dans le fichier financial-gtw.keystore # ajouter CONFIG.kZbp4BpMu8LvL1NhPf3GEPvoGipn9a0Z.jws.key.alias=8D3D1BB88FE3346769F19494282CAC653FAE31163322DCB54B7EE78AB4F7E353 # Generation du fichier pkcs12 qui sera importe dans le keystore java # attention au mot de passe openssl pkcs12 -export -in gtw-monext-rec.crt -inkey gtw-monext-rec.key -name kZbp4BpMu8LvL1NhPf3GEPvoGipn9a0Z -out gtw-monext-rec.p12 keytool -importkeystore -srckeystore gtw-monext-rec.p12 -destkeystore keystore.jks -deststoretype jceks -srcstoretype pkcs12 -srcalias kZbp4BpMu8LvL1NhPf3GEPvoGipn9a0Z -destkeypass secret
Livraison
Le livrables(financial-gateway-business) se trouvent ici https://nexus.intra.monext.fr:10130/nexus/index.html#nexus-search;quick~financial-gateway :
Les builds jenkins disponibles ici https://jenkins.intra.monext.fr:10006/jenkins/job/ep-financial-folder/ :
Les sources soit ici https://git.intra.monext.fr:8443/socle/financial/financial-gateway:



0 commentaires