JSSEを介してセキュアな通信にアクセスするためのプライマリAPIは2つあります。1つの方法は、SSLSocketClient.java
、SSLSocketClientWithTunneling.java
およびSSLSocketClientWithClientAuth.java
の例(ClassFileServerの実行で説明した例を使用するか使用しないで)に示すように、任意のセキュアな通信に使用できるソケット・レベルのAPIを使用することです。
2つ目はもっと簡単な方法で、標準のJava URL APIを使用します。java.net.URLクラスを使用したHTTPS URLプロトコルまたはスキームを使用して、SSL対応のWebサーバーとセキュアに通信できます。
HTTPS URLスキームのサポートは一般的なブラウザの多くに実装されており、JSSEで提供されているソケット・レベルAPIを必要とせずにセキュアな通信にアクセスできます。URLの例はhttps://www.verisign.com
です。
HTTPS URL実装のトラストおよび鍵の管理は、環境に固有です。JSSE実装は、HTTPS URL実装を提供します。別のHTTPSプロトコル実装を使用するには、java.protocol.handler.pkgs
システム・プロパティを設定します(java.lang.Systemプロパティの指定方法を参照)。
URLReader.java
の例は、URLを使用してセキュア・サイト上のリソースにアクセスする方法を示しています。デフォルトでは、この例はwww.verisign.com
に接続しますが、ClassFileServer.java
に接続するように調整できます。これを行うには、URLが正しいアドレスを指すように変更する必要があります。また、サーバーの証明書のホスト名がURLのホスト名に一致しない場合は、サーバーの証明書を更新するか、カスタムHostNameVerifier (HttpsURLConnectionを参照)を指定することも必要になる場合があります。
注意:
ファイアウォールの内側からの場合は、プロキシを正しく指定するために、https.proxyHost
およびhttps.proxyPort
システム・プロパティを設定する必要がある場合があります。使用方法
java URLReader
URLReader.java
import java.net.*; import java.io.*; /* * This example illustrates using a URL to access resources * on a secure site. * * If you are running inside a firewall, please also set the following * Java system properties to the appropriate value: * * https.proxyHost = <secure proxy server hostname> * https.proxyPort = <secure proxy server port> * */ public class URLReader { public static void main(String[] args) throws Exception { URL verisign = new URL("https://www.verisign.com/"); BufferedReader in = new BufferedReader( new InputStreamReader( verisign.openStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } }
この例は、URLReaader.java
に非常に似ていますが、Java実行環境への-D
オプションとしてではなく、mainメソッド引数によってシステム・プロパティを設定できます。
使用方法
java URLReaderWithOptions [-h proxyhost] [-p proxyport] [-k protocolhandlerpkgs] [-c ciphersarray]
proxyHost
: セキュアなプロキシ・サーバー・ホスト名(https.proxyHost
)proxyPort
: セキュアなプロキシ・サーバー・ポート(https.proxyPort
)protocolhandlerpkgs
: プロトコル・ハンドラのパイプ区切り(|
)リスト(java.protocol.handler.pkgs
)ciphersarray
: カンマ区切りリストとしての有効な暗号化方式群(https.cipherSuites
)注意:
複数のプロトコル・ハンドラを、縦線で区切った項目のリストでprotocolhandlerpkgs
引数に含めることができます。複数のSSL暗号化方式群名を、カンマで区切った項目のリストでciphersarray
引数に含めることができます。可能な暗号化方式群名はSSLSocket.getSupportedCipherSuites()
メソッドで返されるものと同じです。暗号群はSSLおよびTLSプロトコルの仕様から命名されています。protocolhandlerpkgs
引数は、Oracleが提供するデフォルト以外のHTTPSプロトコル・ハンドラ実装を使用する場合にのみ必要です。
ファイアウォールの内側でサンプル・コード実行している場合は、プロキシ・ホストおよびプロキシ・ポートの引数を含める必要があります。また、使用できる暗号群のリストを含めることもできます。
次に、URLReaderWithOptions
の実行例と、ポート8080にプロキシ・ポート「webproxy」を指定する場合の例を示します。
java URLReaderWithOptions -h webproxy -p 8080
URLReaderWithOptions.java
import java.net.*; import java.io.*; /* * Using a URL to access resources on a secure site. * * You can optionally set the following command line options: * * -h <secure proxy server hostname> * -p <secure proxy server port> * -k <| separated list of protocol handlers> * -c <enabled cipher suites as a comma separated list> * */ public class URLReaderWithOptions { public static void main(String[] args) throws Exception { System.out.println("USAGE: java URLReaderWithOptions " + "[-h proxyhost] [-p proxyport] [-k protocolhandlerpkgs] " + "[-c ciphersarray]"); // initialize system properties char option = 'd'; for (int i = 0; i < args.length; i++) { System.out.println(option+": "+args[i]); switch(option) { case 'h': System.setProperty("https.proxyHost", args[i]); option = 'd'; break; case 'p': System.setProperty("https.proxyPort", args[i]); option = 'd'; break; case 'k': System.setProperty("java.protocol.handler.pkgs", args[i]); option = 'd'; break; case 'c': System.setProperty("https.cipherSuites", args[i]); option = 'd'; break; default: // get the next option if (args[i].startsWith("-")) { option = args[i].charAt(1); } } } URL verisign = new URL("https://www.verisign.com/"); BufferedReader in = new BufferedReader( new InputStreamReader( verisign.openStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } }