İbrahim KAZANCI
Healthy HBYS
www.hbys.web.tr
https://plus.google.com/u/1/+ibrahimKazanci_1
************************************************************************
Son Versiyon / Last Version
ESigner - 2.1.2 Desktop.7z: xades 2.1.2 dll'leri ile hazırlanmış kaynak dosyalar (ve bin klasörü altında .exe)
ESigner - 2.1.2 Desktop.7z: sources with xades 2.1.2 dlls
************************************************************************
Eski Versiyonlar / Old Versions
eimzaOS-2.0.2.zip: xades 2.0.2 dll'leri ile hazırlanmış exe
EImzaOS-Project-Complete-2.0.2.7z: xades 2.0.2 dll'leri ile hazırlanmış kaynak dosyası
eimza.zip: xades 1.4.15 dll'leri ile hazırlanmış exe
EImzaOS-Project-Complete.7z: xades 1.4.15 dll'leri ile hazırlanmış kaynak dosyası
************************************************************************
Dll'lerin hedef bilgisayarlarda register edilmesi vs. gerekmiyor. Kendi bilgisayarimdan başka yeni kurulmuş iki bilgisayarda (XP Pro 32 bit ve Win 7 64 bit) denedim çalıştı, ekteki eimza.zip içindeki dosyalar aynen korundu ise ve net framework 3.5 kurulu ise sorun yok. Gerekirse ileride gerekli tüm dosyalar exe içerisine gömülerek programın dağıtım sorunu aşılabilir.
Tabii Akis veya kart hangi kuruma ait ise sürücüsünün yazılımının zaten yüklü olması gerekli. Önce imzager ile akıllı karta ve içindeki sertifikaya ulaşabildiğinizi deneyin. Sonra program çalışacaktır.
İmza işlemini gerçekleştirebilmek için elinizdeki karta ait sertifikayı ESigner.exe'nin bulundugu klasörün altındaki trusted klasörüne import etmeniz gerekli.
Programın çalışması için gerekli dosyalar altta gereklilikler kısmında verildi.
Programın Çalışma şekli şöyle:
ESigner.exe dört parametre alır. 1: İmzalanacak XML string. XML dosyadan okunacaksa ilk parametreyi boş ( "" ) geçin. 2. parametre kaynak dosya yolu. Eğer iki parametre de gönderilmişse ilki (string xml) dikkate alınır. 3: kart tipi, "SAFESIGN", "AKIS" gibi. 4: PIN kodu.
İmzalama gerçekleşince program imzalanmış veriyi string olarak döndürüp kapanır.
Komut satırı:
cmd /C ""ESigner.exe" "<ereceteBilgisi>...</ereceteBilgisi>" "kaynak xml yolu" "AKIS" "1234""
ESigner.exe gets four parameters. First is the source XML data. If you want to use an XML file as the source then send the first parameter empty "" and send the path of the XML file as the second parameter. Third is CardType like "AKIS". Fourth is PIN code.
Returns signed XML as string.
Usage:
cmd /C ""ESigner.exe" "XML string" "Path of XML file (Optional)" "AKIS" "1234""
Aşağıda delphi üzerinden çalıştırma ve dönen veriyi alma örneği var:
Programı Delphi'den şöyle çalıştırıyorum / Delphi Example
var
XML, SignedXML: WideString;
begin
...
...
XML := XML + '<ereceteBilgisi>' +
' <tesisKodu>'+inttostr(frmMain.GSSTesisKodu)+'</tesisKodu>' +
...
...
if FromFile = 0 then
begin
// hazirlanan XML textini gonder ve imzalanmis olarak geri al (send XML as string parameter and get signed XML as string)
SignedXML := frmMain.GetDosOutput('""'+ESignerPath+'ESigner.exe" "'+XML+'" "" "'+KartTipi+'" "'+PinKodu+'""', ESignerPath, '');
end
else
begin
// XML'i dosyaya kaydet (dosya uzerinden islem yapmak isteniyorsa kullan)
// AssignFile(Logo,frmMain.LocalPath+'erecete.xml');
// Rewrite(Logo);
// Writeln(Logo,XML);
// CloseFile(Logo);
// SignedXML := frmMain.GetDosOutput('""'+frmMain.LocalPath+'ESigner.exe" '+'"'+XML+'" """', frmMain.LocalPath);
end;
if SignedXML = '' then
begin
frmRMemo.Memo1.Lines.Add('İmzalanmış reçete oluşmadı. Gönderim Yapılmadı');
Exit;
end;
// imzalanirken eklenen esignerbase64: :esignerbase64 ayiklanmasi
if pos(WideString('esignerbase64:'),SignedXML) > 0 then
begin
SignedXML := Copy(SignedXML, pos(WideString('esignerbase64:'),SignedXML)+14, pos(WideString(':esignerbase64'),SignedXML)-(pos(WideString('esignerbase64:'),SignedXML)+14));
end
else
begin
frmRMemo.Memo1.Lines.Add('Reçete imzalama esnasında hata oluştu'+ SignedXML);
Exit;
end;
vImzaliEreceteGirisIstekDVO := ImzaliEreceteGirisIstekDVO.Create;
vImzaliEreceteGirisIstekDVO.imzaliErecete := SignedXML;
...
...
// GetDosOutput fonksiyonu
function TfrmMain.GetDosOutput(CommandLine: string; Work: string = 'C:\'; Shell: string = ''): string;
var
SA: TSecurityAttributes;
SI: TStartupInfo;
PI: TProcessInformation;
StdOutPipeRead, StdOutPipeWrite: THandle;
WasOK: Boolean;
Buffer: array[0..255] of AnsiChar;
BytesRead: Cardinal;
WorkDir: string;
Handle: Boolean;
iWaitRes: Integer;
Wait: DWord;
begin
Result := '';
// Exit;
Wait := 60000; // ConnTimeOut;
CommandLine := stringReplace(stringReplace(CommandLine, '<', '^<', [rfReplaceAll]),'>', '^>', [rfReplaceAll]);
Memo1.Lines.Add(CommandLine);
with SA do begin
nLength := SizeOf(SA);
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
try
with SI do
begin
FillChar(SI, SizeOf(SI), 0);
cb := SizeOf(SI);
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
WorkDir := Work;
if shell = '' then Shell := 'cmd.exe /C ';
// Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
// nil, nil, True, 0, nil,
// PChar(WorkDir), SI, PI);
Handle := CreateProcess(nil, PChar(Shell + CommandLine),
nil, nil, True, 0, nil,
PChar(WorkDir), SI, PI);
CloseHandle(StdOutPipeWrite);
if Handle then
begin
try
repeat
WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
if BytesRead > 0 then
begin
Buffer[BytesRead] := #0;
Result := Result + Buffer;
end;
until not WasOK or (BytesRead = 0);
// wait unitl there is no more data to receive, or the timeout is reached
iWaitRes := WaitForSingleObject(PI.hProcess, Wait);
// timeout reached ?
if (iWaitRes = WAIT_TIMEOUT) then
begin
Handle := False;
TerminateProcess(PI.hProcess, UINT(ERROR_CANCELLED));
end;
finally
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
end;
end
else
begin
Result := 'Komut çalıştırılamadı';
end;
finally
CloseHandle(StdOutPipeRead);
end;
end;
Kullanmak isteyen olursa denesin...
Visual C# 2010 Express ile hazırlanmıştır.
İbrahim KAZANCI
Healthy HBYS
www.hbys.web.tr
https://plus.google.com/u/1/+ibrahimKazanci_1
Gereklilikler:
ESigner.exe'nin bulunduğu dizinde
xmlsignature-config.xml
ESigner.exe.config
ESigner.vshost.exe.config
certval-policy.xml
asn1rt.dll
log4net.dll
ma3api-asn.dll
ma3api-certstore.dll
ma3api-certvalidation.dll
ma3api-cmssignature.dll
ma3api-common.dll
ma3api-crypto-bouncyprovider.dll
ma3api-crypto.dll
ma3api-iaik_wrapper.dll
ma3api-infra.dll
ma3api-managedPkcs11.dll
ma3api-mssclient-aveaprovider.dll
ma3api-mssclient-turkcellprovider.dll
ma3api-mssclient.dll
ma3api-pkcs11net.dll
ma3api-signature.dll
ma3api-smartcard.dll
ma3api-xmlsignature.dll
nunit.framework.dll
System.Data.SQLite.dll
dosyaları olmalıdır.(exe ile aynı klasörde)
Ayrıca exe'nin bulunduğu klasörün altında 4 klasör olmalıdır. Bunlar;
trusted klasörü: akıllı karta ait .cer uzantılı sertifika import edilip kaydedilmelidir.
lisans klasörü: Full_lisans.xml adıyla lisans dosyası kayıtlı olmalıdır (path bilgisi lisanshelper.cs içinde yer alıyor. Dosya kamusm'den geliyor)
en-US klasörü: (dll dosyaları)
tr-TR klasörü: (dll dosyaları)