Programavimas

„Java“ patarimas 96: „Java“ kliento kode naudokite HTTPS

Jei kada nors bandėte įdiegti saugų ryšį tarp „Java“ kliento ir HTTPS („HyperText Transfer Protocol Secure“) serverio, tikriausiai pastebėjote, kad standartas java.net.URL klasė nepalaiko HTTPS protokolo. Serverio pusėje ta lygtis yra gana paprasta. Beveik bet kuris šiandien prieinamas interneto serveris suteikia duomenų užklausos mechanizmą naudojant HTTPS. Kai sukonfigūruosite savo interneto serverį, bet kuri naršyklė gali paprašyti saugios informacijos iš jūsų serverio, tiesiog nurodydama HTTPS kaip URL protokolą. Jei dar nesate sukonfigūravę HTTPS serverio, galite išbandyti savo kliento kodą naudodami beveik bet kurį HTTPS tinklalapį internete. Išteklių skyriuje yra trumpas sąrašas kandidatų, kuriuos galite naudoti šiam tikslui.

Tačiau žvelgiant iš kliento perspektyvos, S paprastumas žinomo HTTP pabaigoje klaidina. Naršyklė iš tikrųjų atlieka nemažai darbų užkulisiuose, siekdama užtikrinti, kad niekas nesužlugdytų ar neprižiūrėtų jūsų prašomos informacijos. Kaip paaiškėjo, HTTPS šifravimo algoritmą užpatentuoja „RSA Security“ (dar bent keliems mėnesiams). Šio algoritmo naudojimą licencijavo naršyklės gamintojai, tačiau „Sun Microsystems“ neturėjo licencijos įtraukti jį į standartinę „Java“ URL klasės įgyvendinimas. Dėl to, jei bandysite sukonstruoti a URL objektas su eilute, nurodančia HTTPS kaip protokolą, a Netinkamai suformuotaURLE išimtis bus išmestas.

Laimei, norint patenkinti šį suvaržymą, „Java“ specifikacijoje numatyta galimybė pasirinkti alternatyvų srauto URL klasė. Tačiau įdiegimui reikalinga technika yra skirtinga, atsižvelgiant į naudojamą virtualią mašiną (VM). „Microsoft“ JDK 1.1 suderinamam VM, „JView“, „Microsoft“ licencijavo algoritmą ir pateikė savo HTTPS srauto tvarkytuvą kaip dalį savo Wininet pakuotė. Kita vertus, „Sun“ neseniai išleido „Java Secure Sockets Extension“ (JSSE), skirtą JDK 1.2 suderinamoms virtualioms mašinoms, kurioje „Sun“ taip pat licencijavo ir pateikė HTTPS srauto apdorojimo priemonę. Šiame straipsnyje bus parodyta, kaip įdiegti HTTPS įgalintą srauto tvarkytuvą naudojant JSSE ir „Microsoft“ Wininet pakuotė.

JDK 1.2 suderinamos virtualios mašinos

JDK 1.2 suderinamų VM naudojimo technika pirmiausia remiasi „Java Secure Sockets Extension“ (JSSE) 1.0.1. Kad ši technika veiktų, turite įdiegti JSSE ir pridėti ją prie atitinkamo kliento VM klasės kelio.

Įdiegę JSSE, turite nustatyti sistemos ypatybę ir pridėti naują saugos teikėją prie Saugumas klasės objektas. Šiuos dalykus galima atlikti įvairiais būdais, tačiau šio straipsnio tikslais parodomas programinis metodas:

 „System.setProperty“ („java.protocol.handler.pkgs“, „com.sun.net.ssl.internal.www.protocol“); Security.addProvider (naujas com.sun.net.ssl.internal.ssl.Provider ()); 

Atlikus du ankstesnius metodo skambučius, Netinkamai suformuotaURLE išimtis nebebus mesti paskambinus šiuo kodu:

 URL url = naujas URL ("// [jūsų serveris]"); 

Jei jungiatės prie standartinio SSL prievado, 443, galite pridėti prievado numerį prie URL eilutės. Tačiau, jei jūsų žiniatinklio serveris naudoja nestandartinį prievadą SSL srautui, prie savo URL eilutės turėsite pridėti prievado numerį taip:

 URL url = naujas URL ("// [jūsų serveris]: 7002"); 

Vienas šios technikos įspėjimas yra susijęs su URL, nurodančiu serverį, kuris turi nepasirašytą arba neteisingą SSL sertifikatą. Tokiu atveju bandymas atgauti įvesties ar išvesties srautą iš URL ryšio objekto sukels SSLE išimtis su pranešimu „nepatikima serverio sertifikavimo grandinė“. Jei serveris turi galiojantį, pasirašytą sertifikatą, nebus išimties.

 URL url = naujas URL ("// [jūsų serveris]"); URLConnection con = URL.openConnection (); // SSLException čia metama, jei serverio sertifikatas neteisingas con.getInputStream (); 

Akivaizdus šios problemos sprendimas yra gauti pasirašytus serverio sertifikatus. Tačiau vienas iš šių URL taip pat gali pateikti sprendimą: „Java Secure Socket Extension 1.0.2 Changes“ („Sun Microsystems“) arba „Sun“ „Java Developer Connection“ forumas.

„Microsoft JView“

Iš dalies dėl besitęsiančio „Microsoft“ ir „Sun“ ginčo dėl „Java“ licencijų naudoti „Windows“ platformose, „Microsoft JView VM“ šiuo metu atitinka tik JDK 1.1. Todėl aukščiau aprašyta technika neveiks klientams, veikiantiems „JView“, nes JSSE reikalinga bent 1.2.2 suderinama VM. Vis dėlto pakankamai patogu, kaip „Windows“ dalį „Microsoft“ teikia HTTPS įgalintą srauto tvarkytuvą com.ms.net.wininet pakuotė.

Srauto tvarkytuvą galite nustatyti „JView“ aplinkoje, iškvietę vieną statinį metodą URL klasė:

 URL.setURLStreamHandlerFactory (naujas com.ms.net.wininet.WininetStreamHandlerFactory ()); 

Atlikus ankstesnį metodo skambutį,

Netinkamai suformuotaURLE išimtis

nebebus mesti paskambinus šiuo kodu:

 URL url = naujas URL ("// [jūsų serveris]"); 

Yra du įspėjimai, susiję su ta technika. Pirma, pagal JDK dokumentus, setURLStreamHandlerFactory metodas gali būti iškviestas ne daugiau kaip vieną kartą tam tikroje VM. Vėliau bandant paskambinti tam metodui bus Klaida. Antra, kaip ir 1.2 VM sprendimo atveju, turite būti atsargūs, kai naudojate URL, nurodantį serverį su nepasirašytu ar netinkamu SSL sertifikatu. Kaip ir ankstesniu atveju, problemų kyla, kai bandoma gauti įvesties arba išvesties srautą iš URL ryšio objekto. Tačiau užuot metęs SSLE išimtis, „Microsoft“ srauto tvarkytuvas išmeta standartą IOException.

 URL url = naujas URL ("// [jūsų serveris]"); URLConnection con = url.openConnection (); // IOException čia metamas, jei serverio sertifikatas neteisingas con.getInputStream (); 

Vėlgi, akivaizdus šios problemos sprendimas yra bandyti HTTPS ryšį tik su serveriais, turinčiais pasirašytą galiojantį sertifikatą. Tačiau „JView“ siūlo dar vieną variantą. Prieš iškeldami įvesties ar išvesties srautą iš URL ryšio objekto, galite paskambinti setAllowUserInteraction (true) ryšio objekte. Tai sukels „JView“ pranešimą, įspėjantį vartotoją, kad serverio sertifikatai yra neteisingi, tačiau suteikiant jam galimybę vis tiek tęsti. Tačiau nepamirškite, kad tokie pranešimai gali būti pagrįsti darbalaukio programai, tačiau turbūt nepriimtina dialogo langų rodymas serveryje ne tik derinimo tikslais.

Pastaba: Taip pat galite paskambinti setAllowUserInteraction () metodas JDK 1.2 suderinamose VM. Tačiau naudojant „Sun“ 1.2 VM (su kuria buvo išbandytas šis kodas) dialogo langai nerodomi, net kai ši ypatybė nustatyta kaip „true“.

 URL url = naujas URL ("// [jūsų serveris]"); URLConnection con = url.openConnection (); // priverčia VM rodyti dialogo langą jungiantis // prie nepatikimų serverių con.setAllowUserInteraction (true); con.getInputStream (); 

com.ms.net.wininet „Windows NT 4.0“, „Windows 2000“ ir „Windows 9x“ sistemose paketas pagal numatytuosius nustatymus yra įdiegtas ir įdėtas į sistemos klasės kelią. Be to, pagal „Microsoft JDK“ dokumentaciją, „WinInetStreamHandlerFactory“ yra "... tas pats tvarkytuvas, kuris yra įdiegtas pagal numatytuosius nustatymus paleidžiant programas.

Platformos nepriklausomybė

Nors abu šie aprašyti metodai apima daugumą platformų, kuriose gali veikti jūsų „Java“ klientas, „Java“ klientui gali tekti paleisti tiek JDK 1.1, tiek JDK 1.2 suderinamas VM. „Rašyk vieną kartą, bėk bet kur“, pameni? Kaip paaiškėja, derinti šias dvi technikas, kad atitinkamas tvarkytojas būtų įkeltas priklausomai nuo VM, yra gana paprasta. Šis kodas rodo vieną iš būdų tai padaryti:

 Eilutė strVendor = System.getProperty ("java.vendor"); String strVersion = System.getProperty ("java.version"); // Prisiima tokios formos sistemos eilutę: // [didžiausia]. [Mažesnė]. [Išleidimas] (pvz., 1.2.2) Dviguba dVersion = nauja Dviguba (strVersion.substring (0, 3)); // Jei vykdome MS aplinkoje, naudokite MS srauto tvarkytuvą. if (-1 <strVendor.indexOf ("Microsoft")) {{pabandykite {Class clsFactory = Class.forName ("com.ms.net.wininet.WininetStreamHandlerFactory"); if (null! = clsFactory) URL.setURLStreamHandlerFactory (((URLStreamHandlerFactory) clsFactory.newInstance ()); } catch (ClassNotFoundException cfe) {thrown new Exception ("Nepavyko įkelti" Microsoft SSL "+" srauto tvarkytuvo. Patikrinkite classpath. "+ cfe.toString ()); } // Jei srauto apdorojimo gamykla // jau sėkmingai nustatyta //, įsitikinkite, kad nustatyta mūsų vėliava, ir suvalgykite klaidos gavimą (klaida klaida) {m_bStreamHandlerSet = true;}}} // Jei esame įprastoje „Java“ aplinkoje, // pabandykite naudoti JSSE doroklę. // PASTABA: JSSE reikalinga 1,2 arba naujesnė versija, jei (1.2 <= dVersion.doubleValue ()) {System.setProperty ("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol "); pabandykite {// jei turime JSSE teikėją, // ir jis dar nebuvo nustatytas //, pridėkite jį kaip naują tiekimą į saugos klasę. Class clsFactory = Class.forName ("com.sun.net.ssl.internal.ssl.Provider"); if ((null! = clsFactory) && (null == Security.getProvider ("SunJSSE")))) Security.addProvider ((Provider) clsFactory.newInstance ()); } catch (ClassNotFoundException cfe) {thrown new Exception ("Nepavyko įkelti JSSE SSL srauto tvarkytuvo." + "Patikrinti classpath." + cfe.toString ()); }} 

O kaip su programėlėmis?

HTTPS pagrįsto bendravimo vykdymas programėlėje atrodo kaip natūralus pirmiau aprašytų scenarijų pratęsimas. Iš tikrųjų daugeliu atvejų tai dar lengviau. 4.0 ir vėlesnėse „Netscape Navigator“ ir „Internet Explorer“ versijose HTTPS pagal numatytuosius nustatymus įgalinta jų atitinkamiems VM. Todėl, jei norite sukurti HTTPS ryšį iš savo programėlės kodo, kurdami programos egzempliorių tiesiog nurodykite HTTPS kaip savo protokolą. URL klasė:

 URL url = naujas URL ("// [jūsų serveris]"); 

Jei kliento naršyklėje veikia „Sun“ „Java 2“ papildinys, yra papildomų apribojimų, kaip galite naudoti HTTPS. Išsamią diskusiją apie HTTPS naudojimą su „Java 2“ papildiniu galima rasti „Sun“ svetainėje (žr. Ištekliai).

Išvada

HTTPS protokolo naudojimas tarp programų gali būti greitas ir efektyvus būdas pasiekti pagrįstą jūsų ryšio lygį. Deja, priežastys, kodėl ji nepalaikoma kaip standartinės „Java“ specifikacijos dalis, atrodo labiau teisėtos nei techninės. Tačiau atsiradus JSSE ir naudojant „Microsoft“ com.ms.net.winint paketas, saugus ryšys galimas iš daugelio platformų, naudojant tik kelias kodo eilutes.

Mattas Towersas, save apibūdinantis „eBozo“, neseniai paliko „Visio“ plėtros pozicijas. Nuo tada jis prisijungė prie interneto startuolio „PredictPoint.com“ Sietle, Wash. Čia jis dirba visą laiką dirbantis „Java“ kūrėju.

Sužinokite daugiau apie šią temą

  • Šio straipsnio šaltinio kodo ZIP faile yra aukščiau pateiktas nuo platformos nepriklausomas kodas, įdiegtas klasėje, vadinamoje „HttpsMessage“. „HttpsMessage“ yra skirtas kaip poklasis HttpMessage klasę parašė Jasonas Hunteris, knygos autorius „Java Servlet“ programavimas (O'Reilly & Associates). Ieškoti „HttpsMessage“ būsimame antrame jo knygos leidime. Jei norite naudoti tą klasę, kaip numatyta, turėsite atsisiųsti ir įdiegti com.oreilly.servletai pakuotė. com.oreilly.servletai paketą ir atitinkamą šaltinio kodą galite rasti „Hunter's Website“

    //www.servlets.com

  • Taip pat galite atsisiųsti šaltinio ZIP failą

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

  • Čia yra keli geri tinklalapiai, skirti išbandyti HTTPS ryšį:
  • //www.verisign.com/
  • //happiness.dhs.org/
  • //www.microsoft.com
  • //www.sun.com
  • //www.ftc.gov
  • Daugiau informacijos apie JSSE, atsisiųstų bitų ir diegimo instrukcijas galite rasti „Sun“ svetainėje

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

  • Aprašymą, kaip naudotis kai kuriomis JSSE paslaugomis, įskaitant aukščiau aprašytą techniką, galite rasti Jonathano Knudseno puslapyje „Saugus tinklų kūrimas Java“ O'Reilly svetainėje.

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

  • Daugiau informacijos apie „WininetStreamHandlerFactory“ klasę galite rasti „Microsoft JSDK“ dokumentuose

    //www.microsoft.com/java/sdk/. Be to, „Microsoft“ žinių bazėje taip pat skelbiama „PRBA, leidžianti URL klasei pasiekti HTTPS programose“.

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

  • Norėdami gauti daugiau informacijos apie HTTPS naudojimą su „Java 2“ papildiniu, „Sun“ svetainėje skaitykite „Kaip HTTPS veikia„ Java “papildinyje“.

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

Šią istoriją „Java Patarimas 96: Naudokite HTTPS savo„ Java “kliento kode“ iš pradžių paskelbė „JavaWorld“.