Programmēšana

Java padoms 96: Java klienta kodā izmantojiet HTTPS

Ja esat kādreiz mēģinājis ieviest drošu komunikāciju starp Java klientu un HTTPS (HyperText Transfer Protocol Secure) serveri, jūs, iespējams, atklājāt, ka standarta java.net.URL klase neatbalsta HTTPS protokolu. Šī vienādojuma ieviešana servera pusē ir diezgan vienkārša. Gandrīz jebkurš šodien pieejamais tīmekļa serveris nodrošina datu pieprasīšanas mehānismu, izmantojot HTTPS. Kad esat iestatījis tīmekļa serveri, jebkurš pārlūks var pieprasīt drošu informāciju no jūsu servera, vienkārši norādot HTTPS kā URL protokolu. Ja jums vēl nav iestatīts HTTPS serveris, varat pārbaudīt klienta kodu gandrīz jebkurā HTTPS tīmekļa lapā internetā. Resursu sadaļā ir īss kandidātu saraksts, kurus varat izmantot šim nolūkam.

Tomēr no klienta viedokļa S vienkāršība pazīstamā HTTP beigās ir maldinoša. Pārlūkprogramma faktiski veic ievērojamu darbu aizkulisēs, lai nodrošinātu, ka neviens nav manipulējis ar jūsu pieprasīto informāciju vai uzraudzījis to. Kā izrādās, HTTPS šifrēšanas algoritmu ir patentējis RSA Security (vēl vismaz dažus mēnešus). Šī algoritma lietošanu ir licencējuši pārlūkprogrammu ražotāji, bet Sun Microsystems to nav licencējis, lai iekļautu Java standarta URL klases ieviešana. Rezultātā, ja mēģināt konstruēt a URL objekts ar virkni, kurā kā protokols norādīts HTTPS, a Nepareizi veidotsURLEizņēmums tiks izmests.

Par laimi, lai ņemtu vērā šo ierobežojumu, Java specifikācija nodrošina iespēju izvēlēties alternatīvu straumes apstrādātāju URL klasē. Tomēr ieviešanai nepieciešamā tehnika ir atšķirīga atkarībā no izmantotās virtuālās mašīnas (VM). Microsoft JDK 1.1 saderīgai VM, JView, Microsoft ir licencējis algoritmu un kā daļu no tā nodrošinājis HTTPS straumes apstrādātāju. vīna kaste iepakojums. Savukārt Sun nesen ir izlaidis Java Drošo ligzdu paplašinājumu (JSSE) JDK 1.2 saderīgām VM, kurās Sun ir licencējis un piegādājis arī HTTPS straumes apstrādātāju. Šis raksts parādīs, kā ieviest HTTPS iespējotu straumes apstrādātāju izmantošanu, izmantojot JSSE un Microsoft vīna kaste iepakojums.

JDK 1.2 saderīgas virtuālās mašīnas

Ar JDK 1.2 saderīgu VM izmantošanas tehnika galvenokārt balstās uz Java Secure Sockets Extension (JSSE) 1.0.1. Pirms šī tehnika darbosies, jāinstalē JSSE un jāpievieno attiecīgā klienta VM klases ceļam.

Pēc JSSE instalēšanas jums jāiestata sistēmas rekvizīts un jāpievieno jauns drošības nodrošinātājs Drošība klases objekts. Abas šīs lietas var veikt dažādos veidos, taču šī raksta vajadzībām ir parādīta programmatiskā metode:

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

Pēc divu iepriekšējo metožu izsaukšanas Nepareizi veidotsURLEizņēmums vairs netiks izmests, piezvanot uz šo kodu:

 URL url = jauns URL ("// [jūsu serveris]"); 

Ja izveidojat savienojumu ar standarta SSL portu 443, jums ir iespēja pievienot porta numuru URL virknei. Tomēr, ja jūsu tīmekļa serveris SSL trafikam izmanto nestandarta portu, URL virknei ir jāpievieno porta numurs šādi:

 URL url = jauns URL ("// [jūsu serveris]: 7002"); 

Viens šīs tehnikas brīdinājums attiecas uz URL, kas attiecas uz serveri, kuram ir neparakstīts vai nederīgs SSL sertifikāts. Tādā gadījumā mēģinājums izgūt ievades vai izvades straumi no URL savienojuma objekta radīs SSLEizņēmums ar ziņojumu "neuzticama servera sertikas ķēde". Ja serverim ir derīgs, parakstīts sertifikāts, izņēmumi netiks izmesti.

 URL url = jauns URL ("// [jūsu serveris]"); URLConnection con = URL.openConnection (); // SSLException šeit iemests, ja servera sertifikāts nav derīgs con.getInputStream (); 

Acīmredzams šīs problēmas risinājums ir iegūt parakstītus sertifikātus savam serverim. Tomēr viens no šiem URL var būt arī risinājums: "Java Secure Socket Extension 1.0.2 Changes" (Sun Microsystems) vai Sun Java Developer Connection forums.

Microsoft JView

Daļēji sakarā ar notiekošo strīdu starp Microsoft un Sun par Java licencēšanu lietošanai Windows platformās, Microsoft JView VM pašlaik ir saderīgs tikai ar JDK 1.1. Tāpēc iepriekš aprakstītā tehnika nedarbosies klientiem, kas darbojas JView, jo JSSE nepieciešama vismaz ar 1.2.2 saderīga VM. Pietiekami ērti, tomēr Microsoft nodrošina straumes apstrādātāju, kas iespējots ar HTTPS com.ms.net.wininet iepakojums.

Straumes apstrādātāju var iestatīt JView vidē, izsaucot vienu statisku metodi URL klase:

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

Pēc iepriekšējā metodes zvana veikšanas

Nepareizi veidotsURLEizņēmums

vairs netiks izmests, piezvanot uz šo kodu:

 URL url = jauns URL ("// [jūsu serveris]"); 

Ar šo tehniku ​​ir saistītas divas atrunas. Pirmkārt, saskaņā ar JDK dokumentāciju, setURLStreamHandlerFactory metodi noteiktā VM var izsaukt ne vairāk kā vienu reizi. Turpmākie mēģinājumi izsaukt šo metodi iemetīs Kļūda. Otrkārt, tāpat kā ar 1.2 VM risinājumu, jums jābūt piesardzīgam, izmantojot URL, kas norāda uz serveri ar neparakstītu vai nederīgu SSL sertifikātu. Tāpat kā iepriekšējā gadījumā, problēmas rodas, mēģinot ielādēt ievades vai izvades straumi no URL savienojuma objekta. Tomēr tā vietā, lai iemestu SSLEizņēmums, Microsoft straumes apstrādātājs met standartu IOException.

 URL url = jauns URL ("// [jūsu serveris]"); URLConnection con = url.openConnection (); // IOException šeit iemests, ja servera sertifikāts nav derīgs con.getInputStream (); 

Arī šajā gadījumā acīmredzamais šīs problēmas risinājums ir mēģināt HTTPS sazināties tikai ar serveriem, kuriem ir parakstīts, derīgs sertifikāts. Tomēr JView piedāvā vēl vienu iespēju. Tūlīt pirms ievades vai izvades straumes izgūšanas no URL savienojuma objekta varat piezvanīt setAllowUserInteraction (true) uz savienojuma objekta. Tas JView parādīs ziņojumu, kas brīdina lietotāju, ka servera sertifikāti nav derīgi, taču dod viņam iespēju turpināt rīkoties. Tomēr paturiet prātā, ka šādi ziņojumi var būt piemēroti darbvirsmas lietojumprogrammai, taču dialoglodziņu rādīšana jūsu serverī, izņemot atkļūdošanas mērķus, iespējams, ir nepieņemama.

Piezīme. Varat arī piezvanīt uz setAllowUserInteraction () metodi ar JDK 1.2 saderīgās VM. Tomēr, izmantojot Sun 1,2 VM (ar kuru šis kods tika pārbaudīts), netiek parādīti dialoglodziņi, pat ja šī īpašība ir iestatīta uz true.

 URL url = jauns URL ("// [jūsu serveris]"); URLConnection con = url.openConnection (); // liek VM parādīt dialoglodziņu, savienojot // ar neuzticamiem serveriem con.setAllowUserInteraction (true); con.getInputStream (); 

The com.ms.net.wininet pakete, šķiet, ir instalēta un ievietota sistēmas klases ceļā pēc noklusējuma sistēmās Windows NT 4.0, Windows 2000 un Windows 9x. Turklāt saskaņā ar Microsoft JDK dokumentāciju WinInetStreamHandlerFactory ir "... tas pats apdarinātājs, kas pēc noklusējuma ir instalēts, palaižot sīklietotnes."

Platformas neatkarība

Lai gan abas šīs manis aprakstītās metodes aptver lielāko daļu platformu, kurās var darboties jūsu Java klients, iespējams, jūsu Java klientam būs jādarbojas gan ar JDK 1.1, gan ar JDK 1.2 saderīgām VM. "Vienreiz rakstiet, skrieniet jebkur" atceraties? Kā izrādās, šo divu paņēmienu apvienošana tā, lai atbilstošais apdarinātājs tiktu ielādēts atkarībā no VM, ir diezgan vienkāršs. Šis kods parāda vienu no veidiem, kā rīkoties šādi:

 Virkne strVendor = System.getProperty ("java.vendor"); String strVersion = System.getProperty ("java.version"); // Pieņem sistēmas versijas virkni formā: // [galvenā_uzl.] [Mazākā]. [Izlaidums] (piemēram, 1.2.2.) Double dVersion = new Double (strVersion.substring (0, 3)); // Ja mēs darbojamies MS vidē, izmantojiet MS plūsmas apdarinātāju. ja (-1 <strVendor.indexOf ("Microsoft")) {mēģiniet {Class clsFactory = Class.forName ("com.ms.net.wininet.WininetStreamHandlerFactory"); if (null! = clsFactory) URL.setURLStreamHandlerFactory ((URLStreamHandlerFactory) clsFactory.newInstance ()); } catch (ClassNotFoundException cfe) {mest jaunu izņēmumu ("Nevar ielādēt Microsoft SSL" + "straumes apstrādātāju. Pārbaudiet classpath." + cfe.toString ()); } // Ja straumes apstrādātāja rūpnīca // jau ir veiksmīgi iestatīta // pārliecinieties, vai mūsu karodziņš ir iestatīts, un apēdiet kļūdas nozveju (Error err) {m_bStreamHandlerSet = true;}}} // Ja mēs atrodamies normālā Java vidē, // mēģiniet izmantot JSSE apdarinātāju. // PIEZĪME. JSSE nepieciešama versija 1.2 vai labāka, ja (1.2 <= dVersion.doubleValue ()) {System.setProperty ("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol "); mēģiniet {// ja mums ir pieejams JSSE nodrošinātājs //, un tas vēl nav // iestatīts, pievienojiet to kā jaunu nodrošinājumu drošības klasei. Klase 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) {mest jaunu izņēmumu ("Nevar ielādēt JSSE SSL straumes apstrādātāju." + "Pārbaudīt classpath." + cfe.toString ()); }} 

Kā ar sīklietotnēm?

Uz HTTPS balstītas saziņas veikšana no sīklietotnes šķiet dabiska iepriekš aprakstīto scenāriju paplašināšana. Patiesībā vairumā gadījumu tas ir vēl vieglāk. Netscape Navigator un Internet Explorer 4.0 un jaunākās versijās HTTPS pēc noklusējuma ir iespējots attiecīgajiem VM. Tādēļ, ja vēlaties izveidot HTTPS savienojumu no sīklietotnes koda, izveidojot protokola instanci, vienkārši norādiet HTTPS kā protokolu. URL klase:

 URL url = jauns URL ("// [jūsu serveris]"); 

Ja klienta pārlūkprogrammā darbojas Sun Java 2 spraudnis, tad HTTPS izmantošanai ir papildu ierobežojumi. Pilna diskusija par HTTPS izmantošanu ar Java 2 spraudni ir atrodama Sun vietnē (skatīt resursus).

Secinājums

HTTPS protokola izmantošana starp lietojumprogrammām var būt ātrs un efektīvs veids, kā iegūt saprātīgu komunikācijas drošības līmeni. Diemžēl iemesli, kāpēc tas netiek atbalstīts kā daļa no Java standarta specifikācijas, šķiet vairāk likumīgi nekā tehniski. Tomēr līdz ar JSSE parādīšanos un Microsoft izmantošanu com.ms.net.winint pakete, droša komunikācija ir iespējama no lielākās daļas platformu, izmantojot tikai dažas koda rindas.

Matt Towers, pats aprakstīts eBozo, nesen atstāja savu attīstības pozīciju Visio. Kopš tā laika viņš ir pievienojies interneta startēšanas vietnei PredictPoint.com Sietlā, Vašingtonā, kur strādā kā Java pilnas slodzes izstrādātājs.

Uzziniet vairāk par šo tēmu

  • Šī raksta avota koda ZIP failā ir iepriekš parādīts no platformas neatkarīgs kods, kas ieviests klasē ar nosaukumu HttpsMessage. HttpsMessage ir paredzēts kā apakšklase HttpMessage klases raksta Džeisons Hanters, autors Java servlet programmēšana (O'Reilly & Associates). Meklēt HttpsMessage gaidāmajā viņa grāmatas otrajā izdevumā. Ja vēlaties izmantot šo klasi kā paredzēts, jums būs jālejupielādē un jāinstalē com.oreilly.servlets iepakojums. The com.oreilly.servlets pakotni un atbilstošo pirmkodu var atrast Hunter's Website

    //www.servlets.com

  • Varat arī lejupielādēt avota ZIP failu

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

  • Šeit ir dažas labas tīmekļa vietnes, lai pārbaudītu HTTPS komunikāciju:
  • //www.verisign.com/
  • //happiness.dhs.org/
  • //www.microsoft.com
  • //www.sun.com
  • //www.ftc.gov
  • Plašāka informācija par JSSE, kā arī lejupielādējamie biti un instalēšanas instrukcijas ir atrodama Sun vietnē

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

  • Dažu JSSE pakalpojumu izmantošanas aprakstu, ieskaitot iepriekš aprakstīto tehniku, var atrast Džonatana Knudsena vietnē “Secure Networking in Java” O'Reilly vietnē.

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

  • Plašāka informācija par WininetStreamHandlerFactory klase ir atrodama Microsoft JSDK dokumentācijā

    //www.microsoft.com/java/sdk/. Turklāt Microsoft zināšanu bāze arī publicē "PRBAllow URL class to access HTTPS in Applications"

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

  • Lai iegūtu papildinformāciju par HTTPS izmantošanu ar Java 2 spraudni, skatiet Sun vietnes sadaļu "Kā HTTPS darbojas Java spraudnī".

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

Šo stāstu “Java padoms 96: Izmantojiet HTTPS savā Java klienta kodā” sākotnēji publicēja JavaWorld.

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