Modalitati de Utilizare a Internetului In Afaceri
Capitolul 1
Introducere.
Daca in anul 1888 primul catalog de vânzare a produselor a reprezentat un factor de noutate si o provocare majora pentru afaceri, creând modificări in modalitatea de vânzare a produselor, in prezent comerțul electronic este factorul care revoluționează modul de gândire al oamenilor de afaceri de pe întreg globul. Motorul care propulsează comerțul electronic este Internetul.
Definiții:
Internetul este o rețea de zeci de mii de computere de mare capacitate, conectate intre ele și oferă potențialilor clienți posibilitatea de a "vizita" afacerea pe "web" si de a analiza ofertele de produse si servicii ale firmelor. Dezvoltarea exploziva a rețelei internet este determinata de o necesitate obiectiva: obținerea unui volum de informații cat mai bogat, intr-un interval de timp cat mai scurt si cu cele mai mici costuri.
Dezvoltarea fără precedent din ultimele doua decenii a tehnologiilor informaționale determinate de necesitatea stocării si a transmiterii rapide a informațiilor cu cele mai mici costuri, a revoluționat comerțul global, comerțul direct sau cu amănuntul, redefinind principiile clasice ale marketingului. Astăzi, termenul de Comerț Electronic a devenit sinonim cu creșterea profitului.
Comerțul electronic reprezintă un schimb electronic de informații intre o afacere și clienții săi. Aceasta se poate face prin fax, telefon, voice-mail, email, extranet sau Internet, pentru a enumera doar câteva dintre mijloace. In general este folosit pentru a acoperi activități din domeniile:
distribuție
marketing
vânzarea si livrarea produselor prin mijloace electronice
Comerțul electronic are, in sens larg, un impact mult mai profund asupra evoluției afacerilor si include activitățile care susțin obiectivele de marketing, publicitatea, vânzările, plățile, activitățile post-vânzare, serviciile către clienți, etc. Este una dintre soluțiile complexe, "integrate", pe care le oferă tehnologia Internet. Asta înseamnă ca o multitudine de aplicații si de furnizori de servicii Internet trebuie sa conlucreze intr-o sincronizare perfecta pentru ca un site de comerț electronic sa poată funcționa.
Aceasta evoluție are un impact major asupra economiei, in ceea ce privește crearea de noi întreprinderi, diversificarea celor existente si, in special, asupra potențialului pieței forței de munca si a gradului de ocupare a acesteia in viitor. Datorita acestei diversități a condițiilor de piața ce cuprinde un mare număr de furnizori de servicii si care este intr-o permanenta schimbare, se impune ca o necesitate punerea la dispoziția întreprinderilor si in special a întreprinderilor mici si mijlocii, a unei "surse" unde sa găsească sprijinul adecvat pentru aplicarea soluțiilor comerțului electronic in activitatea proprie.
1.1 Modalități de utilizare a Internetului în afaceri
Comerțul Electronic este cheia competitivității întreprinderilor in era informaționala, asigurând:
accesul la noi segmente de piața (noi clienți);
creșterea vitezei de derulare a afacerilor;
o flexibilitate ridicata a politicilor comerciale;
reducerea costurilor de aprovizionare, de desfacere, de publicitate, etc.;
simplificarea procedurilor;
creșterea competitivității.
In tranzacțiile comerciale clasice distingem patru etape diferite:
informarea comerciala referitoare la tranzacție: cercetarea de marketing;
încheierea contractului comercial;
vânzarea produsului sau a serviciului;
plata produsului sau a serviciului;
In figura de mai jos este prezentat modul in care se reflecta aceste patru etape in cazul comerțului electronic:
Datorita costurilor implicate, nu toate companiile încep prin a-si vinde produsele pe Internet. Cu toate acestea, existenta unui web site care sa prezinte cel puțin firma si produsele sau serviciile pe care le oferă aceasta a devenit obligatorie. Nici o firma de renume nu își permite sa ignore rețeaua. SBA (Small Business Administration) a identificat trei tipuri de web site-uri comerciale, în funcție de conținutul acestora.
a. Site-uri tip broșura
Aceste site-uri se limitează la a prezenta firma si produsele pe care le oferă, magazinele care comercializează produsele sale, si, eventual, pun la dispoziția vizitatorului formulare prin intermediul cărora acesta poate solicita diverse informații. Firmele care se încadrează în aceasta categorie se limitează la a-si utiliza web site-ul ca simplu instrument de marketing, fără a exploata toate posibilitățile noii tehnologii. Este tipul de site ales în general la prima apariție pe Web a unei firme, menținându-se până la elaborarea unei strategii complete.
b. Site-uri pre-comerciale
În plus fata de site-urile precedente, acestea conțin si catalogul interactiv cu produsele firmei, vizitatorul putând căuta în cadrul ofertei produsele care îl interesează, după diferite criterii. În paginile web site-ului firma furnizează fotografii si informații mai mult sau mai puțin detaliate despre fiecare din produsele sale. Aceasta forma este preferata mai ales de marile firme producătoare, care se limitează la a furniza cât mai multe informații, lăsând în seama distribuitorilor preluarea si procesarea comenzilor.
c. Site-uri de comerț electronic
Site-urile de comerț electronic înglobează, în plus fata de precedentele, posibilitatea lansării unei comenzi si a efectuării plătii online. Acest pachet de servicii definește de fapt noțiunea de comerț electronic. În ultimul an, au apărut si site-uri românești de comerț electronic, deși cardurile de plata (de debit sau de credit) – instrumentul de plata cel mai utilizat pe site-urile occidentale – nu sunt foarte răspândite în România. Totuși, cu metode relativ primitive (sistem ramburs etc.), comerțul electronic românesc a început sa se dezvolte.
O alta clasificare a activităților comerciale ce pot avea loc prin intermediul Internetului a fost realizata de Treese, G. W. în cartea sa 'Designing Systems For Internet Commerce'. Astfel, el împarte comerțul electronic în:
Comerț cu bunuri de consum ('business-to-consumer')
Se realizează intre cumpărători individuali si vânzători-mari companii. In acest caz, factorul uman este mult mai important, interactivitatea fiind caracteristica de baza in decizia de cumpărare.
b. Comerț intermediar ('business-to-business')
Include comerțul cu diverse bunuri si servicii care se adresează firmelor. Cu ajutorul unor programe specifice, web site-ul de b-to-b trebuie sa poată recunoaște clientul, sa ofere condiții sporite de securitate, sa ofere pe baza datelor culese de la client diverse oferte speciale, etc. În general, în cazul unui site b-to-b, standardele de profesionalism sunt mai ridicate.
c. Comerț informațional
Comerțul informațional se refera la toate acele bunuri sau servicii care pot fi si plătite, si livrate imediat prin Internet. Acestea pot fi: programe de calculator, documente, articole, muzica, informații, diverse servicii etc.
1.2 Avantaje si dezavantaje fata de comerțul clasic
Fără îndoiala, Internetul are în prezent un impact extraordinar asupra lumii afacerilor. Aceasta se datorează avantajelor evidente pe care le prezintă atât comercianților, cât si cumpărătorilor, în comparație cu mijloacele tradiționale de desfășurare a activităților comerciale. Cu toate acestea, Internetul are dezavantajele sale, care diferă în funcție de partea implicata.
Avantaje pentru comercianți:
Posibilitatea firmelor mici de a concura cu firmele mari:
Prin costurile reduse pe care le implica deschiderea unui magazin virtual, firmele mici se confrunta cu o bariera mai puțin în calea intrării pe piețele dominate până acum de firme mari. Mai mult, o firma mica, prin flexibilitatea si deschiderea la nou de care poate da dovada, se bucura de un mare avantaj, fata de o firma mare, dominata de birocrație si conservatorism.
Contact cu clienții 24 ore din 24, 7 zile din 7:
Spre deosebire de angajații obișnuiți, care au nevoie de salarii, un program de lucru, concediu, a căror productivitate variază si sunt subiectivi, un web site oferă informații despre firma si produsele sale sau preia si procesează comenzi 24 de ore din 24, 7 zile din 7, cu costuri minime. Aceasta mai aduce un avantaj si în cazul extinderii pe piețele externe, când diferența de fus orar ar fi putut îngreuna contactele dintre firme. De asemenea, îmbunătățește comunicarea cu clienții, care nu mai sunt obligați sa respecte un anume program, putând obține informații sau lansa comenzi oricând doresc.
Facilitarea intrării pe piețele internaționale
Rețeaua mondiala nu este îngrădita de granițe, nu este în posesia nimănui, iar accesul si costurile de publicare sunt extrem de reduse. Comunicarea cu un client de pe fata cealaltă a globului este la fel de facila ca si comunicarea cu o persoana din cealaltă încăpere. O firma producătoare își poate vinde acum produsele în orice tara prin intermediul unui web site, fără a mai fi nevoie sa stabilească contacte cu firme locale sau sa facă investiții foarte mari.
Scăderea costurilor de funcționare
Aceste costuri pot fi reduse drastic prin automatizarea procesului de comanda. De asemenea exista posibilitatea automatizării complete printr-o integrare cu sistemul de gestiune, ceea ce poate duce la o creștere a productivității generale a firmei.
Noi posibilități de practicare a marketingului direct (one-to-one)
Spre deosebire de o ființa umana, calculatorul poate retine nu numai numele si datele personale ale tuturor clienților, dar si preferințele acestora, fiind capabile sa adapteze oferta si modul de prezentare al produselor după profilul fiecărui client. Studiul clienților pe Internet poate fi realizat fără ca aceștia să-și dea măcar seama, fiind disponibile informații ca: localizarea, tipul browserului si al sistemului de operare, site-ul de unde vine, obiceiuri de navigare. Din aceasta cauza, mulți vad acest lucru ca pe o încălcare a intimității persoanei.
Dezavantaje pentru comercianți:
Frauda
Ca în orice alt domeniu, tehnologia Internetului a creat si noi posibilități de fraudare. În lipsa unui contact direct, un client poate sa însele comerciantul în privința identității sale sau a posibilităților sale reale de plata. Majoritatea magazinelor virtuale occidentale au rețineri în a trimite mărfuri spre Europa de Est tocmai din cauza numeroaselor încercări reușite de fraudare cu cărți de credit false inițiate de est-europeni.
Securitatea
O alta problema deosebit de importanta este cea legata de securitatea datelor. O firma fără acces la Internet nu are prea multe motive de îngrijorare privind integritatea sistemelor sale informatice de gestiune. Conectarea la o rețea publica, în care oricine poate avea acces mai mult sau mai puțin autorizat la date confidențiale din rețeaua locala, ridica probleme serioase. Apar astfel riscuri care nu existau înainte de apariția acestui tip de comerț.
Costurile de lansare si integrare
Deși, prin comparație cu deschiderea unui magazin obișnuit, costurile lansării unui magazin virtual sunt mult mai reduse, de multe ori nu pot fi evaluate corect. O firma care nu are implementat deja un sistem informatic de gestiune, sau ai cărei angajați nu au cunoștințe tehnice minime se poate confrunta cu creșterea costului de lansare peste așteptări, datorate necesitații achiziționării de sisteme sau de training pentru angajați.
Avantaje pentru clienți
Disponibilitate 24 ore din 24, 7 zile din 7
Acesta disponibilitate independenta de un program anume reprezintă un avantaj major pentru clienți, care își pot face astfel cumpăraturile chiar si noaptea, când nu mai sunt reținuți de alte probleme mai urgente (servici, gospodărie etc.).
Comoditate
Datorita comerțului electronic, nu mai este necesara deplasarea la centre comerciale, nici măcar până la magazinul din colt. Fiecare își poate comanda stând acasă, în fata calculatorului si analizând si comparând în liniște diferitele produse.
Acces neîngrădit la informații si produse diverse
Apariția comerțului electronic a dat un nou seun nou sens termenului 'globalizare'. Pentru a cumpăra, de exemplu, obiecte artizanale din Madagascar, nu mai este necesara deplasarea la fata locului, ci doar deschiderea browserului la adresa unui magazin care comercializează aceste obiecte (adresa care poate fi găsita prin intermediul motoarelor de căutare).
De asemenea, înainte de achiziționarea unui produs, viitorul cumpărător are acces mult mai liber si mai ieftin la ofertele firmelor producătoare sau comerciale.
Dezavantaje pentru clienți
Securitate
Cel mai important motiv pentru care unele persoane ezita sa utilizeze Internetul pentru cumpăraturi – așa cum a reieșit din marea majoritate a sondajelor efectuate – îl reprezintă teama de furniza online informații legate de cartea de credit. Însă, aceleași persoane dau zi de zi numărul cărții de credit prin telefon unor persoane pe care nici măcar nu le cunosc, în momentul în care fac cumpăraturi din cataloage sau de la televizor.
Intimitate
O alta problema deosebit de importanta o reprezintă atentarea la intimitatea personala. Potențialii cumpărători se tem ca, prin intermediul Internetului, comercianții sau persoana rău-intenționate pot culege informații foarte detaliate despre ei, fără ca măcar sa își dea seama. Din păcate, aceste temeri sunt si rezultatul unor exagerări, mai ales în occident fiind foarte la moda teoria conspirațiilor.
Lipsa contactului uman
Este cel mai evident conflict care apare în comerțul electronic. Pe de o parte, costurile reduse de lansare si întreținere ale unui magazin virtual deriva tocmai din avantajele automatizării proceselor, ne mai fiind necesara angajarea de personal suplimentar. Pe de alta parte, tocmai lipsa vânzătorului, a persoanei 'umane' la care clientul poate apela în cazul unei nelămuriri, reprezintă un obstacol în calea răspândirii acestei forme de comerț. În acest sens, unele firme au creat chiar programe care permit contactul verbal sau chiar vizual între client si un angajat al firmei în timpul vizitei primului pe web site.
Accesul la tehnologie
Mai pe larg, accesul la tehnologie se refera atât la gradul de penetrare a Intenetului în sine, cât si la răspândirea calculatoarelor si a cunoștințelor de specialitate. Atâta timp cât un site de comerț electronic nu va fi accesibil decât persoanelor care știu cel puțin cum sa lanseze browserul si sa tasteze adresa de Web, majoritatea potențialilor clienți vor prefera magazinul din colt.
În plus, deși 200 de milioane de utilizatori cât au serviciile de Internet astăzi pare o cifra respectabila, este destul de puțin, comparat cu populația de 6 miliarde a globului. În România, de asemenea, 400.000 de utilizatori fata de o populație de 22 de milioane este infim.
1.3 Comanda electronica
Exista mai multe opțiuni pentru expunerea produselor si trimiterea comenzilor online. Cea mai obișnuita este pagina simpla HTML (pentru expunerea produselor) si un formular electronic de comanda. Pentru un număr mic de produse aceasta varianta este suficienta. Daca numărul de produse este mai mare si clienții cumpăra in mod frecvent un număr mai mare de produse este nevoie de un sistem de scripturi mai complex.
In acest caz, soluțiile se împart in doua opțiuni principale:
scripturi Java sau CGI (freeware sau shareware)
aplicații găzduite
Soluția scripturilor gratuite este ieftina si poate fi suficienta in etapa de început. Comparata insa cu soluțiile de comerț electronic oferite de furnizorii de web hosting au următoarele limitări, inconveniente:
Sunt mai dificil de instalat
Sunt mai greu de întreținut din punct de vedere al actualizărilor: de produse si de preturi
Sunt mai puțin dinamice, oferă posibilități limitate pentru promoțiile speciale, spre exemplu.
Nu au funcții pentru promoții încrucișate
Nu sunt întotdeauna compatibile cu diferite platforme sau browsere
Nu ofera instrumente pentru administrarea portofoliului de clienți
Au posibilități limitate de expunere a produselor
Se încarcă uneori destul de încet.
Pentru versiunile shareware mai apare inconvenientul de a lucra pe o versiune demo. Unele dintre aceste versiuni expira in timp si nu se justifica efortul consumat cu instalarea lor pe serverul de web.
Majoritatea furnizorilor de web hosting oferă insa pachete speciale de aplicații pentru comerț electronic – sisteme de shopping cart. Aceste aplicații au o interfața pentru baze de date si utilizează instrumente de programare complexe. Pot genera pagini dinamice pentru expunerea produselor, calcularea prețului si a taxelor (inclusiv a celor de expediere). Furnizează de asemenea rapoarte complete de urmărire a clienților si nenumărate opțiuni de întreținere si actualizare. Anumite componente permit chiar promoții speciale, promoții încrucișate sau personalizarea conținutului in funcție de preferințele clientului. Multe dintre aceste aplicații pot fi utilizate si in site-urile comerciale de tip "Business to Business" (B2B).
Cel mai mare avantaj al acestei soluții este insa ca întregul proces de instalare a aplicației se face prin intermediul browser-ului (Netscape Communicator sau Internet Explorer). Mai mult decât atât, cei mai mulți furnizori de hosting oferă si suport tehnic la instalare pentru companiile care au sute de produse.
Alte avantaje care merita luate in considerare:
Sunt mult mai ușor de instalat.
Sunt foarte ușor de întreținut
Magazinul poate fi administrat prin intermediul browser-ului
Au incluse funcții de urmărire a clienților
Numărul de produse poate fi extins sau diminuat in funcție de necesități
Includ instrumente pentru promoții speciale, încrucișate.
Integrează soluții pentru tranzacții in timp real.
Chiar daca pare o opțiune mai costisitoare decât cea bazata pe scripturi freeware/shareware, sunt de luat in considerare si costurile de timp pentru instalarea si menținerea sistemului, precum si performantele ulterioare instalării.
1.4 Modalități de plată electronică
Alegerea metodei de plata depinde in primul rând de ce fel de site de comerț electronic administrați: de tip B2C (adresat consumatorului) sau B2B (dedicat tranzacțiilor de afaceri). Câteva dintre modalitățile de plata obișnuite sunt: Ordinul de plata, viramentul, plata prin carte de credit sau debit, cecurile. In timp ce in site-urile de tip B2C cea mai frecventa metoda de plata este cartea de credit, la cele de tip B2B sunt mai degrabă utilizate ordinele de plata si viramentele bancare.
In comerțul electronic de tip B2B, clienții implicați in tranzacții dețin de obicei cont de firma si solicita eliberarea unei facturi. Este necesara verificarea solvabilității clientului înainte de trimiterea mărfii.
Sistemul de shopping cart pe care îl alegeți trebuie sa poată furniza mecanismele pentru colectarea informațiilor necesare expedierii produsului si procesării tranzacției (inclusiv facturare, daca este cazul).
In cazul tranzacțiilor prin cărți de credit, exista 2 opțiuni:
Procesarea manuala
Procesarea in timp real
Procesarea manuala implica următorii pași:
Autentificarea: confirmarea ca numărul cărții de credit este valid si nu este furat
Autorizarea: confirmarea ca exista fondurile necesare plății
Inițierea procesului de transferare a banilor
Aceste etape sunt parcurse offline, prin transmiterea informațiilor de pe cartea de credit prin telefon sau prin intermediul unui terminal POS furnizat odată cu contul de comerciant. Autentificarea si autorizarea se fac înainte de expedierea produsului in timp ce transferul banilor are loc numai după ce produsul este in drum spre consumator.
Procesarea in timp real este in totalitate computerizata si implica mai mulți furnizori independenți de servicii : banca firmei si banca clientului, companiile de cărți de credit sau debit etc. Întregul mecanism va fi pus in mișcare prin apăsarea unui simplu buton: "Cumpăra acum". Deși pare foarte complicat, furnizorul de web hosting asigura funcționarea întregului sistem iar interfața către client este foarte ușor de administrat. Atenți insa la TAXE!
Procesarea in timp real nu este întotdeauna necesara. Gândiți-vă însă ce s-ar întâmpla daca ați avea de procesat 120 de tranzacții si ați avea nevoie de aproximativ 4 minute pentru fiecare. Ar fi necesare nu mai puțin de 8 ore pentru a finaliza procesul.
Cap. 2 Descrierea pachetelor utilizate.
Pentru a realiza un site de comerț electronic sunt necesare câteva pachete software, care să suporte fluxul unui astfel de proces. Un site de comerț electronic este realizat în format electronic web, deci este necesar un server web. Unul dintre cele mai răspândite servere web este Apache, în consecință pentru site-ul nostru îl vom folosi pe acesta, fiind și gratis.
Deoarece conexiunile la acesta trebuie să fie securizate (informațiile transmise sunt private) este necesar folosirea unui modul de securizare, mod_ssl fiind cel care realizează acest lucru pentru Apache.
Pentru a menține înregistrări cu cererile clienților și cu operațiile efectuate, este necesară o bază de date, iar pentru aceasta vom alege MySQL, un server gratis foarte rapid.
Pentru a realiza in mod dinamic paginile de web a aplicației mele, este necesar și un limbaj scriptural: PHP3 fiind una din alegerile cele mai bune, datorită faptului că este inclus în serverul de web și , deci, reacționează foarte rapid, precum și datorită ușurinței de dezvoltare în acest limbaj.
Sistemul de operare pe care toate aceste pachete software vor funcționa va fi un sistem Linux, rulând un kernel 2.4.4.
2.1. Instalare sistem Apache+SSL+PHP+MySQL
În acest paragraf este descrisă procedura de instalare a unui webserver complet, incluzând webserver-ul propriu-zis, suport de baze de date, limbaj de scripting și protecție SSL, precum și configurarea lor pentru o buna funcționare.
Instalare OpenSSL
OpenSSL este o biblioteca criptografica folosita de mod_ssl. Pachetul sursa OpenSSL a fost despachetat în /usr/src/openssl-0.9.5a și au fost rulate comenzile următoare.
# cd /usr/src/openssl-0.9.5a
Trecere în directorul care conține pachetul sursa OpenSSL despachetat.
# ./config no-idea -fPIC
Configurare pachet:
no-idea: reglementare criptografica pentru zona europeana.
-fPIC: pentru evitarea unui bug care a fost raportat uneori.
# make
Compilare pachet.
# make test
Verificarea compilării corecte. Este necesar ca pachetul să treacă toate testele.
# make install
Instalarea pachetului finit în locul de rigoare din sistem.
Instalare Apache+mod_ssl
Apache este un server Web gratuit, ale cărui facilități și performanțe l-au făcut numărul 1 în domeniu, după părerea majorității. mod_ssl este un modul care implementează conexiuni securizate (SSL) în Apache. Pachetele Apache și mod_ssl au fost despachetate în /usr/src/apache_1.3.12, respectiv /usr/src/mod_ssl-2.6.6-1.3.12.
# cd /usr/src/mod_ssl-2.6.6-1.3.12
Trecere în directorul care conține pachetul-sursă mod_ssl despachetat.
# ./configure
–with-apache=../apache_1.3.12
–with-ssl=../openssl-0.9.5a
–enable-shared=ssl
–enable-module=so
–with-layout=Suse
Configurare pachete mod_ssl și Apache și aplicare modificări pentru SSL:
–with-apache: indica localizarea pachetului Apache
–with-ssl: indică localizarea pachetului OpenSSL
–enable-shared=ssl: activează modulul SSL în Apache
–enable-module=so: activează suportul DSO în Apache
–with-layout=RedHat: precizează ca instalarea se va produce în anumite directoare, într-un mod specific sistemelor RedHat Linux
# cd /usr/src/apache_1.3.12
Trecere în directorul care conține pachetul-sursă Apache despachetat.
# make
Compilare pachet. Atenție: nu se mai configurează Apache prin comanda "configure", deoarece acest lucru s-a realizat deja mai sus, împreuna cu pachetul mod_ssl.
# make certificate
Crearea unui certificat de autentificare SSL provizoriu. Pentru moment, singurul amănunt important din timpul creării certificatului este parola sa, pe care o vom nota PAROLASSL.
# cd /usr/src/mod_ssl/2.6.6-1.3.12
Instalarea pachetului Apache+mod_ssl în directoarele de rigoare.
# make install
Instalarea pachetului finit în locul de rigoare din sistem.
Instalare PHP
PHP este un limbaj de scripting dezvoltat special pentru Web. Am ales compilarea sub forma de modul Apache care, spre deosebire de varianta de sine stătătoare, oferă performante crescute.
Pentru funcționarea corecta a PHP, este necesar ca înainte de compilare să se editeze fișierul apxs (localizat cel mai probabil în /usr/sbin) și să se corecteze următoarele informații:
A) In caz ca exista următoarele linii:
my #CFG_CFLAGS_SHLIB = '';
my #CFG_LD_SHLIB = '';
my #CFG_LDFLAGS_SHLIB = '';
trebuie schimbat conținutul celor trei variabile astfel:
my #CFG_CFLAGS_SHLIB = '-fpic -DSHARED_MODULE';
my #CFG_LD_SHLIB = 'gcc';
my #CFG_LDFLAGS_SHLIB = q(-shared);
B) În caz ca exista linia următoare:
my #CFG_LIBEXECDIR = 'modules';
trebuie modificată astfel:
my #CFG_LIBEXECDIR = '/usr/lib/apache';
C) Linia următoare:
my #CFG_CFLAGS = q( -DLINUX=2 -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -fpic -DSHARED_CORE `../apaci`);
Trebuie modificată să includă precizarea -DEAPI, astfel:
my #CFG_CFLAGS = q( -DLINUX=2 -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -fpic –
DSHARED_CORE `../apaci` -DEAPI);
# cd /usr/src/php4.0.2
Trecere în directorul care conține pachetul-sursă PHP despachetat.
# ./configure
–with-apxs=/usr/sbin/apxs
–with-mysql
Configurare pachet:
–with-apxs: precizează localizarea script-ului apxs, și totodată semnalează că PHP va fi folosit ca modul DSO
–with-mysql: precizează că PHP va face uz de MySQL
# make
Compilare pachet.
# make install
Instalarea pachetului finit în locul de rigoare din sistem.
Instalare MySQL
MySQL este un server SQL de stocare de date RDBMS, foarte popular datorita portabilității pe multiple platforme, ușurinței de folosire, facilitaților satisfăcătoare pentru majoritatea aplicațiilor și performantelor foarte bune.
# cd /usr/src/mysql-3.22.32
Trecere în directorul care conține pachetul-sursă MySQL despachetat.
# ./configure
–enable-thread-safe-client
–enable-large-files
–exec-prefix=/usr
–localstatedir=/data/mysql
–with-unix-socket-path=/tmp/mysql.sock
–with-named-curses-libs='/usr/lib/libform.so.4'
Configurare pachet:
–enable-thread-safe-client: precizează că se vor folosi fire de execuție multiple (pentru performanta sporita)
–enable-large-files: activează suportul pentru baze de date foarte mari
–exec-prefix: stabilește directorul de bază al executabilelor MySQL
–localstatedir: stabilește directorul în care se vor instala bazele de date; am ales /data/mysql pentru ca pe sistemul unde am efectuat testele /data era conținut de o partiție speciala, cu foarte mult spațiu la dispoziție
–with-unix-socket-path: stabilește localizarea fișierului socket MySQL
–with-named-curses-libs: această opțiune este necesară doar dacă configurarea eșuează cu o eroare legată de termcap/curses; este necesar să aveți instalat pachetul termcap/curses/ncurses pe sistem pentru a o folosi
# make
Compilare pachet.
# make install
Instalarea pachetului finit in locul de rigoare din sistem.
# mysql_install_db
Crearea bazelor de date care vor reține autorizările de acces la MySQL.
# mysqladmin -uroot password PAROLAMYSQL
Stabilește parola de acces la MySQL și utilizatorul privilegiat. De menționat ca numele utilizatorului poate fi oricare, 'root' folosit aici este doar o convenție și nu are nimic de-a face cu 'root' pentru sistemul de operare.
# mysql -uroot -pPAROLAMYSQL
Intră în consola MySQL. Următoarele comenzi nu vor fi date din linia de comanda a sistemului, ci din consola MySQL.
> drop database test;
Șterge baza de date 'test', o baza de date creata automat la instalarea MySQL în scopuri demonstrative.
> use mysql;
Începe modificarea bazei de date 'mysql', care conține printre altele drepturile de acces la serverul MySQL.
> delete from user;
Stere conținutul tabelei 'user' în întregime. Atenție: nu părăsiți consola MySQL înainte de executarea următoarelor două comenzi, deoarece nu exista momentan nici o autorizare și nu veți reuși să mai intrați din nou in consola.
După ștergerea conținutului tabelei 'user', se creează doua autorizări noi cu următoarele comenzi:
> grant all privileges on *.* to root@localhost identified by 'PAROLAMYSQL' with grant option;
> grant all privileges on *.* to root@127.0.0.1 identified by 'PAROLAMYSQL' with grant option;
> quit
Dacă, accidental, se pierd autorizările, opriți serverul MySQL și reporniți-l cu comenzile următoare:
# mysqladmin shutdown -uroot -pPAROLAMYSQL
# safe_mysqld -Sg &
# mysql
În acest moment s-a intrat din nou în consola MySQL, însă s-au ignorat drepturile de conectare și parolele (-Sg). Vor trebui modificate drepturile (în tabela 'mysql.user'), dar de remarcat că nu funcționează comanda GRANT în acest context, prin urmare va trebui să realizați modificările exclusiv prin comenzi de baza (INSERT, DELETE, UPDATE).
Pornire și oprire Apache+MySQL
În mod normal, Apache+SSL cere o parola (PAROLASSL) la fiecare pornire cu comanda 'apachectl' de mai jos. În cazul în care se dorește pornirea la boot, însă, această variantă nu este acceptabilă, și poate fi prevenită prin adăugarea următoarei directive în httpd.conf:
SSLPassPhrase exec:fișier_executabil
unde 'fișier_executabil' este un script shell care scrie parola la stdout. Iată conținutul sau:
#!/bin/sh
echo "PAROLASSL"
În urma efectuării acestei schimbări parola nu va mai fi ceruta nici la boot nici la pornirea manuala. Evident, se recomanda drepturi de acces 700 pe 'fișier_executabil'.
Pornirea manuala a serverului Apache se face prin comanda:
# apachectl startssl
Oprirea manuala a serverului Apache se face prin comanda:
# apachectl stop
Pornirea manuala a serverului MySQL se face prin comanda:
# /usr/bin/safe_mysqld &
Oprirea manuala a serverului MySQL se face prin comanda:
# mysqladmin -uroot -pPAROLAMYSQL shutdown
Pentru a porni automat Apache și MySQL la bootarea sistemului, se editează fișierul /etc/rc.d/rc.local și se adaugă la sfârșit următoarele linii:
/usr/bin/safe_mysqld &
apachectl startssl
Pentru a evita pornirea automata (și) prin metoda clasica, se dau comenzile:
# chkconfig mysql off
# chkconfig httpd off
Aceste comenzi dezactivează pornirea Apache și MySQL ca daemoni, situație care este posibil să fi fost realizata prin instalarea unuia sau altuia dintre pachete ca RPM.
2.2 Apache și soluții existente la problema creării unui site de comerț electonic
Definiție: Apache ,serverul de HTTP
Apache este în prezent pe primul loc ca folosire în întregul Internet, ca server de web. El deține această supremație din aprilie 1996, astăzi peste 60% din site-urile de Web HTTP având ca motor acest server. Netcraft Web Server Survey arată o situație a folosirii serverelor de web din august 1995 până în prezent:
Utilizarea serverelor de web la 1 mai 2001
Apache nu deține supremația numai pe plan global, dar și în țara noastră este de departe cel mai folosit server de web, în fața unor servere realizate de firme predigioase cum ar fi Microsoft IIS sau Netscape Enterprise Server:
Utilizarea serverelor de web în România la data de 1 februarie 2001
În domeniul securității însă, firmele comerciale doresc să aibă , bineînțeles, un suport puternic din partea producătorilor de software. Chiar și așa Apache este pe locul doi ca folosință în domeniul serverelor sigure:
Chiar și în domeniul sistemelor de operare, se observă că această soluție ( sistem de operare Linux, server web Apache, modul de securitate OpenSSL) este folosită pe scară largă, în ianuarie 2001, 121542 de servere securizate răspunzând în felul următor:
Avantaje și proprietăți ale serverului de web Apache:
este un puternic și fexibil server de web;
implementează ultimele protocoale;
este ușor configurabil;
rulează pe Windows NT/9x, Netware 5.x, OS/2 și pe majoritatea versiunilor de Unix;
i se pot adăuga facilități cu ajutorul modulelor realizate cu Apache API
are incluse sursele complete și o licența ne restrictivă
încurajează interacțiunea cu utilizatorii pentru schimbul de idei în vederea îmbunătățirii serverului;
implementează servicii des folosite, cum ar fi:
permite ușor setarea unei parole pentru protecția pachetelor la un număr mare de useri fără aglomerarea serverului.
permite folosirea unor fișiere, chiar și scripturi CGI, care sunt returnate de server drept răspuns la erori și probleme, de exemplu scrierea unui script pentru interceptarea 500 Server Error și afișarea pe loc a problemei;
multiple directive DirectoryIndex : ex: DirectoryIndex index.html index.cgi ceea ce permite serverului să ruleze ori index.html ori index.cgi când un URL este cerut, în funcție de ceea ce găsește în acel director;
permite ușor redenumirea și crearea de aliasuri pentru URL-uri: Apache nu are o limita pentru aliasuri și redenumirea de link-uri în fișierul de configurare;
Host-uri virtuale: proprietate ce permite serverului să facă diferența între cererile clienților făcute către adrese de IP diferite ce aparțin aceluiași calculator sau către nume diferite de DNS ce aparțin , de asemenea aceluiași calculator.
Loguri configurabile: se poate configura Apache-ul să genereze fișiere de log în orice format dorim și să trimită datele prin “pipe” permițând “log rotation”, “hit filtering”, scrierea pentru fiecare host virtual loguri separate.
2.3 SSL
Una din cele mai mari greșeli pe care le fac companiile când este vorba de securitate este eșuarea în stabilirea unor politici și proceduri adecvate – și respectarea lor. Experții sunt de acord ca securitatea este o ținta mișcătoare. Afacerile nu pot doar să instaleze un firewall și apoi să uite despre problema securității. Mereu apare câte o schimbare în infrastructura sistemului informatic, fie un upgrade la sistemul de operare fie o reconfigurare a routerului, și urmările acestor schimbări trebuie luate în calcul.
"Stabilirea unor politici este cu mult mai ușoara decât asigurarea respectării lor." spune Alan Paller, președintele Institutului SANS , o organizație de cooperare și educare în domeniul securității
Într-un raport din Ianuarie 1999 , "Turning Security on its Head," Forrester Research, Cambridge, Mass., spun ca , companiile trebuie să "evite complexitatea" și să "folosească politici simple și masuri care sunt invizibile pentru utilizatori".
Paul Donfried, directorul de vânzări la Identrus, o companie din New York-based care dezvolta servicii PKI, afirma ca , cheia dezvoltării unei securități solide este "includerea" ."Ideal , ceea ce ar trebui să faci, este să iei toți oamenii din toate zonele funcționale care sunt afectate și să dezvolți în comun politici și proceduri," spune el. "Atunci vor exista șanse bune ca acestea să fie implementate și respectate."
OpenSSL se bazeaza pe biblioteca SSLeay si implementeaza robust protocoalele Secure Sockets Layer (SSL v2/v3) si Transport Layer Security (TLS v1). Ca biblioteca de functii criptografice, OpenSSL poate fi utilizata pentru oferirea de solutii comerciale cu un grad de securitate recunoscut de profesionisti drept "puternic".
Varianta aleasa pentru conexiune SSL prin Apache este mod_ssl. Dezvoltat si mentinut de Ralf S. Engelschall, mod_ssl respecta Apache Se presupune ca biblioteca RSAref este utilizata ca baza pentru OpenSSL.
RSAref este biblioteca criptografica ce contine diversi algoritmi populari de criptare si autentificare, furnizata in USA de RSA Data Security Inc. in scopuri educationale, ca referinta pentru implementarea moderna a principiilor algoritmilor cu chei simetrice/asimetrice. Printre algoritmii importanti pe care ii implementeaza se numara cei pentru criptare si generare de chei de la RSA, MD2 si MD5, Diffie-Hellman si Triple-DES. Algoritmul de criptare RSA a fost pus la dispozitia domeniului public in Septembrie 2000, la expirarea patentului detinut de RSA. RSAref nu trebuie utilizat fara a fi verificata modalitatea legala de folosire si fara respectarea licentei.
Mod_ssl: interfata Apache la OpenSSL
Pachetul mod_ssl constă in modulul SSL, și o serie de pachete sursă pentru Apache, ce adaugă Extended API (EAPI) care este o necesitate pentru folosirea mod_ssl. În alte cuvinte, modulul mod_ssl se poate folosi numai dacă nucleul codului Apache conține EAPI. De obicei în momentul în care se adauga mod_ssl la Apache se adaugă și EAPI.
Arhitectura modulelor Apache
Ce este SSL ?
Pentru a înțelege modulul SSL este necesară o înțelegere a algoritmilor de criptografiere, funcțiilor de “digerare” a mesajelor, si a semnaturilor digitale.
2.3.1 Algoritmi de criptografiere
Să presupunem că Alina dorește să trimită un mesaj la banca sa pentru a transfera o anumită sumă de bani. Bineînțeles, Alina ar dori ca acest mesaj să fie privat, având în vedere că acesta va include informații private, de exemplu, numărul de cont si suma de bani.
O soluție ar fi folosirea unui algoritm criptografic, tehnică ce va tranforma mesajul ei într-o formă criptată, citibilă doar de către cei pentru care a fost intenționat criptată. Odată ajuns ân această formă, mesajul poate fi interpretat doar prin intermediul folosirii unei chei secrete. Fară această cheie mesajul este fară valoare: algoritmii de criptografiere puternici fac așa grea decriptarea textului original pentru eventualii hackeri, încâat nu merita efortul acestora. Există două tipuri de algoritmi criptografici: convenționali și cu cheie publică.
Criptografia convențională, de asemenea cunoscută sub numele de criptografie simetrică, necesită ca cel care trimite mesajul și cel care îl primește să cunoască o cheie comună: o bucată de informație secretă ce poate fi folosită pentru a cripta și decripta un mesaj. Dacă această cheie este secretă, atunci nimeni, în afară de primitor, nu poate citi mesajul. Dacă Alina și banca știu acestă cheie secretă, atunci își pot trimite mesaje private. In schimb alegerea unui chei în mod privat, înainte de comunicarea efectivă, poate fi o problemă.
Criptografia cu cheie publică, de asemenea cunoscută sub numele de criptografie asimetrică, rezolvă problema schimbului de cheie privată prin definirea unui algoritm ce folosește două chei, ce pot fi folosite pentru a cripta mesajul. Dacă o cheie este folosită opentru a cripta mesajul, cealalta trebuie folosita pentru a o decripta. Acest lucru face posibilă primirea de mesaje in mod sigur, doar prin publicarea unei singure chei (cheia publică) și ținerea celeilalte secrete (cheia privată). În acest mod, oricine poate cripta mesajul folosind cheia publică, dar numai proprietarul cheii private va putea citi acest mesaj. În acest fel Alina poate trimite mesaje la proprietarul unei perechi de chei (banca), criptându-le folosind cheia publică. Numai banca va putea sa le decripteze.
“Message Digests” (Digerarea mesajelor)
Deși Alina poate cripta mesajul ei pentru a-l face privat, totuși există posibilitatea ca cineva să modifice mesajul ei original ori să-l înlocuiască cu unul diferit, în scopul tranferării banilor catre conturile lor, de exemplu. O metodă pentru garantarea integrității mesajului Alinei este crearea unui rezumat al mesajului și trimiterea acestuia către bancă de asemenea. La recepționarea mesajului, banca crează propriul sumar al mesajului și îl compară cu cel primit de la Alina. Dacă cele două rezumate sunt la fel, atunci mesajul a fost recepționat intact.
Un rezumat al mesajelor, ca acesta, este denumit “message digest”, sau one-way hash(hash într-un singur sens). “Message digest” este folosit pentru a crea o reprezentareare scurtă, de lungime fixă, a unor mesaje lungi, de lungime variabilă. Algoritmii de “digerare” sunt proiectați să producă “digerări” unice pentru mesaje diferite. “Message digest” este proiectat astfel încât să fie prea greu să deosebești mesajul de “digerare”, și de asemenea să fie imposibil să găsești două mesaje diferite ce crează aceeași “digerare” , astfel eliminându-se posibilitatea subtituirii unui mesaj cu altul, în timp ce se păstrează aceeași “digerare”.
O altă provocare pe care Alina o întâlnește, este găsirea unui mod de a trimite “digerarea” către bancă într-un mod securizat; când acest lucru este realizat, integritatea mesajului asociat este asigurat. O metodă pentru a realiza acest lucru este includerea “digerarii” într-o semnătură digitală.
Semnăturile digitale
Când Alina trimite un mesaj către bancă, banca trebuie să se asigure că mesajul este trimis întradevăr de Alina și nu de altcineva, astfel încât un hoț să nu poată cere realizarea unei tranzacții ce include și contul Alinei. O semnătură digitală , creată de Alina și inclusă în mesaj, servește acestui scop.
Semnăturile digitale sunt create prin criptarea “digerării” mesajului, și a altei informații (de exemplu a unui număr de index), cu cheia privată a transmițătorului. Deși toată lumea poate decripta semnătura folosind cheia publică, numai proprietarul semnăturii știe cheia privată. Aceasta însemna ca numai el a putut-o semna. Includerea “digerării” în semnătură, înseamnă că aceasta este bună numai pentru acest mesaj; de asemenea asigură integritatea mesajului având în vedere că nimeni nu poate schimba “digerarea” și în același timp să o semneze. Pentru protejarea împotriva interceptării mesajului și refolosirea semnăturii la un moment ulterior de către un hoț, semnătura conține un număr de index unic. Acesta protejează banca de o declarație frauduloasă cum că ea nu a trimis acel mesaj, ci doar l-a semnat (non-repudiere).
2.3.2 Certificatele
Deși Alina poate trimite un mesaj privat bancii, îl poate semna, poate asigura integritatea mesajului, totuși ea trebuie să fie sigură că, întradevăr comunică cu banca, atunci cănd trimite acest mesaj. Aceasta înseamnă că ea trebuie să fie sigură că cheia publică pe care o folosește corespunde cu cheia privată a băncii. Reciproc, banca trebuie să verifice că semnătura mesajului corespunde întradevăr cu semnătura Alinei. Dacă fiecare parte are un certificat ce validează identitatea celuilalt, confirmă cheia publică, și este semnat de o agenție de încredere, atunci amăndoi vor fi asigurați că întradevăr comunică cu cel cu care cred că comunică. O astfel de agenție de încredere se numește Autoritate de certificate(Certificate Authority), iar certificatele sunt folosite pentru autentificare.
Conținutul certificatelor
Un certificat asociază o cheie publică cu identitatea reală a unui individ, server, sau altă entitate, cunoscut sub numele de subiect. Așa cum se arată în tabelul următor, informațiile despre subiect includ informații de identificare (numele distinctiv), și cheia publică. De asemenea, include identificarea și semnătura Autorității de Certificate ce a emis acest certificat, împreună cu durata în care acest certificat este valid. Poate conține informații adiționale (sau extensii), precum și informații administrative pentru folosința Autorității de Certificate, cum ar fi un număr serial.
Informațiile unui certificat
Un nume distinctiv este folosit pentru a genera o identitate într-un context specific, de exemplu un individ poate avea un certificat personal și pentru a arăta că este angajat al unei anume companii. Numele distinctive sunt definite de standardul X.509, ce definește câmpurile, numele câmpurilor, și abrevierile folosite pentru referirea la câmpuri.
Informațiile unui nume distinctiv
O Autoritate de certificate poate defini o politică de tratare a certificatelor, specificând ce nume ale câmpurilor distinctive sunt opționale, și care sunt obligatorii. De asemenea, autoritatea poate stabili ce anume să conțină aceste câmpuri, așa cum pot și utilizatorii acestor certificate. Ca un exemplu, un browser Netscape necesită ca Numele Comun pentru un certificat reprezentând un server, să fie o expresie regulată ce intră în clasa de nume a domeniului acelui server, de exemplu *.opengroup.org.
Formatul binar al unui certificat este definit folosind notația ASN.1 . Această notație definește cum să fie speficicat conșinutul, iar regulile de codificare definesc cum această informație este translatată în formă binară. Codarea binară a certificatului este definită folosind Regulile de Codificare Distinctive (Distinguished Encoding Rules), abreviate cu (DER), care sunt bazate pe mult mai generalele Reguli de Codificare de BAZĂ (Basic Encoding Rules) (BER). Pentru acele transmisii ce nu pot suporta transferul binar, forma binară a certificatului poate fi transformată într-o formă ASCII folosind codificarea base64. Această formă este denumită codificată PEM, atunci când este așezată între liniile de tipul următor:
––BEGIN CERTIFICATE––
MIIC7jCCAlegAwIBAgIBATANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCWFkx
FTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25ha2UgVG93bjEXMBUG
A1UEChMOU25ha2UgT2lsLCBMdGQxHjAcBgNVBAsTFUNlcnRpZmljYXRlIEF1dGhv
cml0eTEVMBMGA1UEAxMMU25ha2UgT2lsIENBMR4wHAYJKoZIhvcNAQkBFg9jYUBz
bmFrZW9pbC5kb20wHhcNOTgxMDIxMDg1ODM2WhcNOTkxMDIxMDg1ODM2WjCBpzEL
MAkGA1UEBhMCWFkxFTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25h
a2UgVG93bjEXMBUGA1UEChMOU25ha2UgT2lsLCBMdGQxFzAVBgNVBAsTDldlYnNl
cnZlciBUZWFtMRkwFwYDVQQDExB3d3cuc25ha2VvaWwuZG9tMR8wHQYJKoZIhvcN
AQkBFhB3d3dAc25ha2VvaWwuZG9tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
gQDH9Ge/s2zcH+da+rPTx/DPRp3xGjHZ4GG6pCmvADIEtBtKBFAcZ64n+Dy7Np8b
vKR+yy5DGQiijsH1D/j8HlGE+q4TZ8OFk7BNBFazHxFbYI4OKMiCxdKzdif1yfaa
lWoANFlAzlSdbxeGVHoT0K+gT5w3UxwZKv2DLbCTzLZyPwIDAQABoyYwJDAPBgNV
HRMECDAGAQH/AgEAMBEGCWCGSAGG+EIBAQQEAwIAQDANBgkqhkiG9w0BAQQFAAOB
gQAZUIHAL4D09oE6Lv2k56Gp38OBDuILvwLg1v1KL8mQR+KFjghCrtpqaztZqcDt
2q2QoyulCgSzHbEGmi0EsdkPfg6mp0penssIFePYNI+/8u9HT4LuKMJX15hxBam7
dUHzICxBVC1lnHyYGjDuAMhe396lYAn8bCld1/L4NMGBCQ==
––END CERTIFICATE––
Exemplu de certificat codificat PEM
2.3.3 Autoritățile de Certificate
Prin verificarea informațiilor din cererea unui pentru certificat înainte de a-l emite, Autoritatea de Certificate asigură identitatea proprietarului unei chei private ce provine dintr-o pereche de chei. De exemplu, dacă Alina face o cerere pentru un Certificat Personal, Autoritatea de Certificate trebuie să se asigure că Alina este întradevăr persoana care scrie în cerere că este.
Lanțuri de certificate
O Autoritate de Certificate poate de asemenea să emită un certificat pentru altă Autoritate de Certificate. Când examinează certificatul, Alina poate avea nevoie să examineze certificatul emițătorului de certificate, pentru fiecare Autoritate de Certificate părinte, până când ajunge la una în care ea are încredere. Ea se poate decide să se încreadă numai în certificate cu un număr limitat de emițători, pentru a reduce riscul unui certificat “rău” în lanț.
Crearea unei Autorități de Certificate de cel mai înalt nivel
Așa cum am arătat mai devreme fiecare certificat necesită un emițător care să afirme validitatea identității subiectului certificatului, până la Autoritatea de Certificate de cel mai înalt nivel. Acest lucru prezintă o problemă: dacă certificatul este semnat de cea mai înaltă Autoritate de Certificate, atunci cine este cel care autorizează acest certificat ? În acest unic caz, certificatul este „autosemnat”, așa că emițătorul certificatului este același cu subiectul. Ca rezultat, oamenii trebuie să aibă mare grijă atunci când se încred într-un certificat autosemnat. Publicarea pe scară largă a cheii publice a Autorității de Certificate de cel mai înalt nivel, reduce riscul încrederii în această cheie (autosemnată) – ar fi evident dacă altcineva încearcă să publice o cheie pretinzând ca el este autoritatea.
Un număr de companii, cum ar fi VeriSign, s-au proclamat singure ca Autorități de Certificate. Aceste companii oferă următoarele servicii:
Verificarea cererilor de certificate
Procesarea cererilor de certificate
Emiterea și administrarea certificatelor
Este de asemenea posibil crearea propriei tale Autorități de Certificate. Deși destul de riscant în mediul Internetului, aceasta poate fi foarte folositoare într-un Intranet unde organizația respectivă poate foarte ușor să verifice identitățile indivizilor și a serverelor.
Administrarea certificatelor
Crearea unei Autorități de Certificate este o responsabilitate pe mai multe nivele: din punct de vedere administrativ, tehnic și managerial. Autoritățile de Certificate nu numai emit certificate, ci și le administrează – ceea ce însemnă: stabilesc cât timp aceste certificate sunt valide, le reînnoiesc, și mențin liste cu certificatele care au fost emise dar nu mai sunt valide (Certificate Revocation Lists, sau CRL). Să presupunem că Alina este în drept să aibă un certificat, în calitate de angajat al unei companii. Să presupunem de asemenea că certificatul trebuie retras atunci când Alina părăsește compania. Deoarece certificatele sunt ceva care se tot transmit de la un loc la altul, este imposibil să spunem din certificat că el a fost retras. Astfel, când se verifică certificatele pentru validitate, este necesar și contactarea Autorității de Certificate emițătoare pentru a verifica CRL – de obicei aceasta nu este o parte automată a procesului descris până acum.
Dacă un utilizator folosește o Autoritate de Certificate ce nu este configurată în browser în mod implicit, este necesară încărcarea certificatului Autorității de Certificate în browser, permițând astfel browser-ului să valideze certificate de server semnate de această Autoritate de Certificate.
2.3.4 Protocolul Secure Sockets Layer (SSL)
Protocolul Secure Sockets Layer este un nivel de protocol ce poate fi așezat între un nivel de protocol de rețea orientat pe conexiune (de exemplu TCP-IP) și nivelul de protocol al aplicațiilor (de exemplu HTTP). SSL aduce, pentru comunicații sigure între clienți și un server prin autentificare mutuală, folosirea semnăturilor digitale pentru integritate și criptare pentru intimitatea informațiilor.
Protocolul este proiectat să suporte o gamă largă de algoritmi folosiți pentru criptografie, “digerare”, și semnături. Aceasta permite selecția algoritmilor pentru servere specifice să fie făcută pe baze legale ori pe alte privințe, și de asemenea permite protocolului să aibă avantajul folosirii noilor algorimi apăruți în timp. Alegerile sunt negociate între client și server la începutul stabilirii unei sesiuni de protocol.
Există mai multe versiuni ale protocolului SSL. Așa cum e arătat în următorul tabel, una din facilitățile SSL v3.0 este că adaugă suport pentru lanțuri de certificate. Această facilitate permite unui server să trimită browser-ului certificatul serverului împreună cu certificatele emițătorilor. Lanțurile de certificate permit de asemenea browser-ului să valideze certificatul serverului, chiar dacă certificatele Autorităților de Certificate nu sunt instalate pentru emițătorii intermediari, deoarece ei sunt incluși în acest lanț. SSL v3.0 este baza pentru protocolul Transport Layer Security, în acest momemt în dezvoltare de către Internet Engineering Task Force (IETF).
Realizarea unei sesiuni SSL
Sesiunea SSL este realizată urmându-se o secvență de negociere (handshake sequence ) între client și server, așa cum e arătat în următoarea figură. Această secvență poate varia, în funcție de server, dacă acesta este configurat să ofere un certificat de server ori să ceară un certificat de client. Deși există și cazuri unde sunt necesari și alți pași adiționali, în figura următoare este prezentat un caz obișnuit de negociere:
Odată ce o sesiune SSL s-a stabilit, ea poate fi refolosită, evitând astfel scăderile de performanță datorate repetării unor pași pentru repornirea sesiunii. Pentru aceasta serverul alocă fiecărei sesiuni SSL un identificator unic, ce este păstrat în cache și pe care clientul îl poate refolosi la viitoarele conexiuni, pentru a reduce timpul de negociere (bineînteles, până când identificatorul este șters din memoria cache).
Elementele unei secvențe de negociere, așa cum sunt folosite de client și server, sunt următoarele:
Negociază suita de criptare folosită în timpul transferului de date
Stabilește și comunică o cheie de sesiune între client și server
Opțional autentifică server la client
Optional autentifică clientul la server
Primul pas, negocierea suitei de criptare, permite clientului și serverului să aleagă o suită ce este “știută” de amândoi. Specificațiile protocolului SSL3.0 definesc 31 suite de cifruri. O suită de cifru este definită de următoarele componente:
Metoda de interschimbare a cheii
Cifrul ales pentru transferul de dateCipher for Data Transfer
“Digerarea” mesajului pentru crearea Codului de Autentificare a Mesajului (Message Authentication Code – MAC)
Metoda de interschimbare a cheii
Metoda de interschimare a cheii definește cum este aleasă și acceptată de client și de server cheia comună secretă folosită pentru transferul datelor. SSL 2.0 folosește numai interschimbarea de chei RSA, în timp ce SSL 3.0 suportă alegerea unei chei RSA atunci când sunt folosite certificatele, precum și o cheie de tip Diffie-Hellman pentru interschimbarea cheilor fără certificate și fără o comunicare anterioară intre client și server.
O variabilă în metodele de alegere a cheilor o reprezintă semnăturile digitale – să fie folosite sau nu, și dacă da, ce tip de semnături de fie folosite. Semnarea cu o cheie privată asigură protecție împotriva situației “om în mijlocul unui atac” în timpul schimbului de informații folosit în generarea cheii interschimbabile.
Cifrul folosit pentru transferul de date
SSL folosește algoritmul de criptografie convențională (criptografie simetrică) pentru criptarea mesajelor într-o sesiune. Există 9 opțiuni, încluzând-o pe aceea de a nu alege nici un tip de criptare:
Fără criptare
Cifruri Stream
RC4 cu chei de 40-biți
RC4 cu chei de 128-biți
Cifruri CBC pe blocuri
RC2 cu cheie de 40 biți
DES cu cheie de 40 biți
DES cu cheie de 54 biți
Triple-DES cu cheie de 168 biți
Idea (cheie de 128 biți)
Fortezza (cheie de 96 biți)
"CBC" reprezintă Cipher Block Chaining, ceea ce înseamnă că o parte din textul criptat mai înainte este folosit pentru criptarea blocului curent de text. "DES" se referă la Data Encryption Standard, care are un număr de variante (ce include și DES40 și 3DES_EDE). "Idea" este unul dintre cele mai bune și, criptografic, unul dintre cei mai puternici algoritmi de criptare, iar "RC2" este un algoritm proprietar RSA DSI.
Funcția de “digerare”
Alegerea funcției de “digerare” determină cum este creat acel rezumat dintr-o unitate de înregistrare (text de transmis). SSL suportă următoarele:
Fără rezumat
MD5, un hash pe 128 biți
Secure Hash Algorithm (SHA-1), un hash pe 160 biți
Rezultatul mesajului este folosit pentru crearea Message Authentication Code (MAC), ce este criptat cu mesajul pentru a oferi integritate și pentru a preveni împotriva atacurilor de răspuns.
Protocolul secvenței de negociere
Sevența de negociere folosește trei protocoale:
SSL Handshake Protocol pentru realizarea sesiunii între client și server.
SSL Change Cipher Spec Protocol pentru alegerea suitei de cifrare pentru această sesiune.
SSL Alert Protocol pentru transmiterea de mesaje de eroare între client și server.
Aceste protocoale, ca și protocolul de date de aplicație, sunt încapsulate în SSL Record Protocol, așa cum se arată în figura următoare. Un protocol încapsulat este trimis ca date de un protocol de nivel inferior, ce nu examinează datele. Protocolul de nivel inferior nu are nici o informație despre protocolul pe care îl transportă.
Încapsularea protocolului de control SSL, de către protocolul de înregistrare, asigură că, în cazul renegocierii sesiunii, protocolul de control va fi transmis în mod securizat. Dacă nu a existat o sesiune înainte suita de cifruri nulă este folosită, ceea ce înseamnă că nu există criptare și mesajele nu au nici o integritate până când o sesiune nu a fost stabilită.
Transferul de date
Protocolul SSL de Înregistrare, așa cum se arată în figura următoare, este folosit pentru transmiterea datelor de control și de aplicație între client și server, posibil fragmentând aceste date în pachete mai mici, sau să combine multiple mesaje de date de protocol foarte înalt într-o singură unitate. El poate comprima, atașa semnături de rezumat și cripta aceste unități de date, înainte de a le transmite folosind un protocol de transport inferior.
Securizarea comunicației HTTP
O folosire obișnuită a SSL este securizarea unei comunicații Web HTTP între un browser și un webserver. Versiunea securizată este HTTP peste SSL (numită HTTPS), cu marea diferență că folosește schema https , în loc de http și un port de server separat (implicit portul 443). Aceasta este motivul pentru care este folosit mod_ssl în Apache.
2.4 MySQL
SQL (Structured Query Language) a fost dezvoltat în 1970 în laboratoarele IBM din San Jose, California. A fost creat inițial pentru produsul DB2 de la IBM, un sistem de gestiune a bazelor de date relaționale, RDBMS, care poate fi întâlnit încă în multe medii de programare. SQL este un limbaj nonprocedural, spre deosebire de limbajele procedurale de genearatia 3 (3GLs) cum sunt COBOL și C SQL, limbaje ce fuseseră create până atunci.
MySQL este un server de baze de date SQL, multi-user și multi-threaded. SQL este cel mai popular limbaj de baze de date din lume. MySQL este o implementare client/server ce consta
într-un "deamon server" multe programe client, precum și biblioteci. Avantajele principale ale MySQL sunt: viteza, robustețea și ușurința în utilizare. Firma care a creat MySQL îl utilizează din 1996 într-un mediu cu peste 40 de baze de date conținând 40.000 de tabele, din care peste 500 au mai mult de 7 milioane de rânduri. MySQL este încă în construcție, dar oferă deja un set de funcții foarte performant.
Caracteristici MySQL :
Poate utiliza mai multe unități centrale daca sunt disponibile în sistem.
Lucrează pe platforme diferite.
Tipuri de date: întreg, cu semn sau fără de lungime de 1,2,3,4 sau 8 bytes (signed/unsigned integers 1, 2, 3, 4 and 8 bytes long), numere zecimale cu precizie simpla sau dubla (FLOAT, DOUBLE), caracter(CHAR), caracter cu lungime variabila(VARCHAR), TEXT, BLOB, data(DATE), timp(TIME), data și timp(DATETIME), TIMESTAMP, an(YEAR), SET and enumerare(ENUM).
Operația JOIN foarte rapida, utilizând un multi-join optimizat.
Funcțiile SELECT și WHERE suporta ca parametrii atât operatori cit și funcții Exemplu: mysql> SELECT CONCAT(first_name, " ", last_name) FROM tbl_name WHERE income/dependents > 10000 AND age > 30;
După inițializarea cererii nu mai exista nici o alocare de memorie.
Sunt implementate clauzele SQL: GROUP BY și ORDER BY . De asemenea funcțiile de grupare: COUNT(), AVG(), STD(), SUM(), MAX() and MIN().
Oferă suport pentru LEFT OUTER JOIN cu sintaxa ANSI SQL și ODBC.
Se pot include tabele din baze de date diferite în aceeași cerere (query).
Un sistem de privilegii și parole foarte sigur și flexibil, care permite verificarea la nivelul mașinii gazda (host-based verification). Toate parolele pentru conectarea la baza de date sunt codificate.
ODBC (Open-DataBase-Connectivity) pentru Windows95 (cu sursa). Toate funcțiile ODBC 2.5 și multe altele.
Sunt permiși 16 indecși pentru o tabela . Fiecare index poate fi din 1 până la 15 coloane sau părți din coloane. Lungimea maxima a unui index este de 256 de bytes (poate fi schimbată prin recompilarea MySQL). Un index poate utiliza doar prefixul unui câmp de tip CHAR sau VARCHAR.
Înregistrări cu lungime fixa și variabila.
Tabele HASH în memorie care sunt utilizate ca tabele temporare.
Dimensiunea maxima a bazei de date: 50,000,000 de înregistrări.
Toate coloanele au valori implicite. Se poate modifica doar o parte din coloanele tabelei cu comanda INSERT. Coloanele cărora nu le-a fost explicit atribuita o valoare, vor fi inițializate cu valorile implicite.
Pentru portabilitate utilizează GNU Automake, Autoconf, și libtool.
Un sistem de alocare a memoriei foarte rapid bazat pe thread-uri.
Include isamchk,un utilitar foarte rapid pentru verificarea tabelelor, optimizare și reparare.
Suport pentru setul de caractere ISO-8859-1 Latin1.
Toate datele sunt salvate în formatul ISO-8859-1 Latin1. Toate operațiile de comparare pentru șiruri nu țin cont de majuscule.
Sortarea este făcuta conform setului de caractere ISO-8859-1 Latin1.
Permite alias-uri în tabele și coloane conform standardului SQL92.
DELETE, INSERT, REPLACE, și UPDATE întorc numărul de linii afectate.
Coloanele și tabelele pot avea și nume de funcții. Singura restricție este să nu existe spații între numele funcției și ‘(‘.
Serverul poate afișa mesajele de eroare în mai multe limbi.
Clienții se pot conecta la serverul MySQL utilizând conectare TCP/IP sau "Unix sockets",sau "named pipes" în Win NT.
Comanda specifică MySQL , SHOW, este utilizată pentru a obține informații despre bazele de date, tabele și indecși. Comanda EXPLAIN este utilizata pentru a determina modul in care optimizatorul rezolva o cerere.
2.5 PHP
Exista demult suport pentru „client-side scripting”, implementat cu JavaScript. Insă, în contextul actual al dinamismului și interactivității, surfer-ul nu mai asista pasiv la citirea unei pagini de web, ci își poate exprima opiniile, poate selecta ce informații să-i fie prezentate regulat la vizitarea unui site sau poate face cumpăraturi într-un magazin virtual. Toate aceste facilități sunt oferite prin folosirea bazelor de date și a limbajelor de scripting executate pe serverul de web. ASP și Cold Fusion sunt doua dintre acestea, fiind disponibile comercial. Concurentul OpenSource al acestora este PHP.
PHP a fost conceput în toamna lui 1994 de către Rasmus Lerdorf pentru a ține evidența celor care i-au citit pagina de web. Prima versiune s-a numit "Personal Home Page Tools". Versiunea ulterioara s-a numit PHP/FI Version 2. Combinând scripturile Personal Home Page Tools cu "Form Interpreter" și adăugând suport pentru mSQL a obținut PHP/FI. Statistic, în 1996 PHP/FI era utilizat în 15.000 site-uri de web, iar în 1997 în 50.000. În 1998 PHP este utilizat în peste 150.000 site-uri.
PHP este un limbaj de “scripting” utilizat pentru crearea paginilor dinamice de web pentru comerț electronic și alte aplicații web. O pagina dinamica de web este o pagina care interacționează direct cu utilizatorul. Paginile dinamice de web sunt necesare site-urilor de comerț electronic pentru ca se generează in funcție de o baza de date sau de alte surse externe.
Scriptul PHP este rulat la nivel de SERVER. Sintaxa PHP este o combinație intre limbajele C, Java și Perl. Spre deosebire de alte limbaje de “scripting” folosite pentru dezvoltarea de pagini web PHP oferă o excelenta conectivitate cu majoritatea tipurilor de baze de date (Oracle, Sybase, MySQL, ODBC și multe altele) și rulează pe majoritatea sistemelor de operare (Unix, Windows,Linux ect.).
Serverul de WEB trebuie să aibă activat suportul pentru PHP. Toate fișierele care au extensia .phpx trebuie să fie rulate de către motorul PHP. Fișierele se creează în aceeași maniera ca și fișierele HTML.
Funcții PHP pentru interogarea bazelor de date MySQL
Capitolul 3
Proiectare aplicație
Aplicația necesită pentru funcționare un server web (Apache), compilator de php pentru execuția scripturilor php3 și un server MySql pentru baze de date.
Magazinul virtual oferă posibilitatea a cumpărării de calculatoare prin internet și plata acestor produse prin banca sau o confirmare a plății prin fax.
Aplicația pentru site-ul de vânzare este bazată pe următoarea schemă:
în care :
Clientul este un program de navigare pentru interfața magazinului virtual prin intermediul căreia se aleg produsele și se face autentificare prin certificate SSL sau prin username și parola; după identificarea clientului se introduc datele prin care se face plata ( în cazul plății prin banca, a seriei cărții de credit, deoarece conexiunea online este acum sigura ).
Magazinul virtual este format din:
Un server web Apache cu modulele mod_php și mod_ssl incluse, ce accepta conexiunile programelor de navigare și realizează conexiunile sigure.
Scripturi PHP3 pentru rapoarte și actualizarea bazei de date;
Baza de date MySQL pentru produse, clienți și conturile lor;
Autoritatea de certificate este alcătuită din:
un server Apache cu module mod_ssl și mod_php incluse ce realizează conexiuni sigure SSL.
Scripturi PHP3 ce permit cererea, crearea, încărcarea și administrarea de certificate SSL.
Pentru a realiza deci securizarea unui site electronic, una dintre metode este folosirea certificatelor. Cea care se ocupă cu administrarea certificatelor este Autoritatea de Certificate. Pentru a implementa o Autoritate de Certificate sunt necesare următoarele pachete software: un sistem de operare Linux, OpenSSL, un server web Apache cu implementare a protocolului SSL prin modulul mod_ssl, o bază de date MySQL pentru înregistrarea cererilor și datelor aplicației.
Fluxul datelor pentru această Autoritate de Certificate ar putea fi ca în următoarea imagine:
Clienții acestei Autorități de Certificate, numită de mine RomSign, vor fi deci indivizi privați ce doresc să cumpere de la un magazin virtual, configurat să necesite un certificat personal, sau administratori de servere web, ce doresc să-și securizeze site-ul, în speță administratorul site-ului virtual.
Din punctul de vedere al unui client ce dorește un certificat personal, interfața aplicației l-ar purta prin următorii pași:
Clientul se conectează cu ajutorul unui browser la pagina principală a site-ului autorității de certificate RomSign
Alege calea pentru certificatele personale
Încarcă în browser-ul său certificatul Autorității de Certificate. Browser-ul îl va ghida pe client pentru instalarea acestuia în el.
Completează o cerere pentru crearea unui certificat personal, în care scrie date ce îl descriu ca individ social: țara, statul(provincia), localitatea în care trăiește, organizația în care face parte, departamentul organizației, numele și adresa de email. Software-ul de navigare va genera atunci o cheie publică ce este trimisă serverului odată cu datele introduse.
Așteaptă ca Autoritatea de Certificate să verifice datele introduse de el, și să primească la adresa de email scrisă, un email cu confirmarea sau refuzul autorității de a genera certificatul. În cazul unei autorități de certificate reale, acest proces ar dura câteva zile. În cadrul email-ului de confirmare este trimisă și o parolă de autentificare.
În cazul afirmativ clientul apasă pe calea de obținere a certificatului personal, și i se cere parola primită prin email, pentru a verifica că întradevăr, el este clientul care a introdus datele.
În cazul în care clientul introduce parola corectă, aplicația detectează ce tip de software de navigare folosește, și ii încarcă acestuia certificatul personal generat.
În acest moment clientul se poate conecta la site-ul de magazin virtual pentru a-și face autentificarea la serverul web SSL al acestuia, cu ajutorul certificatului personal obținut, conexiunile HTTP viitoare, între browser-ul clientului și magazinul virtual, fiind de tip HTTPS.
Din punctul de vedere al unui client ce dorește un certificat pentru un server web SSL, interfața aplicației l-ar purta prin următorii pași:
Clientul se conectează la pagina principală a site-ului autorității de certificate RomSign.
Alege calea pentru certificatele server web.
Completează o cerere pentru crearea unui certificat pentru un server web, în care scrie date ce descriu cui aparține serverul web: țara, statul(provincia), localitatea, organizația, departamentul din cadrul organizației, numele de domeniu al serverului web (de exemplu little.p16.pub.ro), adresa de email.
Așteaptă ca autoritatea de certificate să verifice datele introduse, și să primească la adresa de email scrisă un email cu confirmarea sau refuzul autorității de a genera certificatul pentru serverul web. Odată cu email-ul de confirmare este trimisă și o parolă de autentificare.
În cazul afirmativ clientul apasă pe calea de obținere a certificatului pentru server web.
Descarcă certificatul autorității de certificate, un fișier numit “cacert.pem” necesar pentru server-ul de web.
Descarcă cheia privată a viitorului server web SSL, într-un fisier numit “severkey.pem”. De obicei, în mod practic acest trebuia realizat printr-o metodă fizică reală de transport, pentru păstrarea integrității și securității cheii private (adică această cheie este scrisă pe o dichetă, iar aceasta trimisă prin poșta de scrisori la administratorul serverului web client).
Descarcă certificatul viitorului server web SSL într-un fișier numit “servercert.pem”.
Își configurează serverul web SSL pentru a porni cu certificatele astfel generate.
În orice moment clientul autorității de certificate poate apela la sistemul de ajutor precum și la dicționar, create pentru înțelegerea certificatelor și a modului cum interacționează acestea cu programele de navigare (obținerea și instalarea certificatelor).
Din punctul de vedere al administratorului autorității de certificate, interfața aplicației l-ar purta prin următorii pași:
Se conectează prin HTTPS, cu ajutorul unui certificat ce îi demonstrează identitatea, la serverul de administrare al autorității.
De aici poate aproba sau rejecta cererile de certificate, vizualiza certificatele aprobate și vizualiza certificatele emise. În toate cazurile poate alege pe ce tip de certificate să se genereze rapoartele (personale sau pentru servere web).
În cazul în care alege vizualizarea certificatelor, administratorul obține rapoarte privind certificatele aprobate, respectiv emise.
În cazul în care alege să aprobe/rejecteze certificate, administratorului i se afișează un raport cu toate cererile facute pentru certificate personale, respectiv pentru servere de web cu SSL.
Din raportul generat, el poate alege care cerere să fie aprobată. În acest caz i se cere o parola cu care a fost generată cheia privată a certificatului autorității, pentru generarea și semnarea certificatului cerut. În acest moment certificatul a fost generat, iar clientului i se va trimite un email de confirmare, ce conține o parolă de autentificare.
Pentru a realiza fluxul descris mai sus, după instalarea pachetelor software folosite, trebuie realizate următoarele acțiuni.
3.1 OpenSSL
Se generează o nouă autoritate de certificate prin configurarea pachetului software OpenSSL 0.9.6 și rularea comenzilor de generare a certificatului autosemnat. Deoarece avem nevoie pentru serverul de web al RomSign și de un certificat de tip web server, se generează de asemenea și acest certificat, semnat cu ajutorul certificatului autosemnat.
3.2 Serverul WEB
Deoarece avem nevoie de un server web normal, public, pentru interfața cu clienții, care să raspundă la un URL de genul „http://www.romsign.ro”, se configurează un proces de server web Apache versiunea 1.3.12 pentru portul 80, care să prezinte partea aplicației pentru clienți.
Avem nevoie și de un proces de server web Apache care să fie securizat, pentru administrarea autorității de certificate, astfel că el este configurat să funcționeze pe portul 443, cu opținea SSLVerifyClient activată, astfel încât, prezumtivul administrator, la conectare, să prezinte un certificat personal pentru autentificare.
Deoarece, din motive practice, aceste două servere web funcționează pe același calculator gazdă, server-ul web trebuie configurat cu optiunea de host-uri virtuale pe același IP, cu nume diferite.
3.3 Baza de date
Pentru păstrarea informațiilor din cererile de certificate, și pentru pastrarea stărilor certificatelor (cerere, aprobat, emis), este necesară crearea unei mini baze de date MySQL, numită “romsign”, ce conține o singură tabelă. Există o singură tabelă deoarece, pachetul OpenSSL menține o aceeași structură de indexare pentru ambele tipuri de certificate. Structura tabelei este următoarea:
+––––+––––––––––-+–-+–+–––––––+–––––-+
| Field | Type |Null|Key| Default | Extra |
+––––+––––––––––-+–-+–+–––––––+–––––-+
| id | int(3) | |PRI| NULL | auto_increment |
| browser | enum('ie','ns') | | | ie | |
| userpasswd | varchar(255) | | | | |
| passwd | varchar(16) | | | | |
| serial | int(3) |YES | | -1 | |
| commonname | varchar(255) | | | | |
| country | char(2) | | | | |
| state | varchar(255) | | | | |
| locality | varchar(255) | | | | |
| org | varchar(255) | | | | |
| orgunit | varchar(255) | | | | |
| email | varchar(255) | | | | |
| withkey | int(1) | | | 0 | |
| data | datetime | | | 0000-00-00 00:00:00 | |
| stare |enum('cerere','aprobat','emis')| | | cerere | |
| tip |enum('personal','server') | | | personal | |
+––––+––––––––––-+–-+–+–––––––+–––––-+
Descrierea acestor câmpuri este după cum urmează:
Id este cheia primară a tablei, un câmp ce identifică în mod unic fiecare înregistrare, în consecință fiecare cerere. Este echivalent cu indexul generat de pachetul OpenSSL pentru certificatele generate.
Browser este un câmp enumerare ce conține doar valorile „ns” și „ie”, adică acronimele singurelor programe de navigare acceptate de aplicație: Netscape Navigator și Internet Explorer (deoarece acestea sunt singurele browser-e ce cunosc protocolul SSL într-un mod standardizat)
Serial este numărul serial corespunzător certificatului generat.
Commonname reprezintă numele distinctiv al individului sau serverului de web
Userpasswd este un câmp ce conține, în cazul cererilor de certificate pentru servere web, parola introdusă de client pentru certificatul site-ului său.
Passwd este un câmp ce conține o parolă generată în mod aleator, pentru recunoașterea clientului în momemtul în care acesta dorește să-și descarce certificatul generat.
Country este un câmp ce conține țara clientului
State este un câmp ce conține provincia/județul clientului
Locality este un câmp ce conține orașul clientului
Org conține organizația din care face parte clientul
Orgunit conține departamentul în cadrul organizației din care face parte clientul.
Email este adresa de email a clientului.
Withkey este un câmp de tip boolean, ce arată dacă clientul (administrator al unui server web) a renunțat sau nu la parola de pornire a serverului său.
Data este un câmp ce conține data și ora la care s-a făcut cererea.
Stare este un câmp enumerare ce conține valorile “cerere”, „aprobat”, „emis”, ce descriu starea cererii de certificat la un moment dat. “cerere” pentru cazul în care certificatul nu este încă aprobat; “aprobat” dacă acesta a fost aprobat; “emis” dacă certificatul a fost deja descărcat de client, în consecință acest certficat nu mai trebuie emis catre nimeni încă o dată.
Tip este un câmp ce descrie tipul certificatului: personal sau pentru server web.
3.4 Scripturile PHP
Scripturile PHP sunt de fapt cele care reprezintă motorul aplicației. Pentru interfața către client există un modul client, alcătuit din fișiere html și php3 (ce conțin și cod de Javascript).
Paginile web sunt realizate cu frame-uri, existând unul numit “up”, ce conține un fel de meniu cu legături către paginile principale, și un frame “down”, ce conține alte două: “left” ce conține un scurt grup de legături, și “center”, ce reprezintă fereastra principală a aplicației. Pentru generarea frame-urilor “up” și “left” s-a folosit cod HTML, iar pentru “center” scripturi php3.
Pentru afișarea cu un anumit stil a paginilor de web (aceleași culori, etc.) s-a folosit un fișier tip Cascading Style Sheets numit “all.css”.
Client
Pentru partea de client scriptul “dispatcher.php3” realizează detectarea tipului de browser al clientului, trimițându-l la pagina corespunzătoare, iar în cazul în care clientul folosește un Internet Explorer mai mic de versiunea 4 sau un Netscape Navigator mai mic de versiunea 4, îl trimite la scriptul “nobrowser.php3” ce afișează un mesaj de refuz.
Pentru certificatele personale este folosit scriptul “personal.php3” ce afișează o pagină cu legăturile pentru un astef de client. În cazul în care clientul încearcă să-și descarce certificatul personal, aici există un script JAVASCRIPT, care îi cere parola primită în email-ul de confirmare.
“nsenroll.php3” realizează generarea formei pentru introducerea datelor pentru cerere, verificarea existenței certificatului aprobat, și legătura catre scriptul de încărcare a certificatului personal în browser. Toate acestea pentru Netscape Navigator 4, sau mai mare.
“ieenroll.php3” realizează aceleași lucruri pentru Internet Explorer 4.0 sau mai mare.
Pentru introducerea certificatului autorității de certificate in browser, s-au creat scripturile “importnsca.php3” și “importieca.php3”, pentru Netscape , respectiv Internet Explorer.
Pentru certificatele pentru servere web, scriptul “generator.php3” realizează generarea formei pentru introducerea datelor, verificarea existenței certificatului aprobat, și legatura către scriptul de descărcare a certificatului autorității, a cheii private și a certificatului cerut.
“loadsslcrt.php3” este scriptul de încărcare a certificatului autorității, a cheii private sau a certificatului cerut, în cazul certificatelor pentru servere web.
“ieupdate.php3” este un script ce reactualizează baza de date, în cazul în care clientul folosește Internet Explorer pentru descărcarea certificatului, trecând câmpul stare al certificatului aprobat, pe “emis”.
Nu în ultimul rând “ajutor.php3” este scriptul ce generează paginile de ajutor pentru clienții RomSign.
Administrare
Pentru partea de administrare, “admin.php3” are același rol ca și dispatcher.php3. “view.php3” generează rapoartele pentru administrator, iar “sign.php3” este scriptul care realizează efectiv crearea și semnarea certificatelor din cererile trimise de clienți.
Capitolul 4
Implementarea aplicației
Aplicația rulează pe sistem de operare SuSE Linux 7.0, cu un kernel 2.4.4. Structura directoarelor acestei distribuții este asemenătoare unei distribuții Linux Slackware, pachetele noi aduse fiind recomandabil să fie păstrate în directorul „/usr/local/”. De asemenea serverul web Apache are fisierele de documente, manualul, executabilele CGI, sau scripturile, în mod implicit în directorul “/usr/local/httpd/”.
Configurarea OpenSSL
Pentru crearea unei autorități de certificate, pachetul OpenSSL 0.9.6, instalat în directorul “/usr/local/ssl/”, trebuie configurat cu anumite opțiuni specifice. Opțiunile se găsesc în fișierul openssl.cnf, a cărei strucură este următoarea:
#
# OpenSSL configuration file.
# This is mostly being used for generation of certificate requests.
#
# This definition stops the following lines choking if HOME isn't
# defined.
HOME = .
RANDFILE = $ENV::HOME/.rnd
Directiva HOME stabilește directorul de lucru al pachetului OpenSSL, “.” însemnând directorul curent, adică “/usr/local/ssl”.
Directiva RANDFILE stabilește fișierul inițial generator de numere aleatoare. Urmează secțiunea ce stabilește structura de directoare folosită pentru crearea unei noi autorități de certificate, și a noi certificate.
####################################################################
[ ca ]
default_ca = CA_default # The default ca section
####################################################################
[ CA_default ]
dir = /usr/local/ssl/CA # Unde se păstrează totul.
certs = $dir/certs # Directorul certificatelor emise.
crl_dir = $dir/crl # Directorul cererilor .
database = $dir/index.txt # fițierul index.
new_certs_dir = $dir/newcerts # Locul implicit pentru noi certificate.
certificate = $dir/cacert.pem # Numele certificatului autorității
serial = $dir/serial # Numărul serial curent
private_key = $dir/private/cakey.pem# Cheia privată a autorității
RANDFILE = $dir/private/.rand # Fițirul privat de generare a numerelor aleatoare
x509_extensions = usr_cert # Tipul de extensii care să fie adăugate în certificat
default_days = 365 # perioada validității unui certificat
default_md = md5 # ce tip de md (funcția hash).
policy = policy_anything # cu ce tip de politică se semnează certificatele
Pentru policy_anything se pot introduce orice date (orice țară, județ, oraș, organizație, departament, etc.), în felul acesta autoritatea de certificate acceptând să semneze certificate pentru oricine. Dacă se dorește să se semneze certificate pentru indivizi/instituții din aceeași zonă geografică sau socială, se folosește policy=policy_match, ce este configurată în paragraful următor.
# For the CA policy
[ policy_match ]
countryName = match # trebuie să fie aceeași cu cea din certificatul autorității
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
####################################################################
[ req ]
default_bits = 1024 # numărul de biți cu care este generată cheia
default_keyfile = privkey.pem # numele fișierului cheie pentru noile certificate
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
# This sets a mask for permitted string types. There are several options.
# default: PrintableString, T61String, BMPString.
# pkix : PrintableString, BMPString.
# utf8only: only UTF8Strings.
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
# MASK:XXXX a literal mask value.
# WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
# so use this option with caution!
string_mask = nombstr
# req_extensions = v3_req # The extensions to add to a certificate request
Acum urmează paragraful ce stabilește valorile implicite ale câmpurilor ce trebuiesc introduse de către client:
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = RO
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Bucuresti
localityName = Locality Name (eg, city)
localityName_default = Bucuresti
0.organizationName = Organization Name (eg, company)
0.organizationName_default = RomSign S.A.
# we can do this but it is not needed normally 🙂
#1.organizationName = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default= Departamentul semnare
commonName = Common Name (eg, YOUR name)
commonName_default = RomSign CA
commonName_max = 64
emailAddress = Email Address
emailAddress_default = [anonimizat]
emailAddress_max = 40
# SET-ex3 = SET extension number 3
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
unstructuredName = An optional company name
[ usr_cert ]
# These extensions are added when 'ca' signs a request.
# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.
basicConstraints=CA:FALSE
# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always
# This stuff is for subjectAltName and issuerAltname.
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
[ v3_ca ]
# Extensions for a typical CA
# PKIX recommendation.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
# This is what PKIX recommends but some broken software chokes on #critical extensions.
#basicConstraints = critical,CA:true
# So we do this instead.
basicConstraints = CA:true
# Key usage: this is typical for a CA certificate. However since it #will prevent it being used as an test self-signed certificate it is #best left out by default.
# keyUsage = cRLSign, keyCertSign
După ce am realizat acest fișier suntem gata să creăm o nouă autoritate de certificate, caracterizată printr-un director propriu “/usr/local/ssl/CA/”, cu o structură proprie, un certificat autorsemnat “cacert.pem” (în format PEM, pentru Netscape) și “cacert.der” (în format DER, pentru Internet Explorer) și o cheie privată “cakey.pem”.
Executăm comanda in shell:
little# ps -elf | md5sum | perl -e 'syswrite(STDOUT,pack("H*",<>),16)' >> $HOME/.rnd
ceea ce face să obținem un fișier sursă pentru numerele aleatoare necesare generării cheii private. În continuare creăm efectiv cheia și certificatul autosemnat:
little# /usr/local/ssl/bin/CA.sh –newca
ce are ca efect următorul dialog (caracterele bold reprezintă răspunsul la întrebări):
CA certificate filename (or enter to create) Type Return to create a certificate
Making CA certificate …
Using configuration from /usr/local/ssl/lib/ssleay.cnf
Generating a 1024 bit RSA private key
…….+++++
.+++++
writing new private key to '/usr/local/ssl/CA/private/./cakey.pem'
Enter PEM pass phrase: Parola autorității (neafișată)
Verifying password – Enter PEM pass phrase: Parola (neafișată)
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [RO]: se apasă Enter
State or Province Name (full name) [Bucuresti]: se apasă Enter
Locality Name (eg, city) [Bucuresti]: se apasă Enter
Organization Name (eg, company) [RomSign SA]: se apasă Enter
Organizational Unit Name (eg, section) []: Departamentul semnare
Common Name (eg, YOUR name) []: RomSign CA
Email Address []: [anonimizat]
În acest moment cheia și certificatul autosemnat au fost create și se găsesc în “/usr/local/ssl/CA/private/cakey.pem”, respectiv în “/usr/local/ssl/CA/cacert.pem”. Pentru a face certificatul autorității accesibil și browser-ului Internet Explorer, trebuie să-l convertim în format DER:
little# /usr/local/ssl/bin/openssl x509 –inform pem –in /usr/local/ssl/CA/cacert.pem -outform der -out /usr/local/ssl/CA/cacert.der
În acest moment noua autoritate de certificate RomSign este creată.
4.2 Configurarea serverului web Apache
Serverul web Apache a fost compilat cu suport PHP3, deci el va putea interpreta stripturile PHP3. Pentru a-l putea configura, trebuie să modificăm fișierul “/etc/httpd/httpd.conf” în modul următor:
##
## httpd.conf – Apache HTTP server configuration file
##
### Section 1: Global Environment
#
#
# ServerType is either inetd, or standalone. Inetd mode is only supported on
# Unix platforms.
#
ServerType standalone
În acest mod serverul este pornit de către utilizatorul sistemului și nu de către sistem la pornire.
#
# ServerRoot: directorul în care sunt ținute toate fișierele și
# directoarele referitoare la acest server
ServerRoot "/usr/local/httpd"
#
# Numărul de procese server care să pornească inițial
StartServers 1
### Sectiunea 2: Configurarea serverului principal
#
# The directives in this section set up the values used by the 'main'
#
# Port: Portul la care acultă serverul. Pentru porturi mai mici de 1023, httpd va trebui rulat cu drepturi de root initial.
#
Port 80
##
## SSL Suport
##
## Când folosim SSL, și în acest caz îl vom folosi, este nevoie să
## ascultăm și la portul HTTPS (443)
##
<IfDefine SSL>
Listen 80
Listen 443
</IfDefine>
#
# Dorim să rulăm serverul cu alt user și grup: userul “wwwrun” și
# grupul “nogroup”
#
User wwwrun
Group nogroup
#
# ServerAdmin: Administratorul serverului
#
ServerAdmin root@localhost
#
# ServerName: numele de domeniu al serverului
#
ServerName www.romsign.ro
#
# DocumentRoot: Directorul în care se păstrează documentele (paginile
# și scripturile)
#
DocumentRoot "/usr/local/httpd/htdocs/www.romsign.ro-docs/"
#
# Pentru recunoasterea de către browser-e direct a certificatelor
# adăugăm un nou tip de fisiere: toate cele cu extensia .der vor fi
# tratate ca fiind certificate de autoritate
AddType application/x-x509-ca-cert .der
##
## SSL Virtual Host Context
##
Avem nevoie de două servere, unul public, altul pentru administrare. Deoarece rulăm ambele servere pe aceelași calculator am ales varianta creării unui server virtual pentru același IP cu nume diferit, pe portul 443.
#
# NameVirtualHost: stabilește că se vor folosi servere virtuale pentru
# IP și portul specificate
#
NameVirtualHost 192.168.11.207:443
#
# VirtualHost: crează un nou server virtual pe IP-ul și portul
# specificate
#
<VirtualHost 192.168.11.207:443>
# Configurarea generală pentru host-ul virtual
# Unde se vor păstra documentele
DocumentRoot "/usr/local/httpd/htdocs/"
# Numele de domeniu al serverului virtual
ServerName admin.romsign.ro
ServerAdmin root@localhost
# Fișierul log de errori și fișierul de acces
ErrorLog /var/log/httpd/romsign/secure_error_log
TransferLog /var/log/httpd/romsign/secure_access_log
# Directorul rădăcină al serverului
<Directory />
# Tipul de autentificare
AuthType Basic
AuthName "RomSign Auth"
# Unde se vor păstra informațiile privitoare la clienții autorizați
# Aici sunt trecute datele introduse la crearea certificatului
# clientului
AuthUserFile /etc/httpd/secure/ssl.user
AuthGroupFile /etc/httpd/secure/ssl.group
require valid-user
# În acest director nu se pot vedea fișierele, se pot urma legăturile
# simbolice și se pot executa scripturi
Options -Indexes +FollowSymLinks +Includes MultiViews +ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>
#
# Dacă SSL să fie pornit pentru acest server virtual: da
#
SSLEngine on
#
# Suita de cifruri SSL:
# Listează ce tipuri de cifruri se pot negocia la o conexiune SSL
#
SSLCipherSuite ALL:!ADH:!EXP56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
#
# Certificatul serverului: certificatul serverului web în format PEM
#
SSLCertificateFile /usr/local/ssl/servercert.pem
# Autoritatea de Certificate (CA):
# Unde se găsește certificatul autorității de certificate ce a semnat
# certificatul serverului; în acest caz este tot RomSign
#
SSLCACertificateFile /usr/local/ssl/CA/cacert.pem
#
# Autentificarea clienților:
# Se dorește să prezinte certificate clienții care se conectează la
# acest server ( doar sunt administratorii autorității ), de aceea se
# alege valoarea 2 pentru această directivă
#
SSLVerifyClient 2
SSLVerifyDepth 10
În acest moment serverul web este configurat și se poate reporni cu ajutorul scriptului de start System V: “/etc/rc.d/init.d/apache restart”.
4.3 Baza de date
În clientul de MySQL scriem câteva query-uri:
mysql> create database romsign;
Database created.
mysql>create table certs
(id int(3) not null PRIMARY KEY AUTO_INCREMENT,
browser enum(‘ie’,’ns’),
userpasswd varchar(255),
passwd varchar(255),
serial int(3) not null default –1,
commonname varchar(255) not null,
country char(2) not null,
state varchar(255),
locality varchar(255),
org varchar(255),
orgunit varchar(255),
email varchar(255),
withkey int(1) default 0,
data datetime,
stare enum(‘cerere’,’aprobat’,’emis’),
tip enum(‘personal’,’server’));
Table certs created.
Astfel am creat baza de date romsign cu tabela certs. Descrierea câmpurilor se găsește în capitolul 3 al lucrării.
4.4 Fișierele script PHP3
Avem de construit de fapt două site-uri web: unul fiind interfața către clienți, celălalt fiind un site de administrare a autorității de certificate RomSign.
Site-ul client
Prima pagină este creată de fișierul “index.html”. El creează 2 frame-uri: up și down. Frame-ul up este creat de up.html, în care se realizează legături către acțiunile principale pe care le poate realiza un client.
Legătura către certificatele personale:
<TD width=160 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='/scripts/dispatcher.php3?tip=personal' target=center><b>Certificate Personale </b></a></FONt></TD>
Legătura către certificatele server:
<TD width=160 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='/scripts/dispatcher.php3?tip=server' target=center><b>Certificate Server Web </b></a></FONT></TD>
Legătura către încărcarea certificatului autorității:
<TD width=220 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='/scripts/dispatcher.php3?tip=cert' target=center><b>Certificatul autoritatii RomSign</b></a></FONT></TD>
Legătura către prima pagină:
<TD width=60 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='/info.html' target=center><b>Info</b></a></FONT></TD>
Legătura către sistemul de ajutor:
<TD width=60 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='/scripts/ajutor.php3?param=start' target=center> <b>Ajutor</b></a></FONT> </TD>
Frame-ul down este alcătuit la rândul lui din alte două frame-uri: left și center. Left este compus din câteva legături către pagini de informare, printre care și “dictionar.html”, document ce cuprinde definițiile numeroșilor termeni întâlniți în criptografie,protocolul SSL și biblioteca OpenSSL.
Center este de fapt frame-ul care interacționează cu utilizatorul. Inițial center este ocupat de documentul “info.html”, o mică introducere explicativă, ce face legătura către scripturile pentru certificate personale și server.
Scripturile au fost centralizate în directorul scripts.
La fiecare alegere a utilizatorului, dispatcher.php3 realizează legătura în funcție de parametrul param și în funcție de programul de navigare utilizat de client (conține un script JAVASCRIPT ce detectează acest tip de software):
var detect = navigator.userAgent.toLowerCase();
//De fapt variabila detect este cea care citește din environment, tipul browser-ului.
var OS,browser,version,total,thestring;
// După această structură de if, variabila browser va conține numele browserului.
if (checkIt('konqueror')) {
browser = 'Konqueror';
OS = 'Linux';
}
else if (checkIt('opera')) browser = 'Opera';
else if (checkIt('webtv')) browser = 'WebTV';
else if (checkIt('icab')) browser = 'iCab';
else if (checkIt('msie')) browser = 'InternetExplorer';
else if (!checkIt('compatible')) {
browser = 'NetscapeNavigator';
version = detect.charAt(8);
}
else browser = 'An unknown browser';
if (!version) version = detect.charAt(place + thestring.length);
if (!OS)
{
if (checkIt('linux')) OS = 'Linux';
else if (checkIt('x11')) OS = 'Unix';
else if (checkIt('mac')) OS = 'Mac'
else if (checkIt('win')) OS = 'Windows'
else OS = 'an unknown operating system';
}
Funcția checkit returneată sub formă de șir de caractere numele browser-ului:
function checkIt(string)
{
place = detect.indexOf(string) + 1;
thestring = string;
return place;
}
// variabila total va conține un șir de caratere ce descrie numele browserului și al
// sistemului de operare folosit de client. În loc de spațiu s-a folosit %20, pentru ca total
// să poată fi transmisă ca parametru prin POST. (URL encoded)
total='Dumneavostra%20folositi%20'+browser+'%20'+version+'%20pe%20un%20sistem%20de%20operare%20'+OS;
// În funcție de browserul detectat se fac legăturile. tip este un parametru primit din
// pagina info.html, ce conține o valoare (personal sau server) ce redirecteză catre tipul de
// certificat
if(browser=='NetscapeNavigator') {
if(version>=4) {\n";
// Dacă este Netscape și personal execută personal.php3 cu parametrii respectivi
if($tip=='personal') print " var url='/scripts/personal.php3?browser=ns&total='+total;\n";
// Dacă este Netscape și server redirectează la server.html
if($tip=='server') print " var url='/server.html';\n";
if($tip=='cert') print " var
// Dacă este Netscape și certificatul autorității se execută importnsca.php3
url='/scripts/importnsca.php3';\n";
print "
parent.center.location.href=url;
}
}
else if(browser=='InternetExplorer'){
if(version>=4) {";
// Dacă este Internet Explorer și personal execută personal.php3 cu parametrii respectivi
if($tip=='personal') print " var url='/scripts/personal.php3?browser=ie&total='+total;\n";
// Dacă este Internet Explorer și server redirectează la server.html
if($tip=='server') print " var url='/server.html';\n";
// Dacă este Internet Explorer și certificatul autorității se execută importieca.php3
if($tip=='cert') print " var url='/scripts/importieca.php3';\n";
// Center se încarcă cu pagina corectă
print "
parent.center.location.href=url;
}
}else{
// Dacă nu s-a determinat tipul browser-ului se execută nobrowser.php3
parent.center.load='/scripts/nobrowser.php3?total='+total;
}
personal.php3 este un script care în funcție de tipul browserului, afișează legături către cele 3 acțiuni pe care trebuie să le realizeze clientul:
încărcare certificat autoritate în browser
completare formă,
obținere certificat semnat.
Variabilele link preiau url-ul la care se va reliza legătura în funcție de browser:
if($browser=='ns') {
$link1='/scripts/importnsca.php3';
$link2='/scripts/nsenroll.php3?param=genperreq';
$link3='/scripts/nsenroll.php3?param=verpercrt';
}elseif($browser=='ie') {
$link1='/scripts/importieca.php3';
$link2='/scripts/ieenroll.php3?param=genperreq';
$link3='/scripts/ieenroll.php3?param=verpercrt';
}
Apoi se introduc în pagina de web:
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Certificate Personale</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR>
<TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
$total. Cele mai multe browser-e, cum ar fi Internet Explorer sau Netscape Navigator (cu versiuni mai mari de 3.x), permit utilizatorilor sa foloseasca un certificat personal pentru a se autentifica la un server de Web. Autentificarea pe baza de certificate este mult mai sigura si mai puternica decat autentificarea prin parola.<BR>
Un certificat personal este intradevar un \"pasaport\" special in format digital ce contine informatii despre dumneavoastra si este semnat de catre <i>RomSign</i>.<BR>
<i>RomSign</i> suporta formatul X.509 al certificatelor. Certificatele X.509 sunt conforme standardului OSI, si se pot introduce in diferite programe pentru Internet ( cum ar fi InternetExplorer si Netscape ) pentru a va autentifica catre oricine \"altcineva\" ( un server Web de obicei ).<BR>
Pentru a crea un certificat pentru dumneavoastra trebuie sa urmati urmatorii pasi:<BR>
<OL>
<LI><A href='$link1'><U>Obtineti certificatul autoritatii <I>RomSign</I></U></A></LI>
<LI><A href='$link2'><U>Formular cerere certificat personal</U></A></LI>
<LI><A href='#' onClick='userConfirm(this)'><U>Obtineti certificatul cerut</U></A></LI>
</OL>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
</TABLE>
La ultima legătura (obținerea certificatului) se activează un script JAVASCRIPT pentru a cere clientului parola primită prin email:
<SCRIPT language='javascript'>
function userConfirm( linkto ) {
var passwd;
var url;
passwd=prompt('Introduceti parola primita prin email de la RomSign','');
if( passwd == null || passwd == '' ) {
alert('Nu ati introdus nici o parola');
linkto.href='/info.html';
}
url='$link3&passwd='+passwd;
linkto.href=url;
}
</SCRIPT>
url ia valoarea lui link3 plus parola scrisă in fereastra de dialog a scriptului, apoi browser-ul este redirecționat la acest url.
Atunci când utilizatorul alege prima legătură , în funcție de browser, url-ul este http://www.romsign.ro/scripts/importnsca.php3 (sau importieca.php3)
importnsca.php3 este o interfață către loadnsca.php3. importnsca.php3 nu face decât să afișeze informații și să creeze legătura către celălalt script menționat. El este necesar pentru a arăta clientului, într-un mod sumar, pașii necesari in instalarea certificatului autorității în browser.
Scriptul ce încarcă in Netscape Navigator 4.x (sau mai mare), certificatul autorității, este loadnsca.php3. Acest script nu trimite un header text catre browser, ci un header pentru certificate de autoritate:
<?php
# calea unde se afla certificatul autorității
$cert="/usr/local/ssl/CA/cacert.pem";
# deschidem fisierul si îi aflăm lungimea
$fp=fopen($cert,"r");
$filesize=filesize($cert);
# încărcăm în variabila filecontent tot fișierul
$filecontent=fread($fp,$filesize);
# trimitem către Netscape Navigator un header de tip
# certificat de autoritate
header("Content-type: application/x-x509-ca-cert\n");
# trimitem către Netscape Navigator lungimea, apoi
# conținutul fișierului
echo "Content-Length: ",$filesize,"\n\n$filecontent";
?>
Odată certificatul autorității instalat în Netscape Navigator, clientul trebuie să completeze o formă cu datele sale. Revenind la scriptul personal.php3, variabila link2 face legătura către nsenroll.php3 cu parametrul param=genperreq, adică generarea cererii pentru certificatul personal.
nsenroll.php3 este scriptul ce generează forma de introducere a datelor, le verifică, le scrie în baza de date și creează fișierul de cerere pentru OpenSSL. Pentru cazul în care param=genperreq, nsenroll.php3 generează forma:
<FORM name=nsenroll method=POST action= '/scripts/nsenroll.php3?param=reqsent'>
……
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 bgcolor=#790000>
<TR><TD colspan=2 width=670 align=center><B><FONT face='Times' color=#FFFFFF>Introducere informatii certificat personal</FONT></B></TD></TR>
<TR><TD colspan=2>
<TABLE width=100% border=0 cellspacing=2 cellpadding=8>
<TR ><TD width=668 bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<TABLE width=100% height=100% border=0 cellspacing=0 cellpadding=7>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Tara</TD><TD width=350 align=center><INPUT type=text name=country size=2></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Stat(judet)</TD><TD width=350 align=center><INPUT type=text name=state></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Localitate</TD><TD width=350 align=center><INPUT type=text name=local></FONT></B></TD></TR>
……
<!—
O deosebit de importantă linie de cod html este următoarea, specifică browserului Netscape Navigator, ce generează in momentul submitului, cheia publica sau SPKAC.Acest SPKAC generat de browser se va trimite mai departe în variabila ns_key.(SPKAC este acronimul de la SignedPublicKeyAndChallenge)
–>
<KEYGEN name='ns_key' challenge='password'>
……
</FORM>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
function goSubmit() {
var country=document.nsenroll.country.value;
var state=document.nsenroll.state.value;
var local=document.nsenroll.local.value;
var org=document.nsenroll.org.value;
var orgunit=document.nsenroll.orgunit.value;
var cn=document.nsenroll.cn.value;
var email=document.nsenroll.email.value;
if(country.length!=2 || state.length==0 || local.length==0 || org.length==0 || orgunit.length==0 || cn.length==0 || email.length==0){
alert('Toate campurile trebuie completate, iar numele tarii trebuie sa aiba exact 2 caractere');
return false;
}else{
document.nsenroll.submit();
return false;
}
}
</SCRIPT>
Scriptul JAVASCRIPT verifică corectitudinea datelor: lungimea numelui țării să fie 2 și să nu fie nici un câmp liber. Funcția goSubmit() se apelează în momentul în care clientul apasă pe legătura Trimite, verificându-se datele, apoi realizându-se prin instructiunea
document.nsenroll.submit();
submiterea datelor formei către același script, dar cu parametrul param=reqsent. La realizarea metodei POST de submit, Netscape Navigator răspunde cu o fereastră de dialog pentru generarea cheii publice, ce se va transmite cu numele de ns_key.
nsenroll.php3 cu parametrul param=reqsent, trimite datele culese către baza de date și apoi crează fișierul cerere pentru OpenSSL:
$ns_key=preg_replace("/\n/","",$ns_key); # trecem peste caracterele \n din SPKAC
# realizăm conexiunea la serverul MySQL
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
# ne conectăm la baza de date romsign
$result=mysql_select_db("romsign",$dbconn) or die("Couldn't make the connection to database romsign");
# selectăm din tabela certs cel mai mare index și îl incrementăm
$query="select max(id) as id from certs"; # selectam cel mai mare id
$result=mysql_query($query) or die($query);
while($row=mysql_fetch_array($result)) {
$id=$row['id'];
}
$id++;
# generăm o parolă aleatoare ce are la bază indexul
$passwd=crypt($id);
# inserăm datele în tabelă
$query="insert into certs (browser,userpasswd, passwd,commonname,country,state,locality,org,orgunit,email,data,stare,tip) values ('ns','$password','$passwd','$cn','$country','$state','$local','$org','$orgunit','$email',CURRENT_TIMESTAMP(),'cerere','personal')";
$result=mysql_query($query) or die($query);
# închidem conexiunea la serverul MySQL
mysql_close($dbconn) or die("Couldn't close the db connection");
# creăm fișierul cerere (request) cu numele dat de indexul
# aflat din baza de date
$reqfile="/usr/local/ssl/CA/crl/$id.req";
# îl dechidem pentru scriere
$fp=fopen($reqfile,"w");
# scriem datele și îl închidem
fputs($fp,"SPKAC=$ns_key\n");
fputs($fp,"PASSWD=$password\n");
fputs($fp,"C=$country\n");
fputs($fp,"ST=$state\n");
fputs($fp,"L=$local\n");
fputs($fp,"O=$org\n");
fputs($fp,"OU=$orgunit\n");
fputs($fp,"CN=$cn\n");
fputs($fp,"Email=$email\n");
fclose($fp);
În continuare se va afișa un mesaj care îț îndeamnă pe client să aștepte câteva zile verificarea informațiilor și generarea certficatului. Desigur din motive de practice și de prezentare a lucrării, partea verificării identității reale a clientului este trecută cu vederea, certificatul cerut fiind generat pe loc din paginile de administrare a autorității RomSign.
Clientul poate verifica dupa aceea existența certificatului din legătura a treia din scriptul personal.php3, legătură catre același script nsenroll.php3, dar cu parametrul param= verpercrt. În acest caz personal.php3 va cere clientului printr-un script JAVASCRIPT, parola trimisă în email-ul de confirmare:
<SCRIPT language='javascript'>
function userConfirm( linkto ) {
var passwd;
var url;
passwd=prompt('Introduceti parola primita prin email de la RomSign','');
if( passwd == null || passwd == '' ) {
alert('Nu ati introdus nici o parola');
linkto.href='/info.html';
}
url='$link3&passwd='+passwd;
linkto.href=url;
}
</SCRIPT>
nsenroll.php3 va verifica în baza de date că starea cererii cu parola dată de scriptul JAVASCRIPT a fost trecută pe “aprobat”. Dacă da, înseamnă că utilizatorul poate descărca certificatul dat de numărul serial; dacă nu se afișează un text în care utilizatorul este rugat să mai aștepte. În acest mod un utilizator neautorizat nu poate descărca certificatul:
# variabila verify este un steguleț care arată dacă
# certificatul a fost generat sau nu
$verify=0;
# realizează conexiunea la serverul MySQL $dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
# apoi la baza de date
$result=mysql_select_db("romsign",$dbconn) or die("Nu pot sa fac conexiunea la db romsign");
$query="select serial from certs where passwd='$passwd' and stare='aprobat' and tip='personal'"; # gasim nr serial al
# certificatului cu parola data de user si care a fost
# aprobat
$result=mysql_query($query);
if($result>0) {
$rows=mysql_num_rows($result);
if($rows>0) {
$row=mysql_fetch_array($result);
$serial=$row['serial'];
if($serial!=-1) {
$serial=dechex($serial);
if(strlen($serial)<2) {
$serial="0"."$serial";
}
# daca a fost aprobat, serial ia valoarea in # hexazecimal a numărului serial al
# certificatului, iar verify devine adevărat
$serial=strtoupper($serial);
$verify=1;
}
}
}
mysql_close($dbconn);
# Daca s-a aprobat
if($verify==1) {
# numele certificatului personal nou generat
$usercert="/usr/local/ssl/CA/newcerts/$serial.pem";
# tipul de date trimis către browser
$mimetype="Content-type: application/x-x509-user-cert";
$fp=fopen($usercert,"r");
$len=filesize($usercert);
$content=fread($fp,$len);
header($mimetype);
echo "Content-Length: $len\n\n$content";
# actualizam baza de date setând stare pe “emis”
$query="update certs set stare='emis' where passwd='$passwd' and stare='aprobat' and tip='personal'";
$result=mysql_query($result) or die($query);
}elseif($verify==0) {
#certificatul inca nu a fost semnat
….
# se afișează textul de refuz
….
}
În acest moment, clientul are certificatul personal încărcat în Netscape Navigator și îl poate folosi pentru autentificare la servere web cu certificate ce au fost semnate de RomSign, în speță magazinul virtual descris la începutul lucrării.
Scriptul importieca.php3 descarcă către Internet Explorer certificatul autorității:
<LI><IMG src='/images/cert.gif'><A href='/cacert.der'> <U>Incarcati certificat autoritate</U></A></LI>
Scriptul ieenroll.php3 are același rol pentru Internet Explorer ca și nsenroll.php3 pentru Netscape Navigator. În schimb ieenroll.php3 are un script în VBSCRIPT, specific pentru Internet Explorer 4 sau mai mare, care generează cheia publică și request-ul pentru certficat. Pentru a genera cheia publică trebuie să folosim de un ActiveX ce se găsește în biblioteca xenroll.dll (acest fișier este păstrat în directorul rădăcină al serverului web).
<OBJECT classid=\"clsid:43F8F289-7A20-11D0-8F06-00C04FC295E1\" CODEBASE=\"/xenroll.dll\" id=\"cenroll\">
</OBJECT>
<SCRIPT LANGUAGE=\"VBScript\">
Subrutina FindProviders se execută la încărcarea paginii html, generând tipurile de criptografiere oferite de veriunea de IE deținută (acestea determină lungimea cheii publice: pe 512, 1024 sau 2048 de biți).
Sub FindProviders
Dim i, j
Dim providers()
i = 0
j = 1
Dim el
Dim temp
Dim first
On Error Resume Next
first = 0
FixAcceptButton()
Do While True
temp = \"\"
cenroll.providerType = j
temp = cenroll.enumProviders(i,0)
If Len(Temp) = 0 Then
If j < 1 Then 'Look for RSA_FULL only.
j = j + 1
i = 0
Else
Exit Do
End If
Else
La variabila cryptProv, care este un SELECT, se adaugă noi opțiuni ce iau valorile provider-ilor:
set el = document.createElement(\"OPTION\")
el.text = temp
el.value = j
document.all.cryptProv.add(el)
If first = 0 Then
first = 1
document.all.cryptProv.selectedIndex = 0
End If
i = i + 1
End If
Loop
End Sub
Funcția CreateP10 crează cererea codata PKCS10 pentru un certificat personal, cu datele introduse în formă.
Function CreateP10(aForm)
On Error Resume Next
CreateP10 = \"\"
szName = \"C=\"
szName = szNAme & aForm.country.value & \"; ST=\" & aForm.state.value & \"; L=\" & aForm.local.value & \"; O=\" & aForm.org.value & \"; OU=\" & aForm.orgunit.value & \"; CN=\" & aForm.cn.value & \"; 1.2.840.113549.1.9.1=\" & aForm.email.value
MsgBox(\"szName=\"+szName)
CreateP10 = cenroll.CreatePKCS10(szName, \"1.3.6.1.5.5.7.3.2\")
if Len(CreateP10) <> 0 Then Exit Function
End Function
Subrutina accept_onclick se execută în momentul trimiterii datelor din formă, trimițând în variabila public_key, cheia publică generată de browser:
Sub accept_onclick
dim theForm
dim options
dim cn
dim lengthofkey
set theForm = document.ieSubmit
if IsIE4() Then
On Error Resume Next
set options = document.all.cryptProv.options
index = options.selectedIndex
cenroll.providerName = options(index).text
cenroll.providerType = options(index).value
else
Dacă nu s-a putut stabili numele providerului se folosește criptarea standard Miscrosoft Base Cryptographic Provider v1.0, generându-se o cheie pe 512 biți.
On Error resume next
cenroll.providerType = 1
cenroll.providerName = \"Microsoft Base Cryptographic Provider v1.0\"
end if
cenroll.HashAlgorithm = \"MD5\"
set keyUsageOptions = document.all.KeyUsage.options
index = keyUsageOptions.selectedIndex
if KeyUsageOptions(index).text = \"Signing\" then
cenroll.KeySpec = 2
else
cenroll.KeySpec = 1
end if
theForm.public_key.value = CreateP10(theForm)
În caz că a apărut o eroare la generarea cheii publice, aceasta se afișează:
if Len(theForm.public_key.value) = 0 then
MsgBox(\"Eroarea: \" + hex(err.number) + \" a aparut in generarea cererii de certificat\")
end if
End Sub
–>
</SCRIPT>
Forma de introducere a datelor pentru Internet Explorer, are același stil ca și pentru Netscape:
La submit-erea informațiilor acealași script JAVASCRIPT verifică corectitudinea datelor, apoi, prin POST, sunt trimise aceluiași script, ieenroll.php3, dar cu parametrul param=reqsent:
<SCRIPT language='javascript'>
function goSubmit() {
var country=document.ieSubmit.country.value;
var state=document.ieSubmit.state.value;
var local=document.ieSubmit.local.value;
var org=document.ieSubmit.org.value;
var orgunit=document.ieSubmit.orgunit.value;
var cn=document.ieSubmit.cn.value;
var email=document.ieSubmit.email.value;
if(country.length!=2 || state.length==0 || local.length==0 || org.length==0 || orgunit.length==0 || cn.length==0 || email.length==0){
alert('Toate campurile trebuie completate, iar numele tarii trebuie sa aiba exact 2 caractere');
}else{
document.ieSubmit.submit();
return false;
}
}
</SCRIPT>
Dacă parametrul param=reqsent, atunci trimitem datele în baza de date și scriem fișierul de request:
# scoatem caracterele ASCII 10 introduse de browser în cheie
$ie_key=preg_replace("/\r/","",$public_key);
# facem conexiunea la serverul MySQL
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
# apoi la baza de date romsign
$result=mysql_select_db("romsign",$dbconn) or die("Couldn't make the connection to database romsign");
# pentru a crea fișierul avem nevoie de un identificator unic: indexul tabelei
$query="select max(id) as id from certs";
$result=mysql_query($query) or die($query);
while($row=mysql_fetch_array($result)) {
$id=$row['id'];
}
$id++;
# generăm o parolă aleatoare ce va fi trimisă clientului prin email pentru autentificare
$passwd=crypt($id);
$query="insert into certs (browser, passwd, commonname, country, state, locality, org, orgunit, email, data, stare, tip) values ('ie', '$passwd', '$cn', '$country', '$state', '$local', '$org', '$orgunit','$email',CURRENT_TIMESTAMP(),'cerere','personal')";
$result=mysql_query($query) or die($query);
mysql_close($dbconn) or die("Couldn't close the db connection");
# construim fișierul request pentru Internet Explorer $reqfile="/usr/local/ssl/CA/crl/$id.req";
$fp=fopen($reqfile,"w");
fputs($fp,"$ie_key\n");
fclose($fp);
Dacă parametrul param=verpercrt, aceasa înseamnă că utilizatorul a cerut certficatul său și a introdus parola trimisă prin email. Verificăm, deci, dacă exită un certificat cu această parolă în baza de date, și dacă da, cu ajutorul unui script VBSCRIPT și a unui ActiveX încărcăm certificatul în browser:
$certificate="";
# numele certificatului și calea în funcție de index
$usercert="/usr/local/ssl/CA/newcerts/$id.pkcs7";
$fp=fopen($usercert,"r");
$started=0;
# atât timp cât nu este sfârșit de fișier citește din el
while( !feof($fp) ) {
$buffer=fgets($fp,4096);
# dacă buffer conține șirul următor acesta se ignoră
if(preg_match("/BEGIN PKCS7/",$buffer)) {
$started=1;
continue;
}
# dacă buffer conține șirul următor acesta se ignoră
if(preg_match("/END PKCS7/",$buffer)){
break;
}
# dacă ne aflăm întradevăr în conținutul fișierului
if($started) {
# elimină caracterele de sfârșit de fișier
$buffer=chop($buffer);
# adaugă în variabila certificate, conținutul
# citit din fișier
$certificate.=$buffer;
}
}
$page="<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
Enroll va fi variabila ce va conține adresa obiectului ActiveX:
<OBJECT CLASSID=\"clsid:43F8F289-7A20-11D0-8F06-00C04FC295E1\" CODEBASE=\"/xenroll.dll\" ID=Enroll>
</OBJECT>
<SCRIPT language=\"VBScript\">
Sub InstallCert
On Error Resume Next
certificate=\"$certificate\"
Următoarea instrucțiune încarcă efectiv conținutul certificatului în browser:
Call Enroll.AcceptPKCS7(certificate)
Dacă a apărut vreo eroare, se afișează:
if err.Number <> 0 Then
MsgBox(\"Eroare ! Certificatul NU a fost incarcat \"+err.Description)
else
MsgBox(\"Certificatul dumneavoastra a fost incarcat in browser\")
end if
End Sub
</SCRIPT>
La încărcarea paginii se execută subrutina InstallCert, iar la ieșirea din pagină se execută scriptul ieupdate.php3:
<BODY bgcolor=#FFFFFF onLoad='InstallCert()' onExit='/scripts/ieupdate.php3?passwd=$passwd'>
În acest moment certificatul personal este încărcat in Internet Explorer și utilizatorul îl poate folosi pentru autentificare la orice server web ce are un certificat semnat de RomSign.
Scriptul ieupdate.php3 realizează actualizarea bazei de date în cazul încărcării cu succes a certificatului în browser:
$query="update certs set stare='emis' where passwd= '$passwd' and tip='personal'";
$result=mysql_query($query) or die($query);
Pentru certificatele de server web, fișierul server.html , realizează aceeași funcție ca și personal.php3: oferă legăturile către paginile din care utilizatorul poate obține certificatul:
<OL>
<LI><A href='/scripts/generator.php3?param=gensslreq'><U>Formular cerere pentru un certificat server SSL</U></A></LI>
<LI><A href='' onClick='userConfirm(this)'><U>Obtineti cetificatul server SSL cerut</U></A></LI>
</OL>
Scriptul JAVASCRIPT din acest fișier cere parola primită de client prin email, după ce a făcut cererea și aceasta a fost acceptată:
<SCRIPT language='javascript'>
function userConfirm( linkto ) {
var passwd;
var url;
passwd=prompt('Introduceti parola primita prin email de la RomSign','');
if( passwd == null || passwd == '' ) {
alert('Nu ati introdus nici o parola');
linkto.href='/info.html';
}
url='/scripts/generator.php3?param=versslcrt&passwd='+passwd;
linkto.href=url;
}
</SCRIPT>
Deoarece certificatele web server nu mai depind de tipul browserului, scriptul generator.php3 realizează ceea ce îndeplinesc nsenroll.php3 și ieenroll.php3 pentru certificatele personale.
Dacă parametrul param=gensslreq, generator.php3 genrează o formă în care se vor scrie datele despre certificatul server, apoi acestea se vor verifica pentru corectitudine cu un script JAVASCRIPT:
function goSubmit() {
// se preiau valorile din câmpurile de scriere
var country=document.sslenroll.country.value;
var state=document.sslenroll.state.value;
var local=document.sslenroll.local.value;
var org=document.sslenroll.org.value;
var orgunit=document.sslenroll.orgunit.value;
var cn=document.sslenroll.cn.value;
var email=document.sslenroll.email.value;
var passwd=document.sslenroll.passwd.value;
var passwd2=document.sslenroll.passwd2.value;
var withkey=document.sslenroll.withkey.value;
// lugimea numelui țării trebuie să fie 2, iar
// parolele utilizator trebuie să fie aceleași
if(country.length!=2 || state.length==0 || local.length==0 || org.length==0 || orgunit.length==0 || cn.length==0 || email.length==0 || passwd.length==0 || passwd2.length==0 ){
alert('Toate campurile trebuie completate, iar numele tarii trebuie sa aiba exact 2 caractere');
return false;
}else{
if(passwd!=passwd2) {
alert('Cele doua parole nu se potrivesc !');
}else{
document.sslenroll.submit();
return false;
}
}
}
Deoarece un certificat de server web are nevoie de o parolă a administratorului său, aceasta este introdusă și verificată în forma generată de generator.php3.
Dacă param=reqsent atunci datele se introduc în baza de date.
Dacă param=versslcrt, atunci se verifică în baza de date dacă există certificatul pentru server cu parola dată de utilizator, și dacă există se trimite browser-ul către scriptul loadsslcrt.php3, cerându-se încă o dată parola trimisă prin email:
function getSslCert( linkto ) {
var passwd;
passwd=prompt('Introduceti parola primita de la RomSign prin email','');
if(passwd==null || passwd==''){
alert('Pentru a obtine certificatul trebuie sa introduceti parola corecta !');
}else{
linkto.href='loadsslcrt.php3?passwd='+passwd+'&serial=$serial';
}
}
Scriptul loadsslcrt.php3 verifică ăncă o dată parola, obține numărul serial, și utilizatorul poate descarca, sub formă de fișiere certificatul autorității, și certificatul serverului web cerut, ce conține și cheia privată:
# Se verifica dacă există certificatul cu parola introdusă
$query="select serial from certs where passwd='$passwd' and serial=$serial and stare='aprobat' and tip='server'";
$result=mysql_query($query) or die($query);
$rows=mysql_num_rows($result);
# dacă NU există linii răspuns se redirectează browserul și
# se afișează un mesaj
if($rows<=0) {
print "
<HTML>
<SCRIPT language='javascript'>
function goOn( linkto ) {
alert('Ati introdus parola gresit, sau ati ati ajuns la acest link din greseala ! $rows $s');
linkto.href='/info.html';
}
</SCRIPT>
<BODY bgcolor=#FFFFFF onLoad='return goOn( this )'>
</BODY>
</HTML>";
}else{
# dacă există certificatul se construiește numărul serial
while($row=mysql_fetch_array($result)) {
$serial=$row['serial'];
}
$serial=dechex($serial);
if(strlen($serial)<2){
$serial="0".$serial;
}
$serial=strtoupper($serial);
# calea către certificatul de server
$servercert="/usr/local/ssl/CA/newcerts/$serial"."server.pem";
if(file_exists($servercert)) {
# se trimite către browser sub formă binară
$mimetype="Content-type: application/octet-stream";
$fp=fopen($servercert,"r");
$len=filesize($servercert);
$content=fread($fp,$len);
header($mimetype);
echo "Content-Length: $len\n\n$content";
}
# se actualizează baza de date
$query="update certs set stare='emis' where passwd='$passwd' and serial='$serial'";
$result=mysql_query($query) or die($query);
}
Certificatul autorității se trimite printr-un cod identic.
Utilizatorul are acum certificatul autorității și certificatul pentru server web cerut, și el își poate configura serverul pentru conexiuni sigure.
Site-ul de administrare
Este asemător că interfață site-ului client, având același fișier Common Style Sheet:
A:link {font-family: Times; font-weight: bold;text-decoration: none;color: #FFFFFF}
A:visited {font-weight: bold;text-decoration: none;color: #FFFFFF}
A:hover {color: black;}
Un administrator al autorității trebuie să aprobe cererile de certificate și să obțină rapoarte despre cereri, de aceea în pagina principală avem trei legături:
adaugă/rejectează cereri
vizulizează cereri aprobate
vizualizează cereri emise
Scriptul admin.php3 face legătura către paginile în care se pot realiza aceste acțiuni, în funcție de parametrul primit. Dacă param=aproba se afișează legături către paginile de aprobare a certificatelor personale, respectiv pentru server web:
if(strcmp($param,"aproba")==0) {
$page="$page$begin Urmand linkurile urmatooare puteti vizualiza cererile pentru certificate personale sau pentru servere web, apoi sa le semnati.<BR>
<OL>
<LI><A href='/admin/scripts/view.php3?param=personal&action=aproba'><U>Aproba (semneaza) certificate personale</U></A></LI>
<LI><A href='/admin/scripts/view.php3?param=server&action=aproba'><U>Aproba (semneaza) certificate pentru server Web SSL</U></A></LI>
</OL>";
}
Dacă param=viewaprobate atunci se afișează legături către paginile de vizualizare a certificatelor personale , respectiv pentru server web, aprobate:
if(strcmp($param,"viewaprobate")==0) {
$page="$page$begin Puteti obtine rapoarte despre certificatele aprobate de catre <i>RomSign</i> pentru persoane fizice sau pentru servere web, ce asteapta sa fie incarcate in browser-e de catre solicitanti:<BR>
<OL>
<LI><A href='/admin/scripts/view.php3?param=personal&action=vaprobate'><U>Vizualizeaza certificate personale aprobate</U></A></LI>
<LI><A href='/admin/scripts/view.php3?param=server&action=vaprobate'><U>Vizualizeaza certificate server aprobate</U></A></LI>
</OL>";
}
Dacă param=viewemise atunci se afișează legături către paginile de vizualizare a certificatelor personale , respectiv pentru server web, aprobate:
if(strcmp($param,"viewemise")==0) {
$page="$page$begin Puteti obtine rapoarte despre certificatele emise de catre <i>RomSign</i> pentru persoanele fizice sau pentru servere web. <BR>
<OL>
<LI><A href='/admin/scripts/view.php3?param=personal&action=vemise'><U>Vizualizare certificate personale emise</U></A></LI>
<LI><A href='/admin/scripts/view.php3?param=server&action=vemise'><U>Vizualizare certificate server web emise</U></A></LI>
</OL>";
}
Scriptul view.php3 genereaza rapoartele în funcție de parametrii primiți.
if(strcmp($param,"personal")==0) {
# aici se trateaza rapoartele despre certificatele
# personale
if(strcmp($action,"aproba")==0) {
$title="Raport cereri certificate personale ";
$stare="cerere";
$tip="personal";
# dacă se dorește aprobarea certificatelor $page=onView($param,$action,$order,$stare,$tip,"sign");
}
if(strcmp($action,"vaprobate")==0) {
$title="Raport certificate personale aprobate";
$stare="aprobat";
$tip="personal";
# raport despre certificate aprobate $page=onView($param,$action,$order,$stare,$tip,"view");
}
if(strcmp($action,"vemise")==0) {
$title="Raport certificate personale emise";
$stare="emis";
$tip="personal";
# raport despre certificate emise $page=onView($param,$action,$order,$stare,$tip,"view");
}
}
Pentru certificatele server codul este aproape identic.
Funcția onView generează tagurile din pagina html ce cobnstituie raportul:
parametrul param îi spune ce tip de certificate să afișeaze
parametrul action îi spune ce fel de raport este: aprobare, aprobat, emis
parametrul order îi spune în ce ordine să afișeze datele
parametrul stare îi spune care certificate să afișeze: cereri, aprobate, emise
parametrul tip îi spune ce fel de certificat este: personal sau pentru server
ultimul parametru este pentru funcția userConfirm din scriptul JAVASCRIPT, pentru ca aceasta să se execute numai în cazul raportului de aprobare.
function userConfirm( linkto, tip, id ) {
var passwd;
if(tip=='sign') {
passwd=prompt('Introduceti parola autoritatii RomSign','');
if( passwd==null || passwd=='') {
return false;
}else{
linkto.href='../scripts/sign.php3?id='+id+'&capasswd='+passwd;
}
}
}
Funcția userConfirm face legătura către scriptul sign.php3 care generează și semnează certificatele. Pentru a semna certificatele avem nevoie să obținem din baza de date, informațiile cererii apoi, în funcție de browser-ul care a generat-o să creăm certificatul:
# Dacă tipul certificatului este personal
if(strcmp($tip,"personal")==0) {
# dacă browserul a fost Netscape Navigator
if(strcmp($browser,"ns")==0){
if(file_exists($file)){
# comanda de semnare este următoarea
$command="$cmd ca -policy policy_anything -spkac $file -days 365";
# se deschide un nou proces
$fp=popen($command,"w");
# se trimite parola autorității și un
# răspuns afirmativ
fputs($fp,"$capasswd\n");
fputs($fp,"y\n");
pclose($fp);
}else{
die("Eroare interna ! Nu gasesc fisierul cerere facut de Netscape !");
}
# dacă browserul a fost Internet Explorer
}elseif(strcmp($browser,"ie")==0){
if(file_exists($file)){
$pem="$reqdir$id.pem";
# se decodifică din format der in pem
# fisierul cerere
$command="$cmd base64 -d < $file | $cmd req -inform der -text > $pem";
# se deschide un nou proces $fp=popen($command,"w");
pclose($fp);
# se generează un „common request list”
$crl="$reqdir$id.crl";
$command="$cmd ca -gencrl -policy policy_anything -msie_hack -out $crl -in $pem";
$fp=popen($command,"w");
fputs($fp,"$capasswd\n");
fputs($fp,"y\n");
pclose($fp);
# se generează certificatul semnat în format
# pkcs7
$signed="$certdir$id.pkcs7";
$command="$cmd crl2pkcs7 -certfile $crl -in $crl -out $signed";
print "$command<BR>";
$fp=popen($command,"w");
pclose($fp);
}else{
die("Eroare interna ! Nu gasesc fisierul cerere facut de IE !");
}
}
#certificatul a fost semnat ; se actualizeaza baza de date
# pentru browserul Netscapeș pentru Internet Explorer acest
# lucru îl va face scriptul ieupdate.php3
if(strcmp($browser,"ns")) {
# se obtine numarul serial al certificatului din
# confgurarea openssl
$serial=getSerial($dir);
if(strcmp($serial,"00")!=0) {
$serial=preg_replace("/0/","",$serial);
}
$serial=hexdec($serial);
$serial–;
# se actualizează baza de date
$query="update certs set serial=$serial, stare='aprobat' where id=$id";
$result=mysql_query($query) or die($query);
}
# daca tipul certificatului este server
}elseif(strcmp($tip,"server")==0){
#generam o noua pereche cheie/cerere pentru server SSL
$keyfile="$reqdir$id"."key.pem";
$reqfile="$reqdir$id".".req";
$command="$cmd req -new ";
# scoatem parola la cererea utilizatorului
if($withkey==1) {
$command.="-nodes ";
}
$command.="-keyout $keyfile -out $reqfile -days 365";
$fp=popen("$command","w");
fputs($fp,"$userpassword\n");
fputs($fp,"$userpassword\n");
fputs($fp,"$country\n");
fputs($fp,"$state\n");
fputs($fp,"$local\n");
fputs($fp,"$org\n");
fputs($fp,"$orgunit\n");
fputs($fp,"$cn\n");
fputs($fp,"$email\n");
fputs($fp,"\n");
fputs($fp,"\n");
pclose($fp);
#semnez certificatul server
$command="$cmd ca -policy policy_anything -infiles $reqfile";
print "command=$command<BR>";
$fp=popen($command,"w");
fputs($fp,"$passwd\n");
fputs($fp,"y\n");
fputs($fp,"y\n");
pclose($fp);
$serial=getSerial($dir);
$serial=hexdec($serial);
$serial–; #se face transformare in zecimal
$serial=dechex($serial);
if(strlen($serial)<2) {
$serial="0".$serial;
}
# se copie certificatul semnat în directorul comun
$signedkeyfile="$certdir$serial"."key.pem";
if(!copy("$keyfile","$signedkeyfile")) {
die("Nu pot sa copii fisierul $keyfile in $signedkeyfile");
}
$certfile="$certdir$serial.pem";
$serverfile="$certdir$serial"."server.pem";
system("cat $certfile $signedkeyfile > $serverfile");
$serial=hexdec($serial);
# se actualizeaza baza de date
$query="update certs set serial=$serial, stare='aprobat' where id=$id";
$result=mysql_query($query) or die($query);
}
# certificatele au fost create si baza de date actualizata; trimitem mail utilizatorilor
$message="Cererea dumneavoastra a fost aprobata si certificatul generat.\nPentru a-l putea incarca in programul de navigare scrieti in caseta de dialog din pagina site-ului nostru, parola urmatoare:\n\n";
$message.=$thepassword;
$message.="\n\nMultumim pentru folosirea RomSign ca autoritate de certificate.\n";
mail("$email","RomSign CA – Raspunsul la cererea dumneavoastra",$message,"FROM: webmaster@$SERVER_NAME\nReplay-to: webmaster@$SERVER_NAME\nX-Mailer: PHP/".phpversion());
mysql_close($dbconn);
În acest moment certificatele server au fost create și semnate, clienții le pot descărca pe calculatoarele lor. Autoritatea de Certificate și-a îndeplinit funcția.
Capitolul 5
Concluzii
Cu toate neajunsurile, se pare ca viitorul aparține comerțului electronic. Actualele avantaje pe care le oferă, precum si siguranța ca noile tehnologii vor îmbunătăți considerabil procesul de cumpărare nu fac decât sa confirme faptul ca va schimba radical modul de desfășurare a activităților comerciale.
Sa nu uitam ca acum mai puțin de 10 ani, nici nu se auzise de Internet, iar acum 4-5 ani era încă ceva exotic, la care aveau acces doar cei care lucrau în domeniu sau cei cărora le permiteau veniturile.
Astăzi, orice firma care se respecta are un web site prin care publica toate informațiile disponibile, si din ce în ce mai multe vin în întâmpinarea potențialilor cumpărători oferindu-si si produsele pe Web.
Costurile extrem de reduse la intrarea pe piața, numărul mare de ofertanți în aproape orice domeniu, transparenta aproape totala sunt numai câteva din caracteristicile care i-au făcut pe cercetători să afirme că Internetul ne-a oferit piața cea mai apropiată de conceptul de 'piață cu concurență perfectă.'
În lume, modalitatea cea mai utilizată pentru comerț electronic este cea care are la bază cartea de credit. Așa cum se știe această modalitate de efectuare a tranzacțiilor a fost punctul de atracție pentru hackeri chiar și în România, după 1989. Folosirea unor coduri de card false a fost motivul pentru care puține firme din lumea electronică mai acceptă cumpărători “electronici” din estul Europei. Sunt foarte multe site-uri de Internet care îți pun la dispoziție produse sau servicii în schimbul numărului cărții de credit și implicit a banilor furnizați sub această formă.
Pentru a preîntâmpina aceste fraude efectuate în procesul tranzacțiilor electronice au apărut aceste site-uri intermediare în lanțul tranzacției care sunt dedicate autentificării cumpărătoului (în cazul proiectului nostru) sau a modului prin care acesta face tranzacția.
Se spune că nu există cod care nu se poate sparge. Important în comerțul electronic este doar ca acest cod să nu poată fi spart în mod sau în timp util. De aceea se folosesc chei de criptare din ce în ce mai mari, ca, indiferent de puterea calculatoarelor existente pe piață, să se întârzie (și chiar să fie imposibilă) spargerea unui cod.
Odată rezolvată și această problemă a securității tranzacțiilor, comerțul electronic nu va mai avea limite. Profitând din plin de avantajele sale incotestabile (economisire de timp, viteză, universalitate – se poate cumpăra din Statele Unite dintr-un magazin din Hong Kong), și eliminând problema securizării și intimitatea cumpărătorilor, comerțul electronic va elimina încet, încet toate marile supermarkete, singurul mare adversar rămânând reticența oamenilor, care preferă să cumpere ceva palpabil, chiar dacă necesită un efort mai mare. Dar o dată cu schimbarea mentalității avântul acestui tip de comerț va crește.
5.1 Considerații asupra acestei lucrări
Această lucrare nu dorește să implementeze în totalitate o autoritate de certificate, ci doar partea care servește unui site de magazin electronic. O autoritate de certificate reală trebuie să aibă servicii de reînnoire a certificatelor, de revocare a certificatelor emise expirate, precum și liste a acestor certificate revocate, aceste servicii nefiind implementate aici.
Această lucrare prezintă o modalitate de securizare a unui magazin virtual, din momentul în care un client dorește să cumpere ceva ce ales, până în momentul în care reușește aceasta, trecând prin toți pașii implicați în protejarea informațiilor private ce trebuie să le ofere pentru efectuarea tranzacției.
6. Anexa
Pentru site-ul de interfata
Index.html:
<!– Prima pagina a site-ului de certificate @ Dorin Stanciu –>
<HTML>
<HEAD>
<TITLE>
RomSign – Bine ati venit
</TITLE>
</HEAD>
<FRAMESET rows='110,*' border=0>
<FRAME src='./up.html' name=up resizable=no scrolling=no frameborder=no autoresize=yes>
<FRAME src='./down.html' name=down frameborder=no resizable=yes>
</FRAMESET>
</HTML>
Up.html:
<HTML>
<HEAD>
<LINK rel=stylesheet type="text/css" href='/up.css'>
</HEAD>
<BODY bgcolor=#FFFFFF leftmargin=0 rightmargin=0 marginheight=0 marginwidth=0 topmargin=0 bottommargin=0>
<TABLE border=0 cellpadding=0 cellspacing=0 width=100% height=100%>
<TR>
<TD colspan=3 bgcolor=#FFFFFF><img src='/images/sign.jpg'></TD>
</TR>
<TR>
<TD bgcolor=#790000 height=39>
<TABLE border=0 cellpadding=0 cellspacing=0 height=100%>
<TR>
<TD width=160 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='/scripts/dispatcher.php3?tip=personal' target=center><b>Certificate Personale</b></a></FONt></TD>
<TD width=160 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='/scripts/dispatcher.php3?tip=server' target=center><b>Certificate Server Web</b></a></FONT></TD>
<TD width=220 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='/scripts/dispatcher.php3?tip=cert' target=center><b>Certificatul autoritatii RomSign</b></a></FONT></TD>
<TD width=60 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='/info.html' target=center><b>Info</b></a></FONT></TD>
<TD width=60 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='/scripts/ajutor.php3?param=start' target=center><b>Ajutor</b></a></FONT></TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
Up.css:
A:link {font-weight: bold;text-decoration: none;color: #FFFFFF}
A:visited {font-weight: bold;text-decoration: none;color: #FFFFFF}
A:hover {color: #D1787B;}
Down.html:
<FRAMESET cols='120,*' border=0>
<FRAME src='./left.html' name=left resizable=no scrolling=auto frameborder=no>
<FRAME src='./info.html' name=center resizable=no scrolling=auto frameborder=yes>
</FRAMESET>
Left.html:
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY background='/images/signback.jpg' top=0 leftmatrgin=0 rightmargin=0 topmargin=0 bottommargin=0>
<TABLE>
<TR><TD> </TD></TR>
<TR><TD> </TD></TR>
<TR><TD> </TD></TR>
<TR><TD> </TD></TR>
<TR><TD> </TD></TR>
<TR><TD><FONT color=#790000 face='Times' size=3><B>Bine ati venit la RomSign, autoritate de certificate internationala</B></FONT></TD></TR>
<TR><TD><IMG src='/images/cert.gif'></TD></TR>
<TR><TD><B><A href='/info.html' target=center><U>Info</U></A></B></TD></TR>
<TR><TD><B><A href='/scripts/ajutor.php3?param=start' target=center><U>Ajutor</U></A></B></TD></TR>
<TR><TD><B><A href='/dictionar.html' target=center><U>Dictionar</U></A></B></TD></TR>
<TR><TD><B><A href='/copyright.html' target=center><U>Copyright</U></A></B></TD></TR>
</TABLE>
</BODY>
</HTML>
Info.html:
<HTML>
<HEAD>
<TITLE>RomSign – Info</TITLE>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Informatii</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR>
<TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<!– urmeaza textul –>
In Internet, foarte multe protocoale folosite, in particular acelea care suporta servicii de securitate larg distribuite, necesita autentificare cu ajutorul cheilor publice si private, adica cu <i>certificate</i>. Recomandarile CCITT 1988 X.500 arata ca administrarea acestor certificate este facuta de <i>Autoritatile de Certificate</i> (CA).<BR>
Ce este o CA? O autoritate de certificate este echivalentul lumii digitale a birourilor de emitere a pasapoartelor. Ele emit certificate si valideaza identitatea si autoritatea proprietarului certificatului. Administrarea certificatelor include crearea, pastrarea, distributia si verificarea acestora.<BR>
<i>RomSign</i> este o autoritate internationala de certificate, ce ofera posibilitatea administratorilor de site-uri Web, precum si persoanelor fizice, de a securiza si personaliza accesul la diferite servicii Web (eCommerce, administrare de la distanta, interfete catre baze de date, etc.).<BR>
Pentru a realiza acest lucru, utilizatorii site-ului <i>RomSign</i> trebuie sa ofere cateva date personale. Administratorii de site-uri Web ce doresc sa isi securizeze serverul SSL cu un certificat de la <i>RomSign</i> trebuie sa faca o cerere pentru un <A href="/scripts/dispatcher.php3?tip=server"><U>server Web</U></A>. Persoanele fizice ce doresc sa obtina un certificat personal de la <i>RomSign</i> trebuie sa urmeze aceasta <A href="/scripts/dispatcher.php3?tip=personal"><U>cale</U></A>.<BR>
Daca oricare dintre legaturile din acest sit nu functioneaza, aigurati-va ca browser-ul dumneavostra recunoaste JAVASCRIPT.
<!– textul se termina –>
</b></font></TD>
</TR>
</TABLE>
</TD></TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
All.css:
A:link {font-family: Times; font-weight: bold;text-decoration: none;color: #FFFFFF}
A:visited {font-weight: bold;text-decoration: none;color: #FFFFFF}
A:hover {color: black;}
Server.html:
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Certificate Server Web</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR>
<TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<!– urmeaza textul –>
Certificatele server SSL ale <I>RomSign</I> va vor permite sa folositi SSL pe serverul dumneavostra Web, astfel dandu-va posibilitatea sa comunicati sigur cu clientii dumneavostra online. SSL protejeaza toate comunicatiile online cu clientii dumneavostra, astfel ca puteti accepta cereri cu informatii de pe credit card-uri bancare, puteti proteja informatii personale sau importante pentru dumneavostra, si puteti fi siguri ca hacker-ii nu pot detecta parolele dumneavostra.<BR>
Certificatele server SSL ale <I>RomSign</I> au fost realizate asfel incat sa permita criptare pe 128 biti, atat timp cat serverul dumneavostra si browser-ele clientilor dumneavostra vor permite o astfel de criptare puternica.<BR>
Certificate server SSL ale <I>RomSign</I> sunt semnate digital pentru o perioada de 2 ani.<BR>
Pentru a obtine un certificat pentru un server SSL, trebuie sa urmati urmatorii pasi:<BR>
<OL>
<LI><A href='/scripts/generator.php3?param=gensslreq'><U>Formular cerere pentru un certificat server SSL</U></A></LI>
<LI><A href='' onClick='userConfirm(this)'><U>Obtineti cetificatul server SSL cerut</U></A></LI>
</OL>
Pentru orice ajutor in privinta instalarii certificatului pe serverul dumneavostra Web, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <I>RomSign</I>.
<!– textul se termina –>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function userConfirm( linkto ) {
var passwd;
var url;
passwd=prompt('Introduceti parola primita prin email de la RomSign','');
if( passwd == null || passwd == '' ) {
alert('Nu ati introdus nici o parola');
linkto.href='/info.html';
}
url='/scripts/generator.php3?param=versslcrt&passwd='+passwd;
linkto.href=url;
}
</SCRIPT>
</HTML>
Copyright.html:
<HTML>
<HEAD>
<TITLE>RomSign – Info</TITLE>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Copyright</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR>
<TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<!– urmeaza textul –>
Acest site a fost realizat in cadrul Lucrarii de Diploma, de catre Dorin Stanciu, student al Facultatii de Automatica si Calculatoare, sectia Automatica, grupa 351 AB.<BR>
Indrumator prof. dr. ing. Dorin Carstoiu.
<!– textul se termina –>
</b></font></TD>
</TR>
</TABLE>
</TD></TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
Dispatcher.php3:
<?php
print "
<HTML>
<SCRIPT language='javascript'>
var detect = navigator.userAgent.toLowerCase();
var OS,browser,version,total,thestring;
if (checkIt('konqueror')) {
browser = 'Konqueror';
OS = 'Linux';
}
else if (checkIt('opera')) browser = 'Opera';
else if (checkIt('webtv')) browser = 'WebTV';
else if (checkIt('icab')) browser = 'iCab';
else if (checkIt('msie')) browser = 'InternetExplorer';
else if (!checkIt('compatible')) {
browser = 'NetscapeNavigator';
version = detect.charAt(8);
}
else browser = 'An unknown browser';
if (!version) version = detect.charAt(place + thestring.length);
if (!OS)
{
if (checkIt('linux')) OS = 'Linux';
else if (checkIt('x11')) OS = 'Unix';
else if (checkIt('mac')) OS = 'Mac'
else if (checkIt('win')) OS = 'Windows'
else OS = 'an unknown operating system';
}
function checkIt(string)
{
place = detect.indexOf(string) + 1;
thestring = string;
return place;
}
total='Dumneavostra%20folositi%20'+browser+'%20'+version+'%20pe%20un%20sistem%20de%20operare%20'+OS;
if(browser=='NetscapeNavigator') {
if(version>=4) {\n";
if($tip=='personal') print " var url='/scripts/personal.php3?browser=ns&total='+total;\n";
if($tip=='server') print " var url='/server.html';\n";
if($tip=='cert') print " var url='/scripts/importnsca.php3';\n";
print "
parent.center.location.href=url;
}
}
else if(browser=='InternetExplorer'){
if(version>=4) {";
if($tip=='personal') print " var url='/scripts/personal.php3?browser=ie&total='+total;\n";
if($tip=='server') print " var url='/server.html';\n";
if($tip=='cert') print " var url='/scripts/importieca.php3';\n";
print "
parent.center.location.href=url;
}
}else{
parent.center.load='/scripts/nobrowser.php3?total='+total;
}
</SCRIPT>
</HTML>
";
?>
Nsenroll.php3:
<?php
if(strcmp($param,"genperreq")==0) {
# se genereaza forma de enrollment pentru Netscape Navigator 4+
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<FORM name=nsenroll method=POST action='/scripts/nsenroll.php3?param=reqsent'>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 bgcolor=#790000>
<TR><TD colspan=2 width=670 align=center><B><FONT face='Times' color=#FFFFFF>Introducere informatii certificat personal</FONT></B></TD></TR>
<TR><TD colspan=2>
<TABLE width=100% border=0 cellspacing=2 cellpadding=8>
<TR ><TD width=668 bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<TABLE width=100% height=100% border=0 cellspacing=0 cellpadding=7>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Tara</TD><TD width=350 align=center><INPUT type=text name=country size=2></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Stat(judet)</TD><TD width=350 align=center><INPUT type=text name=state></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Localitate</TD><TD width=350 align=center><INPUT type=text name=local></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Organizatie</TD><TD width=350 align=center><INPUT type=text name=org></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Departament</TD><TD width=350 align=center><INPUT type=text name=orgunit></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Nume</TD><TD width=350 align=center><INPUT type=text name=cn></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Adresa email</TD><TD width=350 align=center><INPUT type=text name=email></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Parola</TD><TD width=350 align=center><INPUT type=password name=password></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Verificare parola</TD><TD width=350 align=center><INPUT type=password name=password2></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Tip cheie</TD><TD width=350 align=center><KEYGEN name='ns_key' challenge='password'></FONT></B></TD></TR>
</TABLE>
</B></FONT></TD></TR>
<TR><TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><B>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR>
<TD width=335 align=right valign=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD>
<TD width=335 align=left valign=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goSubmit()'><U>Trimite</U></A></FONT></B></TD>
</TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
function goSubmit() {
var country=document.nsenroll.country.value;
var state=document.nsenroll.state.value;
var local=document.nsenroll.local.value;
var org=document.nsenroll.org.value;
var orgunit=document.nsenroll.orgunit.value;
var cn=document.nsenroll.cn.value;
var email=document.nsenroll.email.value;
var password=document.nsenroll.password.value;
var password2=document.nsenroll.password2.value;
if(country.length!=2 || state.length==0 || local.length==0 || org.length==0 || orgunit.length==0 || cn.length==0 || email.length==0 || password.length==0 || password2.length==0){
alert('Toate campurile trebuie completate, iar numele tarii trebuie sa aiba exact 2 caractere');
return false;
}else{
if(password==password2) {
document.nsenroll.submit();
return false;
}else{
alert('Cele doua parole introduse trebuie sa fie la fel !');
return false;
}
}
}
</SCRIPT>
</HTML>";
}
if(strcmp($param,"verpercrt")==0) {
$verify=0;
# make con to database and check if is there, then set 'verify';
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
$result=mysql_select_db("romsign",$dbconn) or die("Nu pot sa fac connexiunea la db romsign");
$query="select serial from certs where passwd='$passwd' and stare='aprobat' and tip='personal'"; # gasim nr serial al certificatului cu parola data de user si care a fost aprobat
$result=mysql_query($query);
if($result>0) {
$rows=mysql_num_rows($result);
if($rows>0) {
$row=mysql_fetch_array($result);
$serial=$row['serial'];
if($serial!=-1) {
$serial=dechex($serial);
if(strlen($serial)<2) {
$serial="0"."$serial";
}
$serial=strtoupper($serial);
$verify=1;
}
}
}
mysql_close($dbconn);
if($verify==1) {
$usercert="/usr/local/ssl/CA/newcerts/$serial.pem";
$mimetype="Content-type: application/x-x509-user-cert";
$fp=fopen($usercert,"r");
$len=filesize($usercert);
$content=fread($fp,$len);
header($mimetype);
echo "Content-Length: $len\n\n$content";
# actualizam db
$query="update certs set stare='emis' where passwd='$passwd' and stare='aprobat' and tip='personal'";
$result=mysql_query($result) or die($query);
}elseif($verify==0) {
#certificatul inca nu a fost semnat
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Incarcare certificat personal in browser</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR><TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
Ne pare rau, dar se pare ca certificatul dumneavostra nu a fost aprobat inca.<BR>
Reveniti peste cateva ore, in cazul in care nu ati primit nici un email de la <i>RomSign</i>.<BR><BR>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR>
<TD width=670 align=center valign=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD>
</TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
</SCRIPT>
</HTML>";
} #verify==0
} #param==verperreq
if(strcmp($param,"reqsent")==0) {
# in caz ca utilizatorul a apasat pe "cancel"
if(strlen($ns_key)==0) {
header("Location: /info.html");
}
$ns_key=preg_replace("/\n/","",$ns_key); # trecem peste caracterele \n
# conexiunea la db
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
$result=mysql_select_db("romsign",$dbconn) or die("Couldn't make the connection to database romsign");
$query="select max(id) as id from certs"; # selectam cel mai mare id
$result=mysql_query($query) or die($query);
while($row=mysql_fetch_array($result)) {
$id=$row['id'];
}
$id++;
$passwd=crypt($id);
$query="insert into certs (browser,userpasswd, passwd,commonname,country,state,locality,org,orgunit,email,data,stare,tip) values ('ns','$password','$passwd','$cn','$country','$state','$local','$org','$orgunit','$email',CURRENT_TIMESTAMP(),'cerere','personal')";
$result=mysql_query($query) or die($query);
mysql_close($dbconn) or die("Couldn't close the db connection");
# make request file
$reqfile="/usr/local/ssl/CA/crl/$id.req";
$fp=fopen($reqfile,"w");
fputs($fp,"SPKAC=$ns_key\n");
fputs($fp,"PASSWD=$password\n");
fputs($fp,"C=$country\n");
fputs($fp,"ST=$state\n");
fputs($fp,"L=$local\n");
fputs($fp,"O=$org\n");
fputs($fp,"OU=$orgunit\n");
fputs($fp,"CN=$cn\n");
fputs($fp,"Email=$email\n");
fclose($fp);
# show some text
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Introducere certificat personal in browser</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR><TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
Cererea dumneavoastra a fost trimisa. Va multumim pentru folosirea <i>RomSign</i> ca autoritate de certificate.<BR>
Va rugam sa reveniti pe site-ul <i>RomSign</i> in momentul in care sunteti contactat prin email de catre <i>RomSign</i>, la contul de email introdus de dumneavoastra.<BR><BR>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR>
<TD width=670 align=center valign=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD>
</TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
</SCRIPT>
</HTML>";
}
?>
Ieenroll.php3:
<?php
if(strcmp($param,"genperreq")==0) {
# se genereaza forma de enrollment pentru Internet Explorer 4+
print "
<HTML>
<HEAD>
<TITLE>Internet Explorer Enrollment</TITLE>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<OBJECT classid=\"clsid:43F8F289-7A20-11D0-8F06-00C04FC295E1\" CODEBASE=\"/xenroll.dll\" id=\"cenroll\">
</OBJECT>
<SCRIPT LANGUAGE=\"VBScript\">
<!–
Function IsIE4
dim ua
dim msie
dim tmp
dim ver
ua = window.navigator.userAgent
ver = mid(ua,instr(ua,\"MSIE\") + 5, 1)
if ver >= 4 then
tmp = true
else
tmp = false
end if
IsIE4 = tmp
End Function
dim majorver
dim ua
dim ie3
dim ie4
dim aol
dim minorver4
dim update
dim winplat
dim nav
dim win32
dim intButton
dim upgrade
dim f_addfield1
dim f_addfield2
dim f_addfield3
dim bValidAddField
f_addfield1 = 0
f_addfield2 = 0
f_addfield3 = 0
upgrade = 0
set nav = navigator
ua = nav.useragent
minorver4 = \"\"
if len(ua) >=1 then 'nav object is supported
winplat = mid(ua,instr(ua,\"Windows\") + 8, 2)
win32 = mid(ua,instr(ua,\"Win\") + 3, 2) 'In some user agent strings the platform is referred to as Win32
majorver = mid(ua,instr(ua,\"MSIE\") + 5, 1)
ie3 = majorver = 3 and (winplat = \"NT\" or winplat = \"95\" or win32 =\"32\")
ie4 = majorver = 4 and (winplat = \"NT\" or winplat = \"95\" or win32 =\"32\")
update = instr(ua,\"Update a\")
aol = instr(ua,\"AOL\")
if ie4 then minorver4 = mid(ua,instr(ua,\"MSIE\") + 7, 3)
If (ie3 or minorver4 = \"0b1\") and update = 0 and aol = 0 then
upgrade = 1
end if
else
upgrade = 1
end if
if upgrade = 1 then
intButton = msgbox (\"Pentru a folosi aceasta forma aveti nevoie de Microsoft Internet Explorer versiune 4 sau mai mare, sau versiunea3.02 cu Authenticode 2.0. Vreti sa aduceti un browser nou acum?\", 4 + 64, \"Update My Browser Now!\" )
if intButton = 6 then
location.href = \"http://www.microsoft.com/ie/download\"
else
location.href = \"/scripts/nobrowser.php3\"
end if
end if
Sub FindProviders
Dim i, j
Dim providers()
i = 0
j = 1
Dim el
Dim temp
Dim first
On Error Resume Next
first = 0
FixAcceptButton()
Do While True
temp = \"\"
cenroll.providerType = j
temp = cenroll.enumProviders(i,0)
If Len(Temp) = 0 Then
If j < 1 Then 'Look for RSA_FULL only.
j = j + 1
i = 0
Else
Exit Do
End If
Else
set el = document.createElement(\"OPTION\")
el.text = temp
el.value = j
document.all.cryptProv.add(el)
If first = 0 Then
first = 1
document.all.cryptProv.selectedIndex = 0
End If
i = i + 1
End If
Loop
End Sub
Function CreateP10(aForm)
On Error Resume Next
CreateP10 = \"\"
szName = \"C=\"
szName = szNAme & aForm.country.value & \"; ST=\" & aForm.state.value & \"; L=\" & aForm.local.value & \"; O=\" & aForm.org.value & \"; OU=\" & aForm.orgunit.value & \"; CN=\" & aForm.cn.value & \"; 1.2.840.113549.1.9.1=\" & aForm.email.value
MsgBox(\"szName=\"+szName)
CreateP10 = cenroll.CreatePKCS10(szName, \"1.3.6.1.5.5.7.3.2\")
if Len(CreateP10) <> 0 Then Exit Function
End Function
Sub accept_onclick
dim theForm
dim options
dim cn
dim lengthofkey
set theForm = document.ieSubmit
if IsIE4() Then
On Error Resume Next
set options = document.all.cryptProv.options
index = options.selectedIndex
cenroll.providerName = options(index).text
cenroll.providerType = options(index).value
else
On Error resume next
cenroll.providerType = 1
cenroll.providerName = \"Microsoft Base Cryptographic Provider v1.0\"
end if
cenroll.HashAlgorithm = \"MD5\"
set keyUsageOptions = document.all.KeyUsage.options
index = keyUsageOptions.selectedIndex
if KeyUsageOptions(index).text = \"Signing\" then
cenroll.KeySpec = 2
else
cenroll.KeySpec = 1
end if
theForm.public_key.value = CreateP10(theForm)
if Len(theForm.public_key.value) = 0 then
MsgBox(\"Eroarea: \" + hex(err.number) + \" a aparut in generarea cererii de certificat\")
window.navigate(\"/MSkeygenerr.htm\")
end if
End Sub
–>
</SCRIPT>
<BODY bgcolor=#FFFFFF onLoad=\"FindProviders()\">
<FORM name=ieSubmit method=POST action='/scripts/ieenroll.php3?param=reqsent'>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 bgcolor=#790000>
<TR><TD colspan=2 width=670 align=center><B><FONT face='Times' color=#FFFFFF>Introducere informatii certificat personal</FONT></B></TD></TR>
<TR><TD colspan=2>
<TABLE width=100% border=0 cellspacing=2 cellpadding=8>
<TR ><TD width=668 bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<TABLE width=100% height=100% border=0 cellspacing=0 cellpadding=7>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Tara</TD><TD width=350 align=center><INPUT type=text name=country size=2></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Stat(judet)</TD><TD width=350 align=center><INPUT type=text name=state></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Localitate</TD><TD width=350 align=center><INPUT type=text name=local></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Organizatie</TD><TD width=350 align=center><INPUT type=text name=org></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Departament</TD><TD width=350 align=center><INPUT type=text name=orgunit></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Nume</TD><TD width=350 align=center><INPUT type=text name=cn></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Adresa email</TD><TD width=350 align=center><INPUT type=text name=email></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Numele providerului serviciului de securitate</TD><TD width=350 align=center><SELECT name='cryptProv'></SELECT></FONT></B></TD></TR>
</TABLE>
</B></FONT></TD></TR>
<TR><TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><B> Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i></B></FONT><INPUT type=hidden name='public_key' value=''></TD>
</TR>
</TABLE>
</TD></TR>
<TR>
<TD width=335 align=right valign=center><B><FONT face='Times' color=#FFFFFF><A href='javascript:history.go(-1)'><U>Inapoi</U></A></FONT></B></TD>
<TD width=335 align=left valign=center><B><FONT face='Times' color=#FFFFFF><A href='javascript: goSubmit()' onClick='accept_onclick()'><U>Trimite</U></A></FONT></B></TD>
</TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
<SCRIPT language='javascript'>
function goSubmit() {
var country=document.ieSubmit.country.value;
var state=document.ieSubmit.state.value;
var local=document.ieSubmit.local.value;
var org=document.ieSubmit.org.value;
var orgunit=document.ieSubmit.orgunit.value;
var cn=document.ieSubmit.cn.value;
var email=document.ieSubmit.email.value;
if(country.length!=2 || state.length==0 || local.length==0 || org.length==0 || orgunit.length==0 || cn.length==0 || email.length==0){
alert('Toate campurile trebuie completate, iar numele tarii trebuie sa aiba exact 2 caractere');
}else{
document.ieSubmit.submit();
return false;
}
}
</SCRIPT>
</HTML>";
}
if(strcmp($param,"verpercrt")==0) {
$verify=0;
# make con to database and check if is there, then set 'verify';
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
$result=mysql_select_db("romsign",$dbconn) or die("Nu pot sa fac connexiunea la db romsign");
$query="select id from certs where passwd='$passwd' and stare='aprobat' and tip='personal'"; # and stare = aprobat
$result=mysql_query($query);
if($result>0) {
$rows=mysql_num_rows($result);
if($rows>0) {
$row=mysql_fetch_array($result);
$id=$row['id'];
$verify=1;
}
}
mysql_close($dbconn);
if($verify==1) {
$certificate="";
$usercert="/usr/local/ssl/CA/newcerts/$id.pkcs7";
$fp=fopen($usercert,"r");
$started=0;
while( !feof($fp) ) {
$buffer=fgets($fp,4096);
if(preg_match("/BEGIN PKCS7/",$buffer)) {
$started=1;
continue;
}
if(preg_match("/END PKCS7/",$buffer)){
break;
}
if($started) {
$buffer=chop($buffer);
$certificate.=$buffer;
}
}
$page="<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<OBJECT CLASSID=\"clsid:43F8F289-7A20-11D0-8F06-00C04FC295E1\" CODEBASE=\"/xenroll.dll\" ID=Enroll>
</OBJECT>
<SCRIPT language=\"VBScript\">
Sub InstallCert
On Error Resume Next
certificate=\"$certificate\"
Call Enroll.InstallPKCS7(certificate)
if err.Number <> 0 Then
MsgBox(\"Eroare ! Certificatul NU a fost incarcat \"+err.Description)
else
MsgBox(\"Certificatul dumneavoastra a fost incarcat in browser\")
end if
End Sub
</SCRIPT>
<BODY bgcolor=#FFFFFF onLoad='InstallCert()' onExit='/scripts/ieupdate.php3?passwd=$passwd'>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Incarcare certificat personal in browser</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR><TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
Certificatul dumneavostra a fost aprobat.<BR>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR>
<TD width=670 align=center valign=center><B><FONT face='Times' color=#FFFFFF><A href='javascript:history.go(-1)'><U>Inapoi</U></A></FONT></B></TD>
</TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>";
print $page;
}elseif($verify==0) {
#certificatul inca nu a fost semnat
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Incarcare certificat personal in browser</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR><TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
Ne pare rau, dar se pare ca certificatul dumneavostra nu a fost aprobat inca.<BR>
Reveniti peste cateva ore, in cazul in care nu ati primit nici un email de la <i>RomSign</i>.<BR><BR>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR>
<TD width=670 align=center valign=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD>
</TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
</SCRIPT>
</HTML>";
} #verify==0
} #param==verperreq
if(strcmp($param,"reqsent")==0) {
$ie_key=preg_replace("/\r/","",$public_key);
# conexiunea la db
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
$result=mysql_select_db("romsign",$dbconn) or die("Couldn't make the connection to database romsign");
$query="select max(id) as id from certs";
$result=mysql_query($query) or die($query);
while($row=mysql_fetch_array($result)) {
$id=$row['id'];
}
$id++;
$passwd=crypt($id);
$query="insert into certs (browser,passwd,commonname,country,state,locality,org,orgunit,email,data,stare,tip) values ('ie','$passwd','$cn','$country','$state','$local','$org','$orgunit','$email',CURRENT_TIMESTAMP(),'cerere','personal')";
$result=mysql_query($query) or die($query);
mysql_close($dbconn) or die("Couldn't close the db connection");
# make request file
$reqfile="/usr/local/ssl/CA/crl/$id.req";
$fp=fopen($reqfile,"w");
fputs($fp,"$ie_key\n");
fclose($fp);
# show some text
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Introducere certificat personal in browser</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR><TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
Cererea dumneavoastra a fost trimisa. Va multumim pentru folosirea <i>RomSign</i> ca autoritate de certificate.<BR>
Va rugam sa reveniti pe site-ul <i>RomSign</i> in momentul in care sunteti contactat prin email de catre <i>RomSign</i>, la contul de email introdus de dumneavoastra.<BR><BR>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR>
<TD width=670 align=center valign=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD>
</TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
</SCRIPT>
</HTML>";
}
?>
Importieca.php3:
<?php
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<SCRIPT language='javascript'>
function goBack() {
window.history.back();
return false;
}
</SCRIPT>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Incarcare in browser certificat autoritate <i>RomSign</i></FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR>
<TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<!– urmeaza textul –>
Incarcarea certificatului autoritatii <i>RomSign</i> in browser este primul pas spre o comunicare sigura pe Internet. Pentru aceasta apasati pe urmatorul link, iar in momentul in care Internet Explorer raspunde cu aparitia ferestrei de download, selectati \"Open this file from its current location\":<BR>
<OL>
<LI><IMG src='/images/cert.gif'><A href='/cacert.der'><U>Incarcati certificat autoritate</U></A></LI>
<LI>Apare o noua fereastra ce afiseaza proprietatile certificatului. Apasati <i>Next</i></LI>
<LI>Apasati <i>Install</i></LI>
<LI>Va aparea o fereastra numita 'Certificate Manager Import Wizard'.Apasati <i>Next</i></LI>
<LI>Veti fi intrebati sa selectati un 'Certificate Store'. Selectati 'Automatically select the certificate store based on the type of certificate'. Apasati apoi <i>Next</i></LI>
<LI>Se vor afisa informatiile selectate. Apasati <i>Finish</i></LI>
<LI>Selectati <i>OK</i> in fereastra originala pentru a o inchide</LI>
</OL>
Pentru orice informatii in privinta instalarii certificatului in browser-ul dumneavostra Web, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <I>RomSign</I>.
<!– textul se termina –>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD></TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>";
?>
Importnsca.php3:
<?php
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Incarcare in browser certificat autoritate <i>RomSign</i></FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR>
<TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<!– urmeaza textul –>
Incarcarea certificatului autoritatii <i>RomSign</i> in browser este primul pas spre o comunicare sigura pe Internet. Pentru aceasta trebuie sa urmati urmatorii pasi:<BR>
<OL>
<LI><IMG src='/images/cert.gif'><A href='/scripts/loadnsca.php3'><U>Incarcati certificat autoritate</U></A></LI>
<LI>Netscape Navigator va raspunde cu o fereastra numita <i>New Certificate Authority</i>. Apasati <i>Next</i></LI>
<LI>Alte informati sunt afisate. Apasati <i>Next</i></LI>
<LI>Informatii despre autoritatea de certificate <i>RomSign</i> sunt afisate. Apasati pe <i>More info…</i></LI>
<LI>Sunt afisate informatii complete despre certificat. Apasati <i>OK</i>, apoi <i>Next</i></LI>
<LI>Veti fi intrebat ce doriti sa faceti cu acest certificat. Apasati cel putin primul buton radio, apoi <i>Next</i></LI>
<LI>Veti fi intrebat daca sa fiti atentionat de fiecare data cand trimiteti date catre site-uri certificate de catre <i>RomSign</i>. Este optional. Apasati <i>Next</i></LI>
<LI>Veti fi intrebat pentru un nume al autoritatii de certificate. Introduceti <i>\"RomSign CA\"</i></LI>
<LI>Apasati <i>Finish</i></LI>
</OL>
Pentru orice informatii in privinta instalarii certificatului in browser-ul dumneavostra Web, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <I>RomSign</I>.
<!– textul se termina –>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></i></FONT></B></TD></TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
</SCRIPT>
</HTML>";
?>
Loadnsca.php3:
<?php
$cert="/usr/local/ssl/CA/cacert.pem";
$fp=fopen($cert,"r");
$filesize=filesize($cert);
$filecontent=fread($fp,$filesize);
header("Content-type: application/x-x509-ca-cert\n");
echo "Content-Length: ",$filesize,"\n\n$filecontent";
?>
Ieupdate.php3:
<?php
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
$result=mysql_select_db("romsign",$dbconn) or die("Nu pot sa fac conexiunea la db romsign");
$query="update certs set stare='emis' where passwd='$passwd' and tip='personal'";
$result=mysql_query($query) or die($query);
?>
Ajutor.php3:
<?php
$page="";
$begin=" ";
if(strcmp($param,"start")==0) {
$page="$page$begin Obtineti ajutor pentru<BR>
<OL>
<LI><A href='/scripts/ajutor.php3?param=personal'><U>Certificate personale</U></A></LI>
<LI><A href='/scripts/ajutor.php3?param=server'><U>Certificate pentru server Web SSL</U></A></LI>
</OL>";
}
if(strcmp($param,"personal")==0) {
$page="$page$begin Obtineti ajutor pentru<BR>
<OL>
<LI><A href='/scripts/ajutor.php3?param=persform'><U>Informatiile introduse in forma de inscriere</U></A></LI>
<LI><A href='/scripts/ajutor.php3?param=persinst'><U>Instalarea certificatului personal in browser</U></A></LI>
</OL>";
}
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Ajutor</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR>
<TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<!– urmeaza textul –>
$page
Pentru orice ajutor in privinta instalarii certificatului pe serverul dumneavostra Web, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <I>RomSign</I>.
<!– textul se termina –>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF><A href='/scripts/ajutor.php3?param=start' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD></TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
</SCRIPT>
</HTML>";
?>
Personal.php3:
<?php
if($browser=='ns') {
$link1='/scripts/importnsca.php3';
$link2='/scripts/nsenroll.php3?param=genperreq';
$link3='/scripts/nsenroll.php3?param=verpercrt';
}elseif($browser=='ie') {
$link1='/scripts/importieca.php3';
$link2='/scripts/ieenroll.php3?param=genperreq';
$link3='/scripts/ieenroll.php3?param=verpercrt';
}
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Certificate Personale</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR>
<TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
$total. Cele mai multe browser-e, cum ar fi Internet Explorer sau Netscape Navigator (cu versiuni mai mari de 3.x), permit utilizatorilor sa foloseasca un certificat personal pentru a se autentifica la un server de Web. Autentificarea pe baza de certificate este mult mai sigura si mai puternica decat autentificarea prin parola.<BR>
Un certificat personal este intradevar un \"pasaport\" special in format digital ce contine informatii despre dumneavoastra si este semnat de catre <i>RomSign</i>.<BR>
<i>RomSign</i> suporta formatul X.509 al certificatelor. Certificatele X.509 sunt conforme standardului OSI, si se pot introduce in diferite programe pentru Internet ( cum ar fi InternetExplorer si Netscape ) pentru a va autentifica catre oricine \"altcineva\" ( un server Web de obicei ).<BR>
Pentru a crea un certificat pentru dumneavoastra trebuie sa urmati urmatorii pasi:<BR>
<OL>
<LI><A href='$link1'><U>Obtineti certificatul autoritatii <I>RomSign</I></U></A></LI>
<LI><A href='$link2'><U>Formular cerere certificat personal</U></A></LI>
<LI><A href='#' onClick='userConfirm(this)'><U>Obtineti certificatul cerut</U></A></LI>
</OL>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function userConfirm( linkto ) {
var passwd;
var url;
passwd=prompt('Introduceti parola primita prin email de la RomSign','');
if( passwd == null || passwd == '' ) {
alert('Nu ati introdus nici o parola');
linkto.href='/info.html';
}
url='$link3&passwd='+passwd;
linkto.href=url;
}
</SCRIPT>
</HTML>";
?>
Nobrowser.php3:
<?php
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Certificate Personale</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR>
<TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
$total<BR>
Ne pare rau site-ul nostru poate fi folosit numai cu Internet Explorer 4 (sau o versiune mai mare) si Netscape Navigator 4 (sau o versiune mai mare)<BR>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, adresati-va sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
";
?>
Loadsslcrt.php3:
<?php
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
$result=mysql_select_db("romsign",$dbconn) or die("N-am putut realiza conexiunea la db romsign");
$query="select serial from certs where passwd='$passwd' and serial=$serial and stare='aprobat' and tip='server'";
$result=mysql_query($query) or die($query);
$rows=mysql_num_rows($result);
if($rows<=0) {
print "
<HTML>
<SCRIPT language='javascript'>
function goOn( linkto ) {
alert('Ati introdus parola gresit, sau ati ati ajuns la acest link din greseala ! $rows $s');
linkto.href='/info.html';
}
</SCRIPT>
<BODY bgcolor=#FFFFFF onLoad='return goOn( this )'>
</BODY>
</HTML>";
}else{
while($row=mysql_fetch_array($result)) {
$serial=$row['serial'];
}
$serial=dechex($serial);
if(strlen($serial)<2){
$serial="0".$serial;
}
$serial=strtoupper($serial);
$servercert="/usr/local/ssl/CA/newcerts/$serial"."server.pem";
if(file_exists($servercert)) {
$mimetype="Content-type: application/octet-stream";
$fp=fopen($servercert,"r");
$len=filesize($servercert);
$content=fread($fp,$len);
header($mimetype);
echo "Content-Length: $len\n\n$content";
}
$query="update certs set stare='emis' where passwd='$passwd' and serial='$serial'";
$result=mysql_query($query) or die($query);
}
?>
generator.php3:
<?php
if(strcmp($param,"gensslreq")==0) {
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<FORM name=sslenroll method=POST action='/scripts/generator.php3?param=reqsent'>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 bgcolor=#790000>
<TR><TD colspan=2 width=670 align=center><B><FONT face='Times' color=#FFFFFF>Introducere informatii certificat server SSL</FONT></B></TD></TR>
<TR><TD colspan=2>
<TABLE width=100% border=0 cellspacing=2 cellpadding=8>
<TR ><TD width=668 bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<TABLE width=100% height=100% border=0 cellspacing=0 cellpadding=7>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Tara</TD><TD width=350 align=center><INPUT type=text name=country size=2></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Stat(judet)</TD><TD width=350 align=center><INPUT type=text name=state></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Localitate</TD><TD width=350 align=center><INPUT type=text name=local></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Organizatie</TD><TD width=350 align=center><INPUT type=text name=org></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Departament</TD><TD width=350 align=center><INPUT type=text name=orgunit></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Numele DNS al serverului</TD><TD width=350 align=center><INPUT type=text name=cn></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Adresa email</TD><TD width=350 align=center><INPUT type=text name=email></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Parola</TD><TD width=350 align=center><INPUT type=password name=passwd></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Verificare parola</TD><TD width=350 align=center><INPUT type=password name=passwd2></FONT></B></TD></TR>
<TR><TD width=350 align=center valign=center><FONT face='Times' color=#790000><B>Doriti cheia scoasa din certificat ?</TD><TD width=350 align=center><INPUT type=checkbox name=withkey value=1></FONT></B></TD></TR>
</TABLE>
</B></FONT></TD></TR>
<TR><TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><B>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR>
<TD width=335 align=right valign=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD>
<TD width=335 align=left valign=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goSubmit()'><U>Trimite</U></A></FONT></B></TD>
</TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
function goSubmit() {
var country=document.sslenroll.country.value;
var state=document.sslenroll.state.value;
var local=document.sslenroll.local.value;
var org=document.sslenroll.org.value;
var orgunit=document.sslenroll.orgunit.value;
var cn=document.sslenroll.cn.value;
var email=document.sslenroll.email.value;
var passwd=document.sslenroll.passwd.value;
var passwd2=document.sslenroll.passwd2.value;
var withkey=document.sslenroll.withkey.value;
if(country.length!=2 || state.length==0 || local.length==0 || org.length==0 || orgunit.length==0 || cn.length==0 || email.length==0 || passwd.length==0 || passwd2.length==0 ){
alert('Toate campurile trebuie completate, iar numele tarii trebuie sa aiba exact 2 caractere');
return false;
}else{
if(passwd!=passwd2) {
alert('Cele doua parole nu se potrivesc !');
}else{
document.sslenroll.submit();
return false;
}
}
}
</SCRIPT>
</HTML>";
}
if(strcmp($param,"versslcrt")==0) {
$verify=0;
# make con to database and check if is there, then set 'verify';
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
$result=mysql_select_db("romsign",$dbconn) or die("Nu pot sa fac connexiunea la db romsign");
$query="select serial from certs where passwd='$passwd' and stare='aprobat' and tip='server'"; # gasim nr serial al certificatului cu parola data de user si care a fost aprobat
$result=mysql_query($query);
if($result>0) {
$rows=mysql_num_rows($result);
if($rows>0) {
$row=mysql_fetch_array($result);
$serial=$row['serial'];
if($serial!=-1) {
$verify=1;
}
}
}
mysql_close($dbconn);
if($verify==1) {
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Certificat server SSL aprobat</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR><TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
Certificatul dumneavostra a fost aprobat !<BR>
Il puteti obtine urmand acest <A href='' onClick='getSslCert( this )'><U>link</U></A> si introducand inca o data parola primita de la <i>RomSign</i>. Salvati fisierul sub numele de <i>servercrt.pem</i><BR>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR>
<TD width=670 align=center valign=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD>
</TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
function getSslCert( linkto ) {
var passwd;
passwd=prompt('Introduceti parola primita de la RomSign prin email','');
if(passwd==null || passwd==''){
alert('Pentru a obtine certificatul trebuie sa introduceti parola corecta !');
}else{
linkto.href='loadsslcrt.php3?passwd='+passwd+'&serial=$serial';
}
}
</SCRIPT>
</HTML>";
}
if($verify==0) {
#certificatul inca nu a fost semnat
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Certificat server SSL</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR><TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
Ne pare rau, dar se pare ca certificatul dumneavostra nu a fost aprobat inca.<BR>
Reveniti peste cateva ore, in cazul in care nu ati primit nici un email de la <i>RomSign</i>.<BR><BR>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR>
<TD width=670 align=center valign=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD>
</TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
</SCRIPT>
</HTML>";
} #verify==0
} #param==verperreq
if(strcmp($param,"reqsent")==0) {
if($withkey!=1) {
$withkey=0;
}
# conexiunea la db si genereaza un serial
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
$result=mysql_select_db("romsign",$dbconn) or die("Couldn't make the connection to database romsign");
$query="select max(id) as id from certs"; # selectam cel mai mare numar serial
$result=mysql_query($query) or die($query);
while($row=mysql_fetch_array($result)) {
$id=$row['id'];
}
$userpasswd=$passwd2;
$passwd=crypt($id);
# aici nu mai conteaza ce browser este; punem ns by default
$query="insert into certs (browser,userpasswd,passwd,commonname,country,state,locality,org,orgunit,email,data,stare,tip,withkey) values ('ns','$userpasswd','$passwd','$cn','$country','$state','$local','$org','$orgunit','$email',CURRENT_TIMESTAMP(),'cerere','server',$withkey)";
$result=mysql_query($query) or die($query);
mysql_close($dbconn) or die("Couldn't close the db connection");
# show some text
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Cerere certificat server SSL</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR><TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
Cererea dumneavoastra a fost trimisa. Va multumim pentru folosirea <i>RomSign</i> ca autoritate de certificate.<BR>
Va rugam sa reveniti pe site-ul <i>RomSign</i> in momentul in care sunteti contactat prin email de catre <i>RomSign</i>, la contul de email introdus de dumneavoastra.<BR><BR>
Pentru orice intrebare in privinta introducerii certificatului in browser-ul dumneavoastra, apelati la sistemul de <A href=''><U>Ajutor</U></A> al <i>RomSign</i>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR>
<TD width=670 align=center valign=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD>
</TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
</SCRIPT>
</HTML>";
}
?>
Pentru site-ul de administrare
Index.html:
<!– Prima pagina a site-ului de certificate @ Dorin Stanciu –>
<HTML>
<HEAD>
<TITLE>
RomSign – Administrare
</TITLE>
</HEAD>
<FRAMESET rows='110,*' border=0>
<FRAME src='./up.html' name=up resizable=no scrolling=no frameborder=no autoresize=yes>
<FRAME src='./down.html' name=down frameborder=no resizable=yes>
</FRAMESET>
</HTML>
Up.html:
<HTML>
<HEAD>
<LINK rel=stylesheet type="text/css" href='/up.css'>
</HEAD>
<BODY bgcolor=#FFFFFF leftmargin=0 rightmargin=0 marginheight=0 marginwidth=0 topmargin=0 bottommargin=0>
<TABLE border=0 cellpadding=0 cellspacing=0 width=100% height=100%>
<TR>
<TD colspan=3 bgcolor=#FFFFFF><img src='/images/sign.jpg'></TD>
</TR>
<TR>
<TD bgcolor=#790000 height=39>
<TABLE border=0 cellpadding=0 cellspacing=0 height=100%>
<TR>
<TD width=260 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='./scripts/admin.php3?param=aproba' target=center><b>Aproba/rejecteaza cereri</b></a></FONt></TD>
<TD width=260 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='./scripts/admin.php3?param=viewaprobate' target=center><b>Vizualizare certificate aprobate</b></a></FONT></TD>
<TD width=220 bgcolor=#790000 align=center valign=center><FONT color=#FFFFFF face='Times' size=3><a href='./scripts/admin.php3?param=viewemise' target=center><b>Vizualizare certificate emise</b></a></FONT></TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
Down.html:
<FRAMESET cols='120,*' border=0>
<FRAME src='./left.html' name=left resizable=no scrolling=auto frameborder=no>
<FRAME src='/copyright.html' name=center resizable=no scrolling=auto frameborder=yes autoresize=no>
</FRAMESET>
Left.html:
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY background='/images/signback.jpg' top=0 leftmatrgin=0 rightmargin=0 topmargin=0 bottommargin=0>
<TABLE>
<TR><TD> </TD></TR>
<TR><TD> </TD></TR>
<TR><TD> </TD></TR>
<TR><TD> </TD></TR>
<TR><TD> </TD></TR>
<TR><TD><FONT color=#790000 face='Times' size=3><B>Bine ati venit la RomSign, autoritate de certificate internationala</B></FONT></TD></TR>
<TR><TD><IMG src='/images/cert.gif'></TD></TR>
<TR><TD><B><A href='/dictionar.html' target=center><U>Dictionar</U></A></B></TD></TR>
<TR><TD><B><A href='/copyright.html' target=center><U>Copyright</U></A></B></TD></TR>
</TABLE>
</BODY>
</HTML>
Admin.php3:
<?php
$page="";
$begin=" ";
if(strcmp($param,"aproba")==0) {
$page="$page$begin Urmand linkurile urmatooare puteti vizualiza cererile pentru certificate personale sau pentru servere web, apoi sa le semnati.<BR>
<OL>
<LI><A href='/admin/scripts/view.php3?param=personal&action=aproba'><U>Aproba (semneaza) certificate personale</U></A></LI>
<LI><A href='/admin/scripts/view.php3?param=server&action=aproba'><U>Aproba (semneaza) certificate pentru server Web SSL</U></A></LI>
</OL>";
}
if(strcmp($param,"viewaprobate")==0) {
$page="$page$begin Puteti obtine rapoarte despre certificatele aprobate de catre <i>RomSign</i> pentru persoane fizice sau pentru servere web, ce asteapta sa fie incarcate in browser-e de catre solicitanti:<BR>
<OL>
<LI><A href='/admin/scripts/view.php3?param=personal&action=vaprobate'><U>Vizualizeaza certificate personale aprobate</U></A></LI>
<LI><A href='/admin/scripts/view.php3?param=server&action=vaprobate'><U>Vizualizeaza certificate server aprobate</U></A></LI>
</OL>";
}
if(strcmp($param,"viewemise")==0) {
$page="$page$begin Puteti obtine rapoarte despre certificatele emise de catre <i>RomSign</i> pentru persoanele fizice sau pentru servere web. <BR>
<OL>
<LI><A href='/admin/scripts/view.php3?param=personal&action=vemise'><U>Vizualizare certificate personale emise</U></A></LI>
<LI><A href='/admin/scripts/view.php3?param=server&action=vemise'><U>Vizualizare certificate server web emise</U></A></LI>
</OL>";
}
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF>Raport</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR>
<TD width=668 background='/images/signback.jpg' bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<!– urmeaza textul –>
$page
<!– textul se termina –>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR><TD width=670 align=center><B><FONT face='Times' color=#FFFFFF><A href='./scripts/admin.php3?param=aproba' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD></TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
</SCRIPT>
</HTML>";
?>
Sign.php3:
<?php
# scriptul ce semneaza cererile din db
$dir="/usr/local/ssl/CA";
$cmd="/usr/local/ssl/bin/openssl";
$reqdir="$dir/crl/";
$certdir="$dir/newcerts/";
function getSerial($dir) {
#citim numarul serial generat de openssl
$serialfile="$dir/serial";
$fp=fopen("$serialfile","r");
$serial=fgets($fp,4096);
fclose($fp);
$serial=trim($serial);
return $serial;
}
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0){
mysql_error();
}
$result=mysql_select_db("romsign",$dbconn) or die("Nu pot sa ma conectez la db romsign");
$query="select * from certs where id=$id";
$result=mysql_query($query) or die($query);
while($row=mysql_fetch_array($result)) {
$browser =$row['browser'];
$userpassword =$row['userpasswd'];
$thepassword =$row['passwd'];
$country =$row['country'];
$state =$row['state'];
$local =$row['locality'];
$org =$row['org'];
$orgunit =$row['orgunit'];
$cn =$row['commonname'];
$email =$row['email'];
$tip =$row['tip'];
$withkey =$row['withkey'];
}
$file="$reqdir$id.req";
print "
|$browser|<BR>
|$thepassword|<BR>
|$userpassword|<BR>
|$id|<BR>
|$email|<BR>
|$tip|<BR>
|$withkey|<BR>
passwd=$passwd<BR>";
if(strcmp($tip,"personal")==0) {
print "tip is personal<BR>";
if(strcmp($browser,"ns")==0){
print "Browser is Netscape<BR>";
if(file_exists($file)){
print "Fisierul $file exista<BR>";
$command="$cmd ca -policy policy_anything -spkac $file -days 365";
print "$command<BR>";
$fp=popen($command,"w");
fputs($fp,"$capasswd\n");
fputs($fp,"y\n");
pclose($fp);
}else{
die("Eroare interna ! Nu gasesc fisierul cerere facut de Netscape !");
}
}elseif(strcmp($browser,"ie")==0){
if(file_exists($file)){
$pem="$reqdir$id.pem";
$command="$cmd base64 -d < $file | $cmd req -inform der -text > $pem";
print "$command<BR>";
$fp=popen($command,"w");
pclose($fp);
$crl="$reqdir$id.crl";
$command="$cmd ca -gencrl -policy policy_anything -msie_hack -out $crl -in $pem";
print "$command<BR>parola=$capasswd";
$fp=popen($command,"w");
fputs($fp,"$capasswd\n");
fputs($fp,"y\n");
pclose($fp);
$signed="$certdir$id.pkcs7";
$command="$cmd crl2pkcs7 -certfile $crl -in $crl -out $signed";
print "$command<BR>";
$fp=popen($command,"w");
pclose($fp);
}else{
die("Eroare interna ! Nu gasesc fisierul cerere facut de IE !");
}
}
#certificatul a fost semnat ; se actualizeaza baza de date
if(strcmp($browser,"ns")) {
$serial=getSerial($dir);
print "serial=|$serial|<BR>";
if(strcmp($serial,"00")!=0) {
$serial=preg_replace("/0/","",$serial);
}
print "serial=$serial<BR>";
$serial=hexdec($serial);
print "serial=$serial<BR>";
$serial–;
print "serial=$serial<BR>";
$query="update certs set serial=$serial, stare='aprobat' where id=$id";
$result=mysql_query($query) or die($query);
}
}elseif(strcmp($tip,"server")==0){
#generam o noua pereche cheie/cerere pentru server SSL
$keyfile="$reqdir$id"."key.pem";
$reqfile="$reqdir$id".".req";
$command="$cmd req -new ";
# scoatem parola la cererea utilizatorului
if($withkey==1) {
$command.="-nodes ";
}
$command.="-keyout $keyfile -out $reqfile -days 365";
print "command=$command<BR>|$userpassword|<BR>|$userpassword|<BR>
$country<BR>$state<BR>$local<BR>$org<BR>$orgunit<BR>$cn<BR>$email<BR>withkey=$withkey<BR>
";
$fp=popen("$command","w");
fputs($fp,"$userpassword\n");
fputs($fp,"$userpassword\n");
fputs($fp,"$country\n");
fputs($fp,"$state\n");
fputs($fp,"$local\n");
fputs($fp,"$org\n");
fputs($fp,"$orgunit\n");
fputs($fp,"$cn\n");
fputs($fp,"$email\n");
fputs($fp,"\n");
fputs($fp,"\n");
pclose($fp);
#semnez certificatul
$command="$cmd ca -policy policy_anything -infiles $reqfile";
print "command=$command<BR>";
$fp=popen($command,"w");
fputs($fp,"$passwd\n");
fputs($fp,"y\n");
fputs($fp,"y\n");
pclose($fp);
$serial=getSerial($dir);
$serial=hexdec($serial);
$serial–; #se face transformare in zecimal se pare
$serial=dechex($serial);
if(strlen($serial)<2) {
$serial="0".$serial;
}
$signedkeyfile="$certdir$serial"."key.pem";
if(!copy("$keyfile","$signedkeyfile")) {
die("Nu pot sa copii fisierul $keyfile in $signedkeyfile");
}
$certfile="$certdir$serial.pem";
$serverfile="$certdir$serial"."server.pem";
system("cat $certfile $signedkeyfile > $serverfile");
$serial=hexdec($serial);
$query="update certs set serial=$serial, stare='aprobat' where id=$id";
$result=mysql_query($query) or die($query);
}
# certificatele au fost create si baza de date actualizata; trimitem mail utilizatorilor
$message="Cererea dumneavoastra a fost aprobata si certificatul generat.\nPentru a-l putea incarca in programul de navigare scrieti in caseta de dialog din pagina site-ului nostru, parola urmatoare:\n\n";
$message.=$thepassword;
$message.="\n\nMultumim pentru folosirea RomSign ca autoritate de certificate.\n";
mail("$email","RomSign CA – Raspunsul la cererea dumneavoastra",$message,"FROM: webmaster@$SERVER_NAME\nReplay-to: webmaster@$SERVER_NAME\nX-Mailer: PHP/".phpversion());
mysql_close($dbconn);
#show some text
print "
$file<BR>
SERIAL=$serial<BR>
$message<BR>
";
?>
View.php3:
<?php
# gereaza rapoarte din baza de date
function onView($par,$act,$ord,$stare,$tip,$doit) {
$page="
<TABLE border=2 cellpadding=0 cellspacing=2 bgcolor=#790000 width=100%>
<TR >
<TD width=50 height=30 align=center valign=center bgcolor=#790000><B><FONT color=#FFFFFF face='Times'><A href='../scripts/view.php3?param=$par&action=$act&order=0'><U>Aproba</U></A></FONT></B></TD>
<TD width=150 height=30 align=center valign=center bgcolor=#790000><B><FONT color=#FFFFFF face='Times'><A href='../scripts/view.php3?param=$par&action=$act&order=1'><U>Nume</U></A></FONT></B></TD>
<TD width=50 height=30 align=center valign=center bgcolor=#790000><B><FONT color=#FFFFFF face='Times'><A href='../scripts/view.php3?param=$par&action=$act&order=2'><U>Tara</U></A></FONT></B></TD>
<TD width=150 height=30 align=center valign=center bgcolor=#790000><B><FONT color=#FFFFFF face='Times'><A href='../scripts/view.php3?param=$par&action=$act&order=3'><U>Stat(judet)</U></A></FONT></B></TD>
<TD width=150 height=30 align=center valign=center bgcolor=#790000><B><FONT color=#FFFFFF face='Times'><A href='../scripts/view.php3?param=$par&action=$act&order=4'><U>Localitate</U></A></FONT></B></TD>
<TD width=150 height=30 align=center valign=center bgcolor=#790000><B><FONT color=#FFFFFF face='Times'><A href='../scripts/view.php3?param=$par&action=$act&order=5'><U>Organizatie</U></A></FONT></B></TD>
<TD width=150 height=30 align=center valign=center bgcolor=#790000><B><FONT color=#FFFFFF face='Times'><A href='../scripts/view.php3?param=$par&action=$act&order=6'><U>Departament</U></A></FONT></B></TD>
<TD width=150 height=30 align=center valign=center bgcolor=#790000><B><FONT color=#FFFFFF face='Times'><A href='../scripts/view.php3?param=$par&action=$act&order=7'><U>Email</U></A></FONT></B></TD>
<TD width=150 height=30 align=center valign=center bgcolor=#790000><B><FONT color=#FFFFFF face='Times'><A href='../scripts/view.php3?param=$par&action=$act&order=8'><U>Data cererii</U></A></FONT></B></TD>
</TR>
";
$addquery=" id";
if($ord==0) {
$addquery=" id";
}elseif($ord==1) {
$addquery=" commonname";
}elseif($ord==2) {
$addquery=" country";
}elseif($ord==3) {
$addquery=" state";
}elseif($ord==4) {
$addquery=" locality";
}elseif($ord==5) {
$addquery=" org";
}elseif($ord==6) {
$addquery=" orgunit";
}elseif($ord==7) {
$addquery=" email";
}elseif($ord==8) {
$addquery=" data";
}
$query="select id,commonname,country,state,locality,org,orgunit,email,data from certs where stare='$stare' and tip='$tip' order by $addquery";
$result=mysql_query($query) or die($query);
while($row=mysql_fetch_array($result)) {
$id =$row['id'];
$cn =$row['commonname'];
$country=$row['country'];
$state =$row['state'];
$local =$row['locality'];
$org =$row['org'];
$orgunit=$row['orgunit'];
$email =$row['email'];
$data =$row['data'];
$page.="
<TR>
<TD height=30 align=center valign=center bgcolor=#790000><B><FONT face='Times'><A href='' onClick='userConfirm(this,\"$doit\",$id)'><U>$id</U></A></FONT></B></TD>
<TD align=center valign=center bgcolor=#FFFFFF><B><FONT color=#790000 face='Times'>$cn</FONT></B></TD>
<TD align=center valign=center bgcolor=#FFFFFF><B><FONT color=#790000 face='Times'>$country</FONT></B></TD>
<TD align=center valign=center bgcolor=#FFFFFF><B><FONT color=#790000 face='Times'>$state</FONT></B></TD>
<TD align=center valign=center bgcolor=#FFFFFF><B><FONT color=#790000 face='Times'>$local</FONT></B></TD>
<TD align=center valign=center bgcolor=#FFFFFF><B><FONT color=#790000 face='Times'>$org</FONT></B></TD>
<TD align=center valign=center bgcolor=#FFFFFF><B><FONT color=#790000 face='Times'>$orgunit</FONT></B></TD>
<TD align=center valign=center bgcolor=#FFFFFF><B><FONT color=#790000 face='Times'>$email</FONT></B></TD>
<TD align=center valign=center bgcolor=#FFFFFF><B><FONT color=#790000 face='Times'>$data</FONT></B></TD>
</TR>";
}
$page.="</TABLE>
";
return $page;
}
$begin=" ";
$dbconn=mysql_connect("localhost","romsign","certify");
if($dbconn<0) {
mysql_error();
}
$result=mysql_select_db("romsign",$dbconn) or die("Nu pot sa fac conexiunea la db romsign");
if(strcmp($param,"personal")==0) {
# aici se trateaza rapoartele despre certificatele personale
if(strcmp($action,"aproba")==0) {
$title="Raport cereri certificate personale ";
$stare="cerere";
$tip="personal";
$page=onView($param,$action,$order,$stare,$tip,"sign");
}
if(strcmp($action,"vaprobate")==0) {
$title="Raport certificate personale aprobate";
$stare="aprobat";
$tip="personal";
$page=onView($param,$action,$order,$stare,$tip,"view");
}
if(strcmp($action,"vemise")==0) {
$title="Raport certificate personale emise";
$stare="emis";
$tip="personal";
$page=onView($param,$action,$order,$stare,$tip,"view");
}
}
if(strcmp($param,"server")==0) {
# aici se trateaza rapoartele despre certificatele server
if(strcmp($action,"aproba")==0) {
$title="Raport cereri certificate server web SSL ";
$stare="cerere";
$tip="server";
$page=onView($param,$action,$order,$stare,$tip,"sign");
}
if(strcmp($action,"vaprobate")==0) {
$title="Raport certificate server web SSL aprobate";
$stare="aprobat";
$tip="server";
$page=onView($param,$action,$order,$stare,$tip,"view");
}
if(strcmp($action,"vemise")==0) {
$title="Raport certificate server web SSL emise";
$stare="emis";
$tip="server";
$page=onView($param,$action,$order,$stare,$tip,"view");
}
}
mysql_close($dbconn);
print "
<HTML>
<HEAD>
<LINK rel=stylesheet type='text/css' href='/all.css'>
</HEAD>
<SCRIPT language='javascript'>
function goBack() {
history.go(-1);
return false;
}
function userConfirm( linkto, tip, id ) {
var passwd;
if(tip=='sign') {
passwd=prompt('Introduceti parola autoritatii RomSign','');
if( passwd==null || passwd=='') {
return false;
}else{
linkto.href='../scripts/sign.php3?id='+id+'&capasswd='+passwd;
}
}
}
</SCRIPT>
<BODY bgcolor=#FFFFFF>
<TABLE border=0 cellspacing=0 cellpadding=0>
<TR>
<TD colspan=2>
<BR>
<BR>
<BR>
<BR>
</TD>
</TR>
<TR>
<TD>
</TD>
<TD>
<!– central table –>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 bgcolor=#790000>
<TR><TD align=center><B><FONT face='Times' color=#FFFFFF>$title</FONT></B></TD></TR>
<TR><TD>
<TABLE width=100% border=0 cellspacing=0 cellpadding=8>
<TR>
<TD bgcolor=#ffffff align=left><FONT face='Times' color=#790000><BR><B>
<!– urmeaza textul –>
$page
<!– textul se termina –>
</B></FONT></TD>
</TR>
</TABLE>
</TD></TR>
<TR><TD align=center><B><FONT face='Times' color=#FFFFFF><A href='' onClick='return goBack()'><U>Inapoi</U></A></FONT></B></TD></TR>
</TABLE>
<!– central table –>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>";
?>
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Modalitati de Utilizare a Internetului In Afaceri (ID: 148866)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
