HTTPS接続を表すサンプル・コード
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の実行
URLReader.javaの例は、URLを使用してセキュア・サイト上のリソースにアクセスする方法を示しています。デフォルトでは、この例はwww.verisign.comに接続しますが、ClassFileServer.javaに接続するように調整できます。これを行うには、URLが正しいアドレスを指すように変更する必要があります。また、サーバーの証明書のホスト名がURLのホスト名に一致しない場合は、サーバーの証明書を更新するか、カスタムHostNameVerifier (HttpsURLConnectionを参照)を指定することも必要になる場合があります。
注意:
ファイアウォールの内側からの場合は、プロキシを正しく指定するために、https.proxyHostおよびhttps.proxyPortシステム・プロパティを設定する必要がある場合があります。
使用方法
java URLReaderURLReader.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();
}
}URLReaderWithOptionsの実行
この例は、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();
}
}