Programovanie

Tip Java 96: Vo svojom klientskom kóde Java použite protokol HTTPS

Ak ste sa niekedy pokúšali implementovať bezpečnú komunikáciu medzi klientom Java a serverom HTTPS (HyperText Transfer Protocol Secure), pravdepodobne ste zistili, že štandardný java.net.URL trieda nepodporuje protokol HTTPS. Implementácia tejto rovnice na strane servera je dosť jednoduchá. Takmer každý dnes dostupný webový server poskytuje mechanizmus na vyžiadanie údajov pomocou protokolu HTTPS. Po nastavení webového servera môže ktorýkoľvek prehľadávač požadovať od servera zabezpečené informácie jednoduchým zadaním protokolu HTTPS ako protokolu pre adresu URL. Ak ešte nemáte nastavený server HTTPS, môžete svoj kód klienta otestovať na takmer ľubovoľnej webovej stránke HTTPS na internete. Sekcia Zdroje obsahuje krátky zoznam kandidátov, ktorých môžete na tento účel použiť.

Z pohľadu klienta však klame jednoduchosť S na konci známeho protokolu HTTP. Prehliadač v skutočnosti vykonáva značné množstvo zákulisných prác, aby zabezpečil, že nikto s vami požadovanými informáciami nemanipuloval ani ich nesledoval. Ako sa ukázalo, algoritmus na šifrovanie HTTPS je patentovaný spoločnosťou RSA Security (najmenej niekoľko ďalších mesiacov). Používanie tohto algoritmu bolo licencované výrobcami prehľadávačov, ale nebolo licencované spoločnosťou Sun Microsystems, ktorá má byť zahrnutá do štandardnej sady Java. URL triedna implementácia. Výsledkom je, že ak sa pokúsite postaviť a URL objekt s reťazcom špecifikujúcim HTTPS ako protokol, a MalformedURLE výnimka bude vyhodený.

Našťastie, aby sa toto obmedzenie prispôsobilo, špecifikácia Java poskytuje možnosť vybrať obslužný program alternatívneho toku pre server URL trieda. Technika vyžadovaná na implementáciu je však odlišná v závislosti od použitého virtuálneho počítača (VM). Pre virtuálny počítač kompatibilný s JDK 1.1 spoločnosti Microsoft, JView, spoločnosť Microsoft získala licenciu na tento algoritmus a poskytla obslužný program toku HTTPS ako súčasť svojej wininet balíček. Na druhej strane spoločnosť Sun nedávno vydala rozšírenie Java Secure Sockets Extension (JSSE) pre virtuálne počítače kompatibilné s JDK 1.2, na ktoré spoločnosť Sun tiež poskytla licenciu a poskytla obslužný program toku HTTPS. Tento článok predvedie, ako implementovať použitie obslužného programu toku povoleného HTTPS pomocou JSSE a Microsoft wininet balíček.

Virtuálne stroje kompatibilné s JDK 1.2

Technika používania virtuálnych počítačov kompatibilných s JDK 1.2 sa primárne spolieha na rozšírenie Java Secure Sockets Extension (JSSE) 1.0.1. Predtým, ako bude táto technika fungovať, musíte nainštalovať JSSE a pridať ju k ceste triedy daného klientskeho VM.

Po nainštalovaní JSSE musíte nastaviť systémovú vlastnosť a pridať nového poskytovateľa zabezpečenia do Bezpečnosť objekt triedy. Existuje mnoho spôsobov, ako urobiť obe tieto veci, ale na účely tohto článku je uvedená programová metóda:

 System.setProperty ("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol"); Security.addProvider (nový com.sun.net.ssl.internal.ssl.Provider ()); 

Po uskutočnení predchádzajúcich dvoch volaní metódou sa zobrazí MalformedURLE výnimka už nebude vyhodený volaním nasledujúceho kódu:

 URL url = nová URL ("// [váš server]"); 

Ak sa pripájate k štandardnému portu SSL 443, máte možnosť pridať číslo portu k reťazcu URL. Ak však váš webový server používa na prenos SSL neštandardný port, budete musieť k svojmu reťazcu adresy URL pripojiť číslo portu takto:

 URL url = nová URL ("// [váš server]: 7002"); 

Jedno upozornenie na túto techniku ​​sa týka adresy URL, ktorá odkazuje na server, ktorý má nepodpísaný alebo neplatný certifikát SSL. V takom prípade bude pokus o načítanie vstupného alebo výstupného toku z objektu pripojenia adresy URL vyvolaný znakom SSLException so správou „nedôveryhodný reťazec certifikátu servera“. Ak má server platný podpísaný certifikát, nebude vyvolaná žiadna výnimka.

 URL url = nová URL ("// [váš server]"); URLConnection con = URL.openConnection (); // Sem sa hodí SSLException, ak je certifikát servera neplatný con.getInputStream (); 

Zjavným riešením tohto problému je získanie podpísaných certifikátov pre váš server. Riešenie však môže poskytnúť aj jedna z nasledujúcich adries URL: „Java Secure Socket Extension 1.0.2 Changes“ (Sun Microsystems) alebo fórum Java Developer Connection spoločnosti Sun.

Microsoft JView

Čiastočne kvôli prebiehajúcemu sporu medzi spoločnosťami Microsoft a Sun o licencovanie Java na použitie na platformách Windows je Microsoft JView VM v súčasnosti kompatibilný iba s JDK 1.1. Preto vyššie popísaná technika nebude fungovať pre klientov bežiacich v JView, pretože JSSE vyžaduje minimálne VM kompatibilný s 1.2.2. Pohodlne však Microsoft poskytuje ako súčasť prehľadávača streamov podporujúci protokol HTTPS com.ms.net.wininet balíček.

Obslužný program toku môžete nastaviť v prostredí JView volaním jednej statickej metódy na serveri URL trieda:

 URL.setURLStreamHandlerFactory (nový com.ms.net.wininet.WininetStreamHandlerFactory ()); 

Po uskutočnení predchádzajúceho volania metódy,

MalformedURLE výnimka

už nebude vyhodený volaním nasledujúceho kódu:

 URL URL = nová URL ("// [váš server]"); 

S touto technikou sú spojené dve výhrady. Najskôr podľa dokumentácie JDK setURLStreamHandlerFactory metóda môže byť volaná nanajvýš raz v danom VM. Následné pokusy o volanie tejto metódy vyvolajú znak Chyba. Po druhé, ako je to v prípade riešenia 1,2 VM, pri používaní adresy URL, ktorá odkazuje na server s nepodpísaným alebo neplatným certifikátom SSL, musíte byť opatrní. Rovnako ako v predchádzajúcom prípade, aj pri pokuse o načítanie vstupného alebo výstupného toku z objektu pripojenia adresy URL sa vyskytnú problémy. Avšak namiesto toho, aby hodil SSLException, obslužný program toku Microsoft hodí štandard Výnimka IO.

 URL url = nová URL ("// [váš server]"); URLConnection con = url.openConnection (); // IOException vrhnutá sem, ak je certifikát servera neplatný con.getInputStream (); 

Zrejmým riešením tohto problému je opäť pokus o komunikáciu HTTPS iba so servermi, ktoré majú podpísaný a platný certifikát. JView však ponúka ešte jednu možnosť. Bezprostredne pred načítaním vstupného alebo výstupného toku z objektu pripojenia adresy URL môžete zavolať setAllowUserInteraction (true) na objekte spojenia. To spôsobí, že program JView zobrazí správu s upozornením na používateľa, že certifikáty servera sú neplatné, ale bude mať napriek tomu možnosť pokračovať. Nezabúdajte však, že takéto správy môžu byť vhodné pre počítačovú aplikáciu, ale zobrazovanie dialógových okien na serveri na iné účely ako na ladenie je pravdepodobne neprijateľné.

Poznámka: Môžete tiež zavolať na setAllowUserInteraction () metóda vo virtuálnych počítačoch kompatibilných s JDK 1.2. Pri použití softvéru Sun 1.2 VM (s ktorým bol tento kód testovaný) sa však nezobrazia žiadne dialógové okná, aj keď je táto vlastnosť nastavená na hodnotu true.

 URL URL = nová URL ("// [váš server]"); URLConnection con = url.openConnection (); // spôsobí, že VM zobrazí dialógové okno pri pripájaní // k nedôveryhodným serverom con.setAllowUserInteraction (true); con.getInputStream (); 

The com.ms.net.wininet Zdá sa, že balík je nainštalovaný a umiestnený v systémovej triede cesty štandardne v systémoch Windows NT 4.0, Windows 2000 a Windows 9x. Podľa dokumentácie Microsoft JDK tiež WinInetStreamHandlerFactory je „... rovnaký obslužný program, ktorý je predvolene nainštalovaný pri spustení appletov.“

Nezávislosť platformy

Aj keď obe tieto techniky, ktoré som popísal, pokrývajú väčšinu platforiem, na ktorých môže váš klient Java bežať, váš klient Java bude možno musieť bežať na virtuálnych počítačoch kompatibilných s JDK 1.1 a JDK 1.2. „Napíš raz, utekaj kamkoľvek,“ pamätáte? Ukázalo sa, že kombinácia týchto dvoch techník tak, aby sa príslušný obslužný program načítal v závislosti od VM, bola celkom jednoduchá. Nasledujúci kód ukazuje jeden zo spôsobov, ako to dosiahnuť:

 Reťazec strVendor = System.getProperty ("java.vendor"); Reťazec strVersion = System.getProperty ("java.version"); // Predpokladá reťazec verzie systému v tvare: //[major].[minor].[vydanie] (napr. 1.2.2) Double dVersion = nový Double (strVersion.substring (0, 3)); // Ak pracujeme v prostredí MS, použite obslužný program toku MS. if (-1 <strVendor.indexOf ("Microsoft")) {try {Class clsFactory = Class.forName ("com.ms.net.wininet.WininetStreamHandlerFactory"); if (null! = clsFactory) URL.setURLStreamHandlerFactory ((URLStreamHandlerFactory) clsFactory.newInstance ()); } catch (ClassNotFoundException cfe) {throw new Exception ("Unable to load the Microsoft SSL" + "stream handler. Check classpath." + cfe.toString ()); } // Ak je továreň na obsluhu streamov // už úspešne nastavená // uistite sa, že je nastavený náš príznak, a zjedzte chybové hlásenie (Error err) {m_bStreamHandlerSet = true;}} // Ak sa nachádzame v normálnom prostredí Java, // skús použiť obslužný program JSSE. // POZNÁMKA: JSSE vyžaduje verziu 1.2 alebo lepšiu, ak (1.2 <= dVersion.doubleValue ()) {System.setProperty ("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol "); skúste {// ak máme k dispozícii poskytovateľa JSSE, // a ten ešte nebol // nastavený, pridajte ho ako nové zabezpečenie do triedy Zabezpečenie. Trieda clsFactory = Class.forName ("com.sun.net.ssl.internal.ssl.Provider"); if ((null! = clsFactory) && (null == Security.getProvider ("SunJSSE"))) Security.addProvider ((poskytovateľ) clsFactory.newInstance ()); } catch (ClassNotFoundException cfe) {throw new Exception ("Nemožno načítať obslužný program toku streamov JSSE SSL." + "Skontrolovať classpath." + cfe.toString ()); }} 

A čo applety?

Vykonávanie komunikácie založenej na HTTPS z appletu sa javí ako prirodzené rozšírenie vyššie popísaných scenárov. V skutočnosti je to vo väčšine prípadov ešte jednoduchšie. V 4.0 a novších verziách Netscape Navigator a Internet Explorer je HTTPS predvolene povolený pre príslušné VM. Preto, ak chcete vytvoriť spojenie HTTPS z kódu vášho appletu, pri vytváraní inštancie servera jednoducho zadajte HTTPS ako svoj protokol. URL trieda:

 URL url = nová URL ("// [váš server]"); 

Ak je v prehliadači klienta spustený doplnok Sun 2 Java, existujú ďalšie obmedzenia týkajúce sa spôsobu použitia protokolu HTTPS. Celú diskusiu o používaní protokolu HTTPS s doplnkom Java 2 nájdete na webových stránkach spoločnosti Sun (pozri Zdroje).

Záver

Používanie protokolu HTTPS medzi aplikáciami môže byť rýchly a efektívny spôsob, ako dosiahnuť primeranú úroveň zabezpečenia vašej komunikácie. Dôvody, prečo nie je podporovaná ako súčasť štandardnej špecifikácie Java, sa, žiaľ, javia ako viac legálne ako technické. Avšak s príchodom JSSE a využívaním Microsoftu com.ms.net.winint balík, bezpečná komunikácia je možná z väčšiny platforiem iba s niekoľkými riadkami kódu.

Matt Towers, ktorý sám seba označuje ako eBozo, nedávno opustil svoju vývojovú pozíciu v spoločnosti Visio. Odvtedy nastúpil do internetového startupu PredictPoint.com v Seattli v štáte Washington, kde pracuje ako vývojár Java na plný úväzok.

Získajte viac informácií o tejto téme

  • Súbor zip zdrojového kódu pre tento článok obsahuje vyššie uvedený kód nezávislý na platforme implementovaný v triede s názvom HttpsMessage. HttpsMessage je určená ako podtrieda k HttpMessage triedy, ktorú napísal Jason Hunter, autor knihy Programovanie servletu Java (O'Reilly & Associates). Hľadať HttpsMessage v nadchádzajúcom druhom vydaní jeho knihy. Ak chcete túto triedu používať podľa určenia, budete si musieť stiahnuť a nainštalovať com.oreilly.servlets balíček. The com.oreilly.servlets balík a zodpovedajúci zdrojový kód nájdete na webovej stránke Hunter

    //www.servlets.com

  • Môžete si tiež stiahnuť zdrojový súbor zip

    //images.techhive.com/downloads/idge/imported/article/jvw/2000/06/httpsmessage.zip

  • Tu je niekoľko dobrých webových stránok na testovanie komunikácie HTTPS:
  • //www.verisign.com/
  • //happiness.dhs.org/
  • //www.microsoft.com
  • //www.sun.com
  • //www.ftc.gov
  • Viac informácií o JSSE, ako aj bitov na stiahnutie a pokynov na inštaláciu nájdete na webových stránkach spoločnosti Sun

    //java.sun.com/products/jsse/.

  • Popis toho, ako používať niektoré služby JSSE, vrátane vyššie popísanej techniky, nájdete v dokumente „Secure Networking in Java“, ktorý vypracoval Jonathan Knudsen na webovej stránke O'Reilly.

    //java.oreilly.com/bite-size/java_1099.html

  • Viac informácií na WininetStreamHandlerFactory triedy nájdete v dokumentácii k Microsoft JSDK

    //www.microsoft.com/java/sdk/. Microsoft Knowledge Base okrem toho publikuje „PRBAPovolenie triedy URL prístupu k HTTPS v aplikáciách“

    //support.microsoft.com/support/kb/articles/Q191/1/20.ASP

  • Viac informácií o používaní HTTPS s doplnkom Java 2 nájdete v časti „Ako HTTPS funguje v doplnku Java“ na webovej stránke spoločnosti Sun.

    //java.sun.com/products/plugin/1.2/docs/https.html

Tento príbeh, „Java Tip 96: Použite HTTPS v kóde klienta Java“, bol pôvodne publikovaný spoločnosťou JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found