Tip Java 96: Gunakan HTTPS dalam kode klien Java Anda

Jika Anda pernah mencoba menerapkan komunikasi aman antara klien Java dan server HTTPS (HyperText Transfer Protocol Secure), Anda mungkin menemukan bahwa java.net.URLkelas standar tidak mendukung protokol HTTPS. Penerapan sisi server dari persamaan tersebut cukup mudah. Hampir semua server Web yang tersedia saat ini menyediakan mekanisme untuk meminta data, menggunakan HTTPS. Setelah Anda menyiapkan server Web, browser apa pun dapat meminta informasi aman dari server Anda hanya dengan menetapkan HTTPS sebagai protokol untuk URL tersebut. Jika Anda belum menyiapkan server HTTPS, Anda dapat menguji kode klien Anda dengan hampir semua Halaman Web HTTPS di Internet. Bagian Sumber daya berisi daftar singkat kandidat yang dapat Anda gunakan untuk tujuan itu.

Namun, dari perspektif klien, kesederhanaan S di akhir HTTP yang sudah dikenal itu menipu. Peramban sebenarnya melakukan banyak pekerjaan di belakang layar untuk memastikan bahwa tidak ada orang yang merusak atau memantau informasi yang Anda minta. Ternyata, algoritme untuk melakukan enkripsi HTTPS dipatenkan oleh RSA Security (setidaknya untuk beberapa bulan lagi). Penggunaan algoritme tersebut telah dilisensikan oleh produsen browser tetapi tidak dilisensikan oleh Sun Microsystems untuk disertakan dalam URLimplementasi kelas Java standar . Akibatnya, jika Anda mencoba membuat URLobjek dengan string yang menetapkan HTTPS sebagai protokol, a MalformedURLExceptionakan dilempar.

Untungnya, untuk mengakomodasi batasan tersebut, spesifikasi Java menyediakan kemampuan untuk memilih penangan aliran alternatif untuk URLkelas tersebut. Namun, teknik yang diperlukan untuk mengimplementasikannya berbeda-beda, bergantung pada mesin virtual (VM) yang Anda gunakan. Untuk VM yang kompatibel dengan JDK 1.1 milik Microsoft, JView, Microsoft telah melisensikan algoritme dan menyediakan pengendali aliran HTTPS sebagai bagian dari wininetpaketnya. Sun, di sisi lain, baru-baru ini merilis Java Secure Sockets Extension (JSSE) untuk VM yang kompatibel dengan JDK 1.2, di mana Sun juga telah melisensikan dan menyediakan pengendali streaming HTTPS. Artikel ini akan mendemonstrasikan cara menerapkan penggunaan pengendali aliran berkemampuan HTTPS, menggunakan paket JSSE dan Microsoft wininet.

Mesin virtual yang kompatibel dengan JDK 1.2

Teknik untuk menggunakan VM yang kompatibel dengan JDK 1.2 terutama bergantung pada Java Secure Sockets Extension (JSSE) 1.0.1. Sebelum teknik itu bekerja, Anda harus menginstal JSSE dan menambahkannya ke jalur kelas VM klien yang dimaksud.

Setelah Anda menginstal JSSE, Anda harus menyetel properti sistem dan menambahkan penyedia keamanan baru ke Securityobjek kelas. Ada berbagai cara untuk melakukan kedua hal ini, tetapi untuk keperluan artikel ini, metode terprogram akan ditampilkan:

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

Setelah melakukan dua panggilan metode sebelumnya, MalformedURLExceptionwill tidak lagi dilempar dengan memanggil kode berikut:

 URL url = URL baru ("// [server Anda]"); 

Jika Anda terhubung ke port SSL standar, 443, Anda memiliki opsi untuk menambahkan nomor port ke string URL. Namun, jika server Web Anda menggunakan port nonstandar untuk lalu lintas SSL, Anda perlu menambahkan nomor port ke string URL Anda seperti ini:

 URL url = URL baru ("// [server Anda]: 7002"); 

Satu peringatan dari teknik itu terkait dengan URL yang merujuk ke server yang memiliki sertifikat SSL yang tidak bertanda tangan atau tidak valid. Dalam hal ini, upaya untuk mengambil aliran input atau output dari objek koneksi URL akan SSLExceptionmenampilkan pesan "rantai sertifikat server tidak tepercaya". Jika server memiliki sertifikat yang valid dan ditandatangani, tidak ada pengecualian yang akan dilempar.

URL url = URL baru ("// [server Anda]"); URLConnection con = URL.openConnection (); // SSLException muncul di sini jika sertifikat server tidak valid con.getInputStream ();

Solusi yang jelas untuk masalah itu adalah mendapatkan sertifikat yang ditandatangani untuk server Anda. Namun, salah satu URL berikut juga dapat memberikan solusi: "Perubahan Java Secure Socket Extension 1.0.2" (Sun Microsystems) atau forum Sun Developer Connection.

Microsoft JView

Karena sebagian dari perselisihan yang sedang berlangsung antara Microsoft dan Sun mengenai lisensi Java untuk digunakan pada platform Windows, Microsoft JView VM saat ini hanya memenuhi JDK 1.1. Oleh karena itu, teknik yang dijelaskan di atas tidak akan berfungsi untuk klien yang berjalan di JView, karena JSSE memerlukan setidaknya VM yang kompatibel dengan 1.2.2. Namun, cukup nyaman, Microsoft menyediakan penangan aliran berkemampuan HTTPS sebagai bagian dari com.ms.net.wininetpaket.

Anda bisa menyetel pengendali aliran di lingkungan JView dengan memanggil satu metode statis di URLkelas:

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

Setelah melakukan pemanggilan metode sebelumnya, file

MalformedURLException

tidak akan lagi ditampilkan dengan memanggil kode berikut:

 URL url = URL baru ("// [server Anda]"); 

Ada dua peringatan yang terkait dengan teknik itu. Pertama, menurut dokumentasi JDK, setURLStreamHandlerFactorymetode tersebut dapat dipanggil paling banyak sekali dalam VM tertentu. Upaya selanjutnya untuk memanggil metode itu akan melempar Error. Kedua, seperti halnya dengan solusi VM 1.2, Anda harus berhati-hati saat menggunakan URL yang merujuk ke server dengan sertifikat SSL yang tidak ditandatangani atau tidak valid. Seperti kasus sebelumnya, masalah terjadi saat dilakukan upaya untuk mengambil aliran input atau output dari objek koneksi URL. Namun, alih-alih melempar SSLException, pengendali aliran Microsoft melempar standar IOException.

URL url = URL baru ("// [server Anda]"); URLConnection con = url.openConnection (); // IOException muncul di sini jika sertifikat server tidak valid con.getInputStream ();

Sekali lagi, solusi yang jelas untuk masalah itu adalah mencoba komunikasi HTTPS hanya dengan server yang memiliki sertifikat valid yang ditandatangani. Namun, JView menawarkan satu opsi lain. Segera sebelum mengambil aliran input atau output dari objek koneksi URL, Anda dapat memanggil setAllowUserInteraction(true)objek koneksi. Itu akan menyebabkan JView menampilkan pesan yang memperingatkan pengguna bahwa sertifikat server tidak valid, tetapi memberinya opsi untuk melanjutkan. Perlu diingat, bagaimanapun, bahwa pesan seperti itu mungkin masuk akal untuk aplikasi desktop, tetapi memiliki kotak dialog yang muncul di server Anda untuk tujuan selain debugging mungkin tidak dapat diterima.

Catatan: Anda juga dapat memanggil setAllowUserInteraction()metode ini di VM yang kompatibel dengan JDK 1.2. Namun, dalam menggunakan VM 1.2 Sun (yang dengannya kode ini diuji), tidak ada dialog yang ditampilkan bahkan ketika properti itu disetel ke true.

URL url = URL baru ("// [server Anda]"); URLConnection con = url.openConnection (); // menyebabkan VM menampilkan dialog saat menghubungkan // ke server tidak tepercaya con.setAllowUserInteraction (true); con.getInputStream ();

The com.ms.net.wininetpaket tampaknya diinstal dan ditempatkan pada sistem classpath secara default pada Windows NT 4.0, Windows 2000, dan sistem Windows 9x. Juga, menurut dokumentasi Microsoft JDK, WinInetStreamHandlerFactoryadalah "... penangan yang sama yang diinstal secara default saat menjalankan applet."

Independensi platform

Meskipun kedua teknik yang saya jelaskan mencakup sebagian besar platform tempat klien Java Anda dapat berjalan, klien Java Anda mungkin perlu dijalankan pada VM yang sesuai dengan JDK 1.1 dan JDK 1.2. "Menulis sekali, lari ke mana saja," ingat? Ternyata, menggabungkan kedua teknik tersebut sehingga handler yang sesuai dimuat bergantung pada VM, cukup mudah. Kode berikut menunjukkan satu cara untuk melakukannya:

String strVendor = System.getProperty ("java.vendor"); String strVersion = System.getProperty ("java.version"); // Mengasumsikan string versi sistem dalam bentuk: //[major].[minor].[release] (misalnya 1.2.2) Double dVersion = new Double (strVersion.substring (0, 3)); // Jika kita berjalan di lingkungan MS, gunakan pengendali aliran MS. if (-1 <strVendor.indexOf ("Microsoft")) {coba {Class clsFactory = Class.forName ("com.ms.net.wininet.WininetStreamHandlerFactory"); if (null! = clsFactory) URL.setURLStreamHandlerFactory ((URLStreamHandlerFactory) clsFactory.newInstance ()); } catch (ClassNotFoundException cfe) {throw new Exception ("Tidak dapat memuat penangan aliran Microsoft SSL" + ". Periksa classpath." + cfe.toString ());} // Jika pabrik pengendali aliran // sudah berhasil disetel // pastikan flag kita disetel dan makan kesalahan tangkapan (Kesalahan err) {m_bStreamHandlerSet = true;}} // Jika kita berada di lingkungan Java normal, // coba gunakan penangan JSSE. // CATATAN: JSSE membutuhkan 1.2 atau lebih baik jika (1.2 <= dVersion.doubleValue ()) {System.setProperty ("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol "); coba {// jika kami memiliki penyedia JSSE yang tersedia, // dan itu belum // disetel, tambahkan sebagai penyediaan baru untuk kelas Keamanan. Kelas 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) {throw new Exception ("Tidak dapat memuat pengendali aliran SSL JSSE." + "Periksa classpath." + cfe.toString ()); }}

Bagaimana dengan applet?

Melakukan komunikasi berbasis HTTPS dari dalam applet tampak seperti perluasan alami dari skenario yang dijelaskan di atas. Pada kenyataannya, ini lebih mudah dalam banyak kasus. Di versi 4.0 dan yang lebih baru dari Netscape Navigator dan Internet Explorer, HTTPS diaktifkan secara default untuk masing-masing VM. Oleh karena itu, jika Anda ingin membuat koneksi HTTPS dari dalam kode applet Anda, cukup tentukan HTTPS sebagai protokol Anda saat membuat instance URLkelas:

 URL url = URL baru ("// [server Anda]"); 

Jika browser klien menjalankan plug-in Sun's Java 2, maka ada batasan tambahan tentang bagaimana Anda dapat menggunakan HTTPS. Diskusi lengkap tentang penggunaan HTTPS dengan plug-in Java 2 dapat ditemukan di Situs Web Sun (lihat Sumberdaya).

Kesimpulan

Menggunakan protokol HTTPS antar aplikasi dapat menjadi cara yang cepat dan efektif untuk mendapatkan tingkat keamanan yang wajar dalam komunikasi Anda. Sayangnya, alasan tidak didukung sebagai bagian dari spesifikasi Java standar tampaknya lebih legal daripada teknis. Namun, dengan munculnya JSSE dan penggunaan com.ms.net.winintpaket Microsoft , komunikasi yang aman dimungkinkan dari sebagian besar platform hanya dengan beberapa baris kode.

Matt Towers, seorang eBozo yang menggambarkan dirinya sendiri, baru-baru ini meninggalkan posisi pengembangannya di Visio. Sejak itu dia bergabung dengan perusahaan rintisan Internet, PredictPoint.com, di Seattle, Washington, di mana dia bekerja sebagai pengembang Java penuh waktu.

Pelajari lebih lanjut tentang topik ini

  • The source code zip file for this article contains the platform-independent code shown above implemented in a class called HttpsMessage. HttpsMessage is intended as a subclass to the HttpMessage class written by Jason Hunter, author of Java Servlet Programming (O'Reilly & Associates). Look for HttpsMessage in the upcoming second edition of his book. If you wish to use that class as intended, you'll need to download and install the com.oreilly.servlets package. The com.oreilly.servlets package and corresponding source code can be found on Hunter's Website

    //www.servlets.com

  • You can also download the source zip file

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

  • Here are a few good Webpages for testing HTTPS communication:
  • //www.verisign.com/
  • //happiness.dhs.org/
  • //www.microsoft.com
  • //www.sun.com
  • //www.ftc.gov
  • More information on the JSSE as well as the downloadable bits and installation instructions can be found on Sun's Website

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

  • A description of how to use some JSSE services, including the technique described above, can be found in "Secure Networking in Java" by Jonathan Knudsen on the O'Reilly Website

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

  • More information on WininetStreamHandlerFactory class can be found in the Microsoft JSDK documentation

    //www.microsoft.com/java/sdk/. In addition, the Microsoft knowledge base also publishes "PRBAllowing the URL class to access HTTPS in Applications"

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

  • For more information on using HTTPS with the Java 2 plug-in, see "How HTTPS Works in Java Plug-In" on Sun's Website

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

Artikel ini, "Tip Java 96: Gunakan HTTPS dalam kode klien Java Anda" pada awalnya diterbitkan oleh JavaWorld.