Programování

Tip Java 96: Použijte HTTPS v kódu klienta Java

Pokud jste někdy zkoušeli implementovat zabezpečenou komunikaci mezi klientem Java a serverem HTTPS (HyperText Transfer Protocol Secure), pravděpodobně jste zjistili, že standardní java.net.URL třída nepodporuje protokol HTTPS. Implementace této rovnice na straně serveru je poměrně přímočará. Téměř jakýkoli dnes dostupný webový server poskytuje mechanismus pro vyžádání dat pomocí protokolu HTTPS. Jakmile nastavíte svůj webový server, může libovolný prohlížeč požadovat od serveru zabezpečené informace jednoduše zadáním HTTPS jako protokolu pro adresu URL. Pokud ještě nemáte nastavený server HTTPS, můžete svůj klientský kód otestovat téměř na jakékoli webové stránce HTTPS na internetu. Sekce Zdroje obsahuje krátký seznam kandidátů, které pro tento účel můžete použít.

Z pohledu klienta však klame jednoduchost S na konci známého protokolu HTTP. Prohlížeč ve skutečnosti provádí značné množství zákulisní práce, aby zajistil, že nikdo nezměnil nebo nesledoval informace, které jste požadovali. Jak se ukázalo, algoritmus pro šifrování HTTPS je patentován společností RSA Security (alespoň na několik dalších měsíců). Použití tohoto algoritmu bylo licencováno výrobci prohlížečů, ale nebylo licencováno společností Sun Microsystems, aby bylo zahrnuto do standardní Javy URL implementace třídy. Výsledkem je, že když se pokusíte postavit a URL objekt s řetězcem specifikujícím HTTPS jako protokol, a MalformedURLE výjimka bude hozen.

Naštěstí pro vyhovění tomuto omezení poskytuje specifikace Java možnost vybrat pro nástroj alternativní obsluhu proudu URL třída. Technika potřebná k implementaci se však liší v závislosti na použitém virtuálním počítači (VM). Pro virtuální počítač kompatibilní s JDK 1.1 společnosti Microsoft, JView, společnost Microsoft licencovala algoritmus a poskytla obslužný program toku HTTPS jako součást svého wininet balík. Společnost Sun na druhou stranu nedávno vydala rozšíření Java Secure Sockets Extension (JSSE) pro virtuální počítače kompatibilní s JDK 1.2, na které Sun rovněž poskytl licenci a poskytl obsluhu streamu HTTPS. Tento článek předvede, jak implementovat použití obslužné rutiny streamu s povoleným HTTPS pomocí JSSE a Microsoftu wininet balík.

Virtuální stroje kompatibilní s JDK 1.2

Technika používání virtuálních počítačů kompatibilních s JDK 1.2 se primárně opírá o rozšíření Java Secure Sockets Extension (JSSE) 1.0.1. Než bude tato technika fungovat, musíte nainstalovat JSSE a přidat ji do cesty ke třídě dotyčného virtuálního počítače klienta.

Po instalaci JSSE musíte nastavit vlastnost systému a přidat do poskytovatele nového poskytovatele zabezpečení Bezpečnostní objekt třídy. Existuje mnoho způsobů, jak provést obě tyto věci, ale pro účely tohoto článku je zobrazena programová metoda:

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

Po provedení předchozích dvou volání metody se MalformedURLE výjimka již nebude vyvolána voláním následujícího kódu:

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

Pokud se připojujete ke standardnímu portu SSL 443, máte možnost připojit číslo portu k řetězci URL. Pokud však váš webový server používá nestandardní port pro přenos SSL, budete muset připojit číslo portu k řetězci adresy URL takto:

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

Jedno upozornění na tuto techniku ​​se týká adresy URL, která odkazuje na server, který má nepodepsaný nebo neplatný certifikát SSL. V takovém případě vyvolá pokus o načtení vstupního nebo výstupního proudu z objektu připojení URL SSLException se zprávou „nedůvěryhodný řetězec certifikátu serveru“. Pokud má server platný podepsaný certifikát, nebude vyvolána žádná výjimka.

 URL url = nová URL ("// [váš server]"); URLConnection con = URL.openConnection (); // SSLException zde vyvolána, pokud je certifikát serveru neplatný con.getInputStream (); 

Zřejmým řešením tohoto problému je získání podepsaných certifikátů pro váš server. Řešení však může poskytnout také jedna z následujících adres URL: „Java Secure Socket Extension 1.0.2 Changes“ (Sun Microsystems) nebo fórum Java Developer Connection společnosti Sun.

Microsoft JView

Částečně kvůli pokračujícímu sporu mezi společnostmi Microsoft a Sun ohledně licencování prostředí Java pro použití na platformách Windows je Microsoft JView VM v současnosti kompatibilní pouze s JDK 1.1. Technika popsaná výše proto nebude fungovat pro klienty spuštěné v JView, protože JSSE vyžaduje alespoň VM kompatibilní s 1.2.2. Pohodlně však Microsoft poskytuje jako součást nástroje pro zpracování streamů s podporou HTTPS com.ms.net.wininet balík.

Obslužný program proudu můžete nastavit v prostředí JView voláním jedné statické metody na URL třída:

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

Po provedení předchozího volání metody se

MalformedURLE výjimka

již nebude vyvolána voláním následujícího kódu:

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

S touto technikou jsou spojeny dvě výhrady. Nejprve podle dokumentace JDK setURLStreamHandlerFactory metoda může být volána maximálně jednou v daném VM. Následné pokusy o volání této metody vyvolají Chyba. Zadruhé, stejně jako v případě řešení 1.2 VM, musíte být opatrní, když používáte adresu URL, která odkazuje na server s nepodepsaným nebo neplatným certifikátem SSL. Stejně jako v předchozím případě dochází k problémům, když dojde k pokusu o načtení vstupního nebo výstupního proudu z objektu připojení adresy URL. Avšak místo házení SSLException, obslužný program proudu Microsoft hodí standard IOException.

 URL url = nová URL ("// [váš server]"); URLConnection con = url.openConnection (); // IOException zde vyvolána, pokud je certifikát serveru neplatný con.getInputStream (); 

Zřejmým řešením tohoto problému je opět pokusit se o komunikaci HTTPS pouze se servery, které mají podepsaný a platný certifikát. JView však nabízí ještě jednu možnost. Bezprostředně před načtením vstupního nebo výstupního proudu z objektu připojení adresy URL můžete volat setAllowUserInteraction (true) na objektu připojení. To způsobí, že JView zobrazí zprávu varující uživatele, že certifikáty serveru jsou neplatné, ale dává mu možnost pokračovat stejně. Mějte však na paměti, že takové zprávy mohou být přiměřené pro desktopovou aplikaci, ale zobrazování dialogových oken na serveru pro jiné účely než ladění je pravděpodobně nepřijatelné.

Poznámka: Můžete také zavolat na setAllowUserInteraction () metoda ve virtuálních počítačích kompatibilních s JDK 1.2. Při používání virtuálního počítače Sun 1.2, u kterého byl tento kód testován, se však nezobrazí žádná dialogová okna, i když je tato vlastnost nastavena na hodnotu true.

 URL url = nová URL ("// [váš server]"); URLConnection con = url.openConnection (); // způsobí, že virtuální počítač zobrazí dialog při připojování // k nedůvěryhodným serverům con.setAllowUserInteraction (true); con.getInputStream (); 

The com.ms.net.wininet balíček se ve výchozím nastavení v systémech Windows NT 4.0, Windows 2000 a Windows 9x je nainstalován a umístěn do systémové cesty ke třídě. Podle dokumentace Microsoft JDK také WinInetStreamHandlerFactory je „... stejná obslužná rutina, která je ve výchozím nastavení nainstalována při spouštění appletů.“

Nezávislost platformy

Ačkoli obě z těchto technik, které jsem popsal, pokrývají většinu platforem, na kterých může váš klient Java běžet, váš klient Java bude možná muset běžet na virtuálních počítačích kompatibilních s JDK 1.1 a JDK 1.2. „Napište jednou, utíkejte kamkoli,“ pamatujete? Jak se ukázalo, kombinace těchto dvou technik tak, aby byl načten příslušný obslužný program v závislosti na virtuálním počítači, je poměrně přímočará. Následující kód ukazuje jeden způsob, jak toho dosáhnout:

 Řetězec strVendor = System.getProperty ("java.vendor"); String strVersion = System.getProperty ("java.version"); // Předpokládá řetězec verze systému ve tvaru: //[major].[minor].[vydat] (např. 1.2.2) Double dVersion = nový Double (strVersion.substring (0, 3)); // Pokud běžíme v prostředí MS, použijte obslužný program MS stream. 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 ()); } // Pokud je továrna na zpracování streamů // již úspěšně nastavena // ujistěte se, že je nastaven náš příznak a sníte chycení chyby (Error err) {m_bStreamHandlerSet = true;}} // Pokud jsme v normálním prostředí Java, // zkuste použít obslužnou rutinu JSSE. // POZNÁMKA: JSSE vyžaduje verzi 1.2 nebo lepší, pokud (1.2 <= dVersion.doubleValue ()) {System.setProperty ("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol "); zkuste {// pokud máme k dispozici poskytovatele JSSE, // a ten již nebyl // nastaven, přidejte jej jako nový prostředek do třídy Security. Třída clsFactory = Class.forName ("com.sun.net.ssl.internal.ssl.Provider"); if ((null! = clsFactory) && (null == Security.getProvider ("SunJSSE"))) Security.addProvider ((poskytovatel) clsFactory.newInstance ()); } catch (ClassNotFoundException cfe) {hodit novou výjimku ("Nelze načíst obslužnou rutinu streamu SSL JSSE." + "Zkontrolovat classpath." + cfe.toString ()); }} 

A co applety?

Provádění komunikace založené na HTTPS z appletu se jeví jako přirozené rozšíření výše popsaných scénářů. Ve skutečnosti je to ve většině případů ještě jednodušší. V 4.0 a novějších verzích Netscape Navigator a Internet Explorer je ve výchozím nastavení povolen protokol HTTPS pro jejich příslušné virtuální počítače. Pokud tedy chcete vytvořit připojení HTTPS z kódu vašeho appletu, při vytváření instance aplikace jednoduše zadejte HTTPS jako svůj protokol. URL třída:

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

Pokud je v klientském prohlížeči spuštěn modul plug-in Java 2 společnosti Sun, existují další omezení, jak můžete HTTPS používat. Úplnou diskusi o používání HTTPS s modulem plug-in Java 2 najdete na webových stránkách společnosti Sun (viz Zdroje).

Závěr

Používání protokolu HTTPS mezi aplikacemi může být rychlý a efektivní způsob, jak získat přiměřenou úroveň zabezpečení vaší komunikace. Důvody, že není podporována jako součást standardní specifikace Java, se bohužel zdají být legálnější než technické. S příchodem JSSE a používáním Microsoftu com.ms.net.winint balíček, zabezpečená komunikace je možná z většiny platforem pouze s několika řádky kódu.

Matt Towers, eBozo, který sám popisuje, nedávno opustil svou vývojovou pozici ve Visiu. Od té doby se připojil k internetovému startupu PredictPoint.com v Seattlu ve státě Washington, kde pracuje jako vývojář Java na plný úvazek.

Další informace o tomto tématu

  • Soubor zip zdrojového kódu pro tento článek obsahuje výše uvedený kód nezávislý na platformě implementovaný ve třídě s názvem HttpsMessage. HttpsMessage je zamýšlen jako podtřída do HttpMessage třída, kterou napsal Jason Hunter, autor knihy Programování servletu Java (O'Reilly & Associates). Hledat HttpsMessage v nadcházejícím druhém vydání jeho knihy. Chcete-li tuto třídu používat, jak bylo zamýšleno, budete si muset stáhnout a nainstalovat com.oreilly.servlets balík. The com.oreilly.servlets balíček a odpovídající zdrojový kód najdete na webových stránkách Hunter

    //www.servlets.com

  • Můžete si také stáhnout zdrojový soubor zip

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

  • Tady je několik dobrých webových stránek pro testování komunikace HTTPS:
  • //www.verisign.com/
  • //happiness.dhs.org/
  • //www.microsoft.com
  • //www.sun.com
  • //www.ftc.gov
  • Více informací o JSSE, stejně jako bity ke stažení a pokyny k instalaci najdete na webových stránkách společnosti Sun

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

  • Popis, jak používat některé služby JSSE, včetně výše popsané techniky, naleznete v dokumentu „Secure Networking in Java“, který napsal Jonathan Knudsen na webu O'Reilly.

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

  • Více informací na WininetStreamHandlerFactory třídy najdete v dokumentaci Microsoft JSDK

    //www.microsoft.com/java/sdk/. Kromě toho znalostní báze Microsoft také publikuje „PRBAllowing the URL class to access HTTPS in Applications“

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

  • Další informace o používání protokolu HTTPS s modulem plug-in Java 2 naleznete v části „Jak protokol HTTPS funguje v modulu plug-in Java“ na webu společnosti Sun

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

Tento příběh, „Java Tip 96: Use HTTPS in your Java client code“, původně publikoval JavaWorld.

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