Ce référentiel est passé à https://codeberg.org/hohlerde/netebics
Il s'agit d'une bibliothèque client mettant en œuvre le protocole EBIC pour les services bancaires en ligne d'entreprise.
La bibliothèque est écrite en C # (7.2) à l'aide de .NET Core 2.x et a été testée avec des touches privées / publiques (fichiers PEM) sur Linux / Windows.
NETEBICS est un logiciel Alpha et ne doit pas être utilisé pour la production . L'API / les changements de rupture sont très probables.
NETEBICS est dépendant des bibliothèques suivantes:
NETEBICS n'utilise pas d'injection de dépendance. Voir le fichier CSPROJ pour plus d'informations.
À l'heure actuelle, il n'y a pas de packages NuGet officiels disponibles, vous devez donc créer la bibliothèque par vous-même en clonage ce référentiel.
Assurez-vous que le SDK .NET Core SDK version 2 ou supérieur est installé.
Clone le référentiel.
git clone https://github.com/hohlerde/NetEbics.git
Construire la bibliothèque.
cd NetEbics
dotnet pack -c Release
Vous trouverez le package NuGet sous bin/Release .
Afin d'utiliser la bibliothèque, vous devriez avoir une bonne compréhension raisonnable du protocole EBICS.
La première chose que vous voulez faire en tant qu'utilisateur EBIC est d'annoncer vos clés RSA publiques à votre banque. Vous devez créer trois paires de clés publiques / privées pour cela (clés d'authentification, de signature et de chiffrement).
La création des clés est facile avec Bouncycastle.
var gen = GeneratorUtilities . GetKeyPairGenerator ( "RSA" ) ;
gen . Init ( new KeyGenerationParameters ( new SecureRandom ( ) , 4096 ) ) ;
var signKeyPair = gen . GenerateKeyPair ( ) ;
using ( TextWriter sw = new StreamWriter ( "sign.key" ) )
{
var pw = new PemWriter ( sw ) ;
pw . WriteObject ( signKeyPair ) ;
sw . Flush ( ) ;
}Ajustez le code ci-dessus et créez également une clé d'authentification ("Auth.Key") et de cryptage ("ENC.Key").
Annoncez votre clé de signature publique de votre banque. Notez que les clés générées précédemment sont stockées au format PEM et contiennent la clé privée et publique.
AsymmetricCipherKeyPair signKey ;
using ( var sr = new StringReader ( File . ReadAllText ( "sign.key" ) . Trim ( ) ) )
{
var pr = new PemReader ( sr ) ;
signKey = pr . ReadObject ( ) ;
}
var signCert = KeyUtils . CreateX509Certificate2 ( signKey ) ;
var client = EbicsClient . Factory ( ) . Create ( new EbicsConfig
{
Address = "The EBICS URL you got from your bank, i.e. https://ebics-server.com/" ,
Insecure = true ,
TLS = true ,
User = new UserParams
{
HostId = "The host ID of your bank" ,
PartnerId = "Your partner ID you got from your bank" ,
UserId = "Your user ID you got from your bank" ,
SignKeys = new SignKeyPair
{
Version = SignVersion . A005 , // only A005 is supported right now
TimeStamp = DateTime . Now ,
Certificate = signCert // internally we work with keys
}
}
} ) ;
var resp = c . INI ( new IniParams ( ) ) ;Après cela, nous devons annoncer les clés d'authentification et de cryptage publiques.
// loading of keys "auth.key" and "enc.key" omitted
var authCert = KeyUtils . CreateX509Certificate2 ( authKey ) ;
var encCert = KeyUtils . CreateX509Certificate2 ( encKey ) ;
var client = EbicsClient . Factory ( ) . Create ( new EbicsConfig
{
Address = "The EBICS URL you got from your bank, i.e. https://ebics-server.com/" ,
Insecure = true ,
TLS = true ,
User = new UserParams
{
HostId = "The host ID of your bank" ,
PartnerId = "Your partner ID" ,
UserId = "Your user ID" ,
AuthKeys = new AuthKeyPair
{
Version = AuthVersion . X002 ,
TimeStamp = DateTime . Now ,
Certificate = authCert
} ,
CryptKeys = new CryptKeyPair
{
Version = CryptVersion . E002 ,
TimeStamp = DateTime . Now ,
Certificate = encCert
}
}
} ) ;
var resp = c . HIA ( new HiaParams ( ) ) ;Annoncer les clés ne suffit pas, car la banque doit être sûre que les clés vous appartiennent vraiment. Pour prouver cela, vous devez envoyer les lettres INI et HIA à votre banque. Ils contiennent des valeurs de hachage de vos clés publiques et de votre signature écrite. La spécification EBICS décrit en détail à quoi devraient ressembler ces lettres.
Afin de communiquer via EBIC avec la banque, vous avez besoin des clés publiques de la banque, car les données échangées doivent être cryptées et authentifiées.
// loading of keys "auth.key" and "enc.key" omitted
var authCert = KeyUtils . CreateX509Certificate2 ( authKey ) ;
var encCert = KeyUtils . CreateX509Certificate2 ( encKey ) ;
var client = EbicsClient . Factory ( ) . Create ( new EbicsConfig
{
Address = "The EBICS URL you got from your bank, i.e. https://ebics-server.com/" ,
Insecure = true ,
TLS = true ,
User = new UserParams
{
HostId = "The host ID of your bank" ,
PartnerId = "Your partner ID" ,
UserId = "Your user ID" ,
AuthKeys = new AuthKeyPair
{
Version = AuthVersion . X002 ,
TimeStamp = DateTime . Now ,
Certificate = authCert
} ,
CryptKeys = new CryptKeyPair
{
Version = CryptVersion . E002 ,
TimeStamp = DateTime . Now ,
Certificate = encCert
}
}
} ) ;
var hpbResp = c . HPB ( new HpbParams ( ) ) ;
if ( hpbResp . TechnicalReturnCode != 0 || hpbResp . BusinessReturnCode != 0 )
{
// handle error
return ;
}
c . Config . Bank = resp . Bank ; // set bank's public keys
// now issue other commands // loading of keys "auth.key", "enc.key" and "sign.key" omitted
var authCert = KeyUtils . CreateX509Certificate2 ( authKey ) ;
var encCert = KeyUtils . CreateX509Certificate2 ( encKey ) ;
var signCert = KeyUtils . CreateX509Certificate2 ( signKey ) ;
var client = EbicsClient . Factory ( ) . Create ( new EbicsConfig
{
Address = "The EBICS URL you got from your bank, i.e. https://ebics-server.com/" ,
Insecure = true ,
TLS = true ,
User = new UserParams
{
HostId = "The host ID of your bank" ,
PartnerId = "Your partner ID" ,
UserId = "Your user ID" ,
AuthKeys = new AuthKeyPair
{
Version = AuthVersion . X002 ,
TimeStamp = DateTime . Now ,
Certificate = authCert
} ,
CryptKeys = new CryptKeyPair
{
Version = CryptVersion . E002 ,
TimeStamp = DateTime . Now ,
Certificate = encCert
} ,
SignKeys = new SignKeyPair
{
Version = SignVersion . A005 ,
TimeStamp = DateTime . Now ,
Certificate = signCert
}
}
} ) ;
var hpbResp = c . HPB ( new HpbParams ( ) ) ;
if ( hpbResp . TechnicalReturnCode != 0 || hpbResp . BusinessReturnCode != 0 )
{
// handle error
return ;
}
c . Config . Bank = resp . Bank ; // set bank's public keys
// create credit transfer data structure
var cctParams = new CctParams
{
InitiatingParty = "Your name" ,
PaymentInfos = new [ ]
{
new CreditTransferPaymentInfo
{
DebtorName = "Sender's name" ,
DebtorAccount = "Sender's IBAN" ,
DebtorAgent = "Sender's BIC" ,
ExecutionDate = "2018-05-15" ,
CreditTransferTransactionInfos = new [ ]
{
new CreditTransferTransactionInfo
{
Amount = "1.00" ,
CreditorName = "Receiver's name" ,
CreditorAccount = "Receiver's IBAN" ,
CreditorAgent = "Receiver's BIC" ,
CurrencyCode = "EUR" ,
EndToEndId = "something" ,
RemittanceInfo = "Unstructured information for receiver" ,
}
}
}
}
} ;
var cctResp = c . CCT ( cctParams ) ; Si vous n'êtes pas dans un environnement ASP.NET et que vous souhaitez voir une sortie de journal, vous pouvez par exemple activer le Serilog avec Microsoft Extensions Logging.
Log . Logger = new LoggerConfiguration ( )
. WriteTo . Console ( )
. MinimumLevel . Debug ( )
. CreateLogger ( ) ;
EbicsLogging . MethodLoggingEnabled = true ; // see entry/exit messages in log
EbicsLogging . LoggerFactory . AddSerilog ( ) ; Vous devez faire référence Serilog.Extensions.Logging et Serilog.Sinks.Console dans votre fichier csproj pour utiliser le serilog.
< ItemGroup >
< PackageReference Include = " Serilog.Extensions.Logging " Version = " 2.0.2 " />
< PackageReference Include = " Serilog.Sinks.Console " Version = " 3.1.2-dev-00771 " />
</ ItemGroup > Dans un environnement ASP.NET, il vous suffit de passer l'instance LoggerFactory que vous obtenez du conteneur d'injection de dépréciation à netebics.
public MyController ( ILoggerFactory loggerFactory )
{
EbicsLogging . MethodLoggingEnabled = true ;
EbicsLogging . LoggerFactory = loggerFactory ;
}Voir le fichier License.txt pour plus d'informations.