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 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();
}
}
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();
}
}