OG-EP Référentiel
Raccourcis espace
OG-EP Référentiel OGEPREF

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 :

nomvaleurdescription
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  :

REQUETE
{
  "RequestDo": {
    "client_id": "kZbp4BpMu8LvL1NhPf3GEPvoGipn9a0Z",
    "path": "/accounts/1A17660007/transactions",
    "body": null,
    "b2b": "MONEXT",
    "domain": "arkeapi",
    "type": "GET"
 }
REPONSE
{
    "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

Paramétrage pour déploiement via MBSLite : 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

jfrm-jvmprops.properties
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).

nomvaleurdescription
CONFIG.default.timeout30000délai d'attente en ms d'une réponse suite a une demande au service API Arkea
CONFIG.default.connectionTimeout3000delai d'attente en ms avant de de déclarer une connexion au service API Arkea hots délai
CONFIG.default.httpVersion1.1Version du protocole http a utiliser
ONFIG.default.jws.keystore.namekeystore.jksnom du keystore de stockage des clefs privées (type jceks)
CONFIG.default.jws.keystore.passwordsecretmot de passe d’accès au keystore et aux clefs
CONFIG.default.jws.keystore.typejkcse

type du keystore, si omis valeur de keystore.type

dans le fichier jre/lib/security/java.security

CONFIG.default.api.client.idN/Aidentifiant client a utiliser si il n'est pas spécifié dans une demande
CONFIG.default.api.audiencearkeapiparamètre audience utilisé pour la création des JWS
CONFIG.default.api.issuerMonext-PRODparamètre issuer utilisé pour la création des JWS
CONFIG.default.api.need.tokentruebooléen indiquant si il faut demander un token pour accéder au service API Arkea
CONFIG.default.api.need.jwstruebooléen indiquant si il faut ajouter une signature JWS pour chaque appel au service API Arkea
CONFIG.default.api.host.headerapi-arkea-monext.s.arkea.comValeur de l'entete http Host a fournir
CONFIG.noclient1.jws.key.aliasdonnée par Arkeanoclient1 est une valeur fournie par Arkea la valeur correspond au key-id du JWS
CONFIG.arkeapi.token.ttl10

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.urlhttps://10.249.180.132:8443/oauth-clientjwt/token

Url a appeler pour obtenir un token d’accès au service API Arkea

CONFIG.default.urlhttps://10.249.176.132:8443Url D’accès au service API Arkea
CONFIG.default.path.prefix.jws/piPréfixe utilisé pour construire le path dans le JWS
CONFIG.default.path.prefix.url/piPréfixe utilisé pour construire le path de la requête d’accès au service API Arkea
Exemple de fichier financial-gtw.keystore
#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 :

Creation keystore
# 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:



  • Aucune étiquette
Écrire un commentaire...
OG-EP Référentiel OGEPREF