انتقل هذا المستودع إلى https://codeberg.org/hohlerde/netebics
هذه مكتبة عميل تنفذ بروتوكول EBICS للخدمات المصرفية عبر الإنترنت.
المكتبة مكتوبة في C# (7.2) باستخدام .NET Core 2.x وتم اختبارها باستخدام المفاتيح الخاصة/العامة (ملفات PEM) على Linux/Windows.
Netebics هو برنامج ألفا ويجب عدم استخدامه للإنتاج . من المحتمل جدًا أن تتغير API/كسر التغييرات.
Netebics هو DENPendent على المكتبات التالية:
لا يستخدم Netebics حقن التبعية. راجع ملف CSPROJ لمزيد من المعلومات.
في الوقت الحالي ، لا توجد حزم Nuget رسمية متاحة ، لذلك يجب عليك إنشاء المكتبة بنفسك عن طريق استنساخ هذا المستودع.
تأكد من أن لديك .NET Core SDK الإصدار 2 أو أعلى مثبت.
استنساخ المستودع.
git clone https://github.com/hohlerde/NetEbics.git
بناء المكتبة.
cd NetEbics
dotnet pack -c Release
ستجد حزمة Nuget تحت bin/Release .
من أجل استخدام المكتبة ، يجب أن يكون لديك فهم جيد معقول لبروتوكول EBICS.
أول شيء تريد القيام به كمستخدم جديد لـ EBICS هو الإعلان عن مفاتيح RSA العامة لبنكك. تحتاج إلى إنشاء ثلاثة أزواج من المفاتيح العامة/الخاصة لهذا (مفاتيح المصادقة والتوقيع والتشفير).
إنشاء المفاتيح أمر سهل مع 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 ( ) ;
}اضبط الكود أعلاه وأيضًا إنشاء مصادقة ("Auth.Key") ومفتاح التشفير ("enc.key").
أعلن عن مفتاح توقيعك العام لبنكك. لاحظ أن المفاتيح التي تم إنشاؤها مسبقًا يتم تخزينها بتنسيق PEM وتحتوي على المفتاح الخاص والعامة.
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 ( ) ) ;بعد ذلك نحتاج إلى الإعلان عن مفاتيح المصادقة والتشفير.
// 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 ( ) ) ;إن الإعلان عن المفاتيح لا يكفي ، حيث يحتاج البنك إلى التأكد من أن المفاتيح تنتمي إليك حقًا. لإثبات ذلك ، تحتاج إلى إرسال رسائل INI و HIA إلى البنك الخاص بك. أنها تحتوي على قيم التجزئة من مفاتيحك العامة وتوقيعك المكتوب. تصف مواصفات EBICS بالتفصيل كيف يجب أن تبدو هذه الحروف.
من أجل التواصل عبر EBICS مع البنك ، تحتاج إلى مفاتيح البنك العام ، لأن البيانات المتبادلة يجب تشفيرها وتوثيقها.
// 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 ) ; إذا لم تكن في بيئة ASP.NET وترغب في رؤية بعض إخراج السجل ، يمكنك على سبيل المثال تمكين Serilog مع تسجيلات Microsoft.
Log . Logger = new LoggerConfiguration ( )
. WriteTo . Console ( )
. MinimumLevel . Debug ( )
. CreateLogger ( ) ;
EbicsLogging . MethodLoggingEnabled = true ; // see entry/exit messages in log
EbicsLogging . LoggerFactory . AddSerilog ( ) ; تحتاج إلى الرجوع إلى Serilog.Extensions.Logging و Serilog.Sinks.Console في ملف csproj الخاص بك لاستخدام serilog.
< ItemGroup >
< PackageReference Include = " Serilog.Extensions.Logging " Version = " 2.0.2 " />
< PackageReference Include = " Serilog.Sinks.Console " Version = " 3.1.2-dev-00771 " />
</ ItemGroup > في بيئة ASP.NET ، تحتاج فقط إلى تمرير مثيل LoggerFactory الذي تحصل عليه من حاوية حقن Depency إلى Netebics.
public MyController ( ILoggerFactory loggerFactory )
{
EbicsLogging . MethodLoggingEnabled = true ;
EbicsLogging . LoggerFactory = loggerFactory ;
}راجع الملف ترخيص. txt لمزيد من المعلومات.