Ohjelmointi

Java-vinkki 96: Käytä HTTPS: ää Java-asiakaskoodissasi

Jos olet joskus yrittänyt luoda suojatun tiedonsiirron Java-asiakkaan ja HTTPS (HyperText Transfer Protocol Secure) -palvelimen välillä, olet todennäköisesti huomannut, että standardi java.net.URL luokka ei tue HTTPS-protokollaa. Tämän yhtälön palvelinpuolen toteutus on melko yksinkertaista. Lähes mikä tahansa nykyisin käytettävissä oleva Web-palvelin tarjoaa mekanismin tietojen pyytämiseen HTTPS: n avulla. Kun olet määrittänyt Web-palvelimesi, mikä tahansa selain voi pyytää suojattuja tietoja palvelimeltasi yksinkertaisesti määrittämällä HTTPS URL-osoitteen protokollaksi. Jos sinulla ei vielä ole määritetty HTTPS-palvelinta, voit testata asiakaskoodisi melkein millä tahansa Internetin HTTPS-verkkosivulla. Resurssit-osiossa on lyhyt luettelo ehdokkaista, joita voit käyttää tähän tarkoitukseen.

Asiakkaan näkökulmasta S: n yksinkertaisuus tutun HTTP: n lopussa johtaa kuitenkin harhaan. Selain tekee todella paljon kulissien takana työtä varmistaakseen, ettei kukaan ole muuttanut tai valvonut pyytämiäsi tietoja. Kuten käy ilmi, RSA Security on patentoinut algoritmin HTTPS-salauksen tekemiseksi (ainakin muutaman kuukauden ajan). Selaimen valmistajat ovat lisensoineet kyseisen algoritmin käytön, mutta Sun Microsystems ei ole lisensoinut sitä sisällytettäväksi tavalliseen Java-sovellukseen URL luokan toteutus. Tämän seurauksena, jos yrität rakentaa a URL objekti, jonka merkkijono määrittää HTTPS: n protokollaksi, a EpämuodostunutURLE-poikkeus heitetään.

Onneksi tämän rajoituksen huomioon ottamiseksi Java-spesifikaatio antaa mahdollisuuden valita vaihtoehtoinen virran käsittelijä URL luokassa. Sen toteuttamiseen vaadittava tekniikka on kuitenkin erilainen riippuen käyttämästäsi virtuaalikoneesta (VM). Microsoftin JDK 1.1 -yhteensopivalle virtuaalikoneelle, JView, Microsoft on lisensoinut algoritmin ja toimittanut HTTPS-virtankäsittelijän osana sen viininetti paketti. Toisaalta Sun on hiljattain julkaissut Java Secure Sockets Extension (JSSE) JDK 1.2 -yhteensopiville virtuaalikoneille, jossa Sun on myös lisensoinut ja toimittanut HTTPS-virtankäsittelijän. Tässä artikkelissa kerrotaan, miten HTTPS-yhteensopivan suoratoistokäsittelijän käyttö voidaan toteuttaa JSSE: n ja Microsoftin avulla viininetti paketti.

JDK 1.2 -yhteensopivat virtuaalikoneet

JDK 1.2 -yhteensopivien virtuaalikoneiden käyttötekniikka perustuu ensisijaisesti Java Secure Sockets Extension (JSSE) 1.0.1 -käyttöjärjestelmään. Ennen kuin tekniikka toimii, sinun on asennettava JSSE ja lisättävä se kyseisen asiakkaan virtuaalikoneen luokkaan.

Kun olet asentanut JSSE: n, sinun on määritettävä järjestelmäominaisuus ja lisättävä uusi suojaustoimittaja Turvallisuus luokan esine. Molempia asioita voidaan tehdä monin eri tavoin, mutta tässä artikkelissa näytetään ohjelmallinen menetelmä:

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

Kun olet soittanut kaksi edellistä menetelmäpuhelua, EpämuodostunutURLE-poikkeus ei enää heitetä soittamalla seuraavaan koodiin:

 URL url = uusi URL ("// [palvelimesi]"); 

Jos muodostat yhteyden tavalliseen SSL-porttiin 443, sinulla on mahdollisuus liittää portin numero URL-merkkijonoon. Jos Web-palvelimesi käyttää SSL-liikennettä varten standardista poikkeavaa porttia, sinun on kuitenkin lisättävä porttinumero URL-merkkijonoosi seuraavasti:

 URL url = uusi URL ("// [palvelimesi]: 7002"); 

Yksi tekniikan varoitus koskee URL-osoitetta, joka viittaa palvelimeen, jolla on allekirjoittamaton tai virheellinen SSL-varmenne. Siinä tapauksessa yritys noutaa tulo- tai lähtövirta URL: n yhteysobjektista heittää SSLEpoikkeus viestillä "epäluotettava palvelimen sertifikaattiketju". Jos palvelimella on voimassa oleva, allekirjoitettu varmenne, mitään poikkeusta ei heitetä.

 URL url = uusi URL ("// [palvelimesi]"); URLConnection con = URL.openConnection (); // SSLException heitetään tänne, jos palvelimen varmenne on virheellinen con.getInputStream (); 

Ilmeinen ratkaisu ongelmaan on saada allekirjoitetut varmenteet palvelimellesi. Yksi seuraavista URL-osoitteista voi kuitenkin tarjota myös ratkaisun: "Java Secure Socket Extension 1.0.2 Changes" (Sun Microsystems) tai Sunin Java Developer Connection -foorumi.

Microsoft JView

Osittain johtuen Microsoftin ja Sunin välisestä kiistasta Java-käyttöoikeuksien myöntämisestä Windows-alustoille, Microsoft JView VM on tällä hetkellä vain JDK 1.1 -yhteensopiva. Siksi yllä kuvattu tekniikka ei toimi JView-ohjelmassa toimiville asiakkaille, koska JSSE vaatii vähintään 1.2.2-yhteensopivan virtuaalikoneen. Riittävän kätevästi Microsoft tarjoaa kuitenkin HTTPS-yhteensopivan striiminkäsittelijän osana com.ms.net.wininet paketti.

Voit asettaa striiminkäsittelijän JView-ympäristöön kutsumalla yhden staattisen menetelmän URL luokka:

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

Kun olet soittanut edellisen menetelmäpuhelun,

EpämuodostunutURLE-poikkeus

ei enää heitetä soittamalla seuraavaan koodiin:

 URL url = uusi URL ("// [palvelimesi]"); 

Tähän tekniikkaan liittyy kaksi varoitusta. Ensinnäkin JDK: n asiakirjojen mukaan setURLStreamHandlerFactory menetelmää voidaan kutsua korkeintaan kerran tietyssä virtuaalikoneessa. Myöhemmät yritykset kutsua tätä menetelmää heittävät Virhe. Toiseksi, kuten 1.2 VM -ratkaisun tapauksessa, sinun on oltava varovainen käyttäessäsi URL-osoitetta, joka viittaa palvelimeen, jolla on allekirjoittamaton tai virheellinen SSL-varmenne. Kuten edellisessä tapauksessa, ongelmia esiintyy, kun URL-osoiteyhteysobjektista yritetään noutaa tulo- tai lähtövirta. Kuitenkin sen sijaan, että heittäisit SSLEpoikkeus, Microsoftin stream-käsittelylaite heittää standardin IOException.

 URL url = uusi URL ("// [palvelimesi]"); URLConnection con = url.openConnection (); // IOException heitetään tänne, jos palvelimen varmenne on virheellinen con.getInputStream (); 

Jälleen selvä ratkaisu ongelmaan on yrittää HTTPS-viestintää vain palvelimien kanssa, joilla on allekirjoitettu, voimassa oleva varmenne. JView tarjoaa kuitenkin yhden muun vaihtoehdon. Välittömästi ennen tulo- tai lähtövirran noutamista URL-osoitteen yhteysobjektista voit soittaa setAllowUserInteraction (true) yhteysobjektissa. Tällöin JView näyttää viestin, joka varoittaa käyttäjää palvelimen varmenteista ovat virheellisiä, mutta antaa hänelle mahdollisuuden jatkaa joka tapauksessa. Muista kuitenkin, että tällaiset viestit voivat olla järkeviä työpöytäsovelluksille, mutta valintaikkunoiden näyttäminen palvelimellasi muuhun kuin virheenkorjaustarkoituksiin on todennäköisesti mahdotonta hyväksyä.

Huomaa: Voit myös soittaa setAllowUserInteraction () menetelmä JDK 1.2 -yhteensopivissa virtuaalikoneissa. Kuitenkin käytettäessä Sunin 1.2 VM: ää (jolla tämä koodi testattiin), valintaikkunoita ei näytetä, vaikka ominaisuus olisi asetettu tosi.

 URL url = uusi URL ("// [palvelimesi]"); URLConnection con = url.openConnection (); // saa virtuaalikoneen näyttämään valintaikkunan, kun muodostetaan yhteys // epäluotettaviin palvelimiin con.setAllowUserInteraction (true); con.getInputStream (); 

com.ms.net.wininet paketti näyttää olevan asennettuna ja sijoitettuna järjestelmän luontopolulle oletuksena Windows NT 4.0-, Windows 2000- ja Windows 9x -järjestelmissä. Lisäksi Microsoft JDK -dokumentaation mukaan WinInetStreamHandlerFactory on "... sama käsittelijä, joka asennetaan oletusarvoisesti sovelmia käytettäessä."

Alustan riippumattomuus

Vaikka molemmat kuvailemani tekniikat kattavat suurimman osan alustoista, joilla Java-asiakkaasi voi toimia, Java-asiakkaasi on ehkä suoritettava sekä JDK 1.1- että JDK 1.2 -yhteensopivilla virtuaalikoneilla. "Kirjoita kerran, juokse mihin tahansa", muista? Kuten käy ilmi, näiden kahden tekniikan yhdistäminen siten, että sopiva käsittelijä ladataan virtuaalikoneesta riippuen, on melko suoraviivaista. Seuraava koodi osoittaa yhden tavan edetä:

 Merkkijono strVendor = System.getProperty ("java.vendor"); Merkkijono strVersion = System.getProperty ("java.version"); // Oletetaan, että järjestelmän versiomerkkijono on muoto: // [tärkein]. [Pienempi]. [Julkaisu] (esim. 1.2.2) Double dVersion = uusi Double (strVersion.substring (0, 3)); // Jos suoritamme MS-ympäristössä, käytä MS-virtankäsittelijää. jos (-1 <strVendor.indexOf ("Microsoft")) {kokeile {Class clsFactory = Class.forName ("com.ms.net.wininet.WininetStreamHandlerFactory"); if (null! = clsFactory) URL.setURLStreamHandlerFactory ((URLStreamHandlerFactory) clsFactory.newInstance ()); } catch (ClassNotFoundException cfe) {heittää uusi Poikkeus ("Microsoft SSL: n lataaminen ei onnistu" + "-virtakäsittelijä. Tarkista classpath." + cfe.toString ()); } // Jos virran käsittelijän tehdas // on jo asetettu onnistuneesti // varmista, että lippumme on asetettu ja syö virheilmoitus (Error err) {m_bStreamHandlerSet = true;}}} // Jos olemme normaalissa Java-ympäristössä, // yritä käyttää JSSE-käsittelijää. // HUOMAUTUS: JSSE vaatii vähintään 1,2, jos (1.2 <= dVersion.doubleValue ()) {System.setProperty ("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol "); kokeile {// jos JSSE-palveluntarjoaja on käytettävissä //, mutta sitä ei ole vielä asetettu //, lisää se uudeksi toimitukseksi suojausluokkaan. 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) {heittää uusi poikkeus ("JSSE SSL -virtakäsittelijää ei voi ladata." + "Tarkista luokan polku." + cfe.toString ()); }} 

Entä appletit?

HTTPS-pohjaisen viestinnän suorittaminen sovelman sisällä näyttää olevan luonnollinen jatko edellä kuvatuille skenaarioille. Todellisuudessa se on vielä helpompaa useimmissa tapauksissa. Netscape Navigatorin ja Internet Explorerin 4.0- ja uudemmissa versioissa HTTPS on oletusarvoisesti käytössä niiden virtuaalikoneissa. Siksi, jos haluat luoda HTTPS-yhteyden sovelmakoodistasi, määritä yksinkertaisesti HTTPS protokollaksi luotaessa URL luokka:

 URL url = uusi URL ("// [palvelimesi]"); 

Jos asiakasselaimessa käytetään Sunin Java 2 -laajennusta, HTTPS: n käyttöön liittyy muita rajoituksia. Koko keskustelu HTTPS: n käytöstä Java 2 -laajennuksen kanssa löytyy Sunin verkkosivustolta (katso Resurssit).

Johtopäätös

HTTPS-protokollan käyttäminen sovellusten välillä voi olla nopea ja tehokas tapa saavuttaa kohtuullinen suoja viestinnässäsi. Valitettavasti syyt siihen, että sitä ei tueta osana Java-vakiomäärityksiä, näyttävät olevan enemmän laillisia kuin teknisiä. JSSE: n myötä ja Microsoftin käytön myötä com.ms.net.winint paketti, turvallinen viestintä on mahdollista useimmilta alustoilta vain muutamalla koodirivillä.

Matt Towers, itse kuvannut eBozo, jätti äskettäin kehitysasemansa Visiossa. Hän on sittemmin liittynyt Internet-aloitukseen, PredictPoint.com, Seattlessa, Washingtonissa, jossa hän työskentelee kokopäiväisenä Java-kehittäjänä.

Lisätietoja tästä aiheesta

  • Tämän artikkelin lähdekoodin zip-tiedosto sisältää yllä esitetyn alustasta riippumattoman koodin, joka on toteutettu nimeltään luokassa HttpsMessage. HttpsMessage on tarkoitettu HttpMessage luokan kirjoittanut Jason Hunter, tekijä Java Servlet -ohjelmointi (O'Reilly & Associates). Etsiä HttpsMessage hänen teoksensa tulevassa toisessa painoksessa. Jos haluat käyttää luokkaa tarkoitetulla tavalla, sinun on ladattava ja asennettava com.orilly.pakatut paketti. com.orilly.pakatut paketti ja vastaava lähdekoodi löytyvät Hunterin verkkosivustolta

    //www.servlets.com

  • Voit myös ladata lähdekooditiedoston

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

  • Tässä on muutama hyvä verkkosivusto HTTPS-viestinnän testaamiseen:
  • //www.verisign.com/
  • //happiness.dhs.org/
  • //www.microsoft.com
  • //www.sun.com
  • //www.ftc.gov
  • Lisätietoja JSSE: stä, ladattavat bitit ja asennusohjeet ovat Sunin verkkosivustolla

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

  • Kuvaus joidenkin JSSE-palvelujen käytöstä, mukaan lukien yllä kuvattu tekniikka, löytyy Jonathan Knudsenin O'Reilly-verkkosivustolta "Secure Networking in Java".

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

  • Lisätietoja WininetStreamHandlerFactory luokka löytyy Microsoft JSDK -dokumentaatiosta

    //www.microsoft.com/java/sdk/. Lisäksi Microsoftin tietokanta julkaisee myös "PRBAllow URL-luokan pääsyn HTTPS: ään sovelluksissa"

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

  • Lisätietoja HTTPS: n käytöstä Java 2 -laajennuksen kanssa on Sunin verkkosivuston artikkelissa "Kuinka HTTPS toimii Java-laajennuksessa".

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

Tämän tarinan "Java Tip 96: Käytä HTTPS: ää Java-asiakaskoodissasi" julkaisi alun perin JavaWorld.