public abstract class SSLSocket extends Socket
Socket を拡張し、Secure Sockets Layer (SSL) や IETF Transport Layer Security (TLS) などのプロトコルを使用するセキュアソケットを提供します。
これらのソケットは、通常のストリームソケットですが、TCP などのベースとなるネットワークトランスポートプロトコル上にセキュリティー保護層を追加します。次のセキュリティー保護が行われます。
これらのセキュリティー保護は、「暗号化方式群」を使用して指定します。暗号化方式群は、指定された SSL 接続で使用される暗号化アルゴリズムの組み合わせです。ネゴシエーションを行うには、2 つの終端が同じ暗号化方式群を選択し、その暗号化方式群が両方の環境で使用可能である必要があります。共通の暗号化方式群がない場合は、SSL 接続を確立できず、データを交換できません。
使用される暗号化方式群は、「ハンドシェーク」と呼ばれるネゴシエーションプロセスによって確立されます。ハンドシェークでは、セッションの作成または参加が行われます。作成または参加したセッションは、無効になるまでさまざまな接続を保護します。ハンドシェークが完了すると、getSession メソッドを使用してセッション属性にアクセスできます。接続の最初のハンドシェークは、次の 3 つのいずれかの方法で開始できます。
startHandshake を呼び出し、ハンドシェークを明示的に開始する。
getSession を呼び出すと、有効なセッションが現在存在しない場合はセッションが設定され、ハンドシェークが暗黙的に開始される。
なんらかの理由でハンドシェークが失敗した場合、SSLSocket が閉じ、通信できなくなります。
暗号化方式群を使用するときは、2 つのグループについて理解する必要があります。
デフォルトの実装で使用可能にする暗号化方式群では、サーバーを認証し、機密性が保証されなければいけません。サーバー認証が行われず機密性が保証されない暗号化方式群を選択する場合は、サーバー認証が行われず非公開性が保証されない (暗号化されない) 通信が使用されることに 2 つの終端が明示的に同意する必要があります。
SSLSocket が最初に作成されるときには、ハンドシェークは行われません。このため、使用する暗号化方式群やソケットモード (クライアントモードまたはサーバーモード) などの通信設定は、アプリケーションから行います。ただし、その接続を使用してアプリケーションデータを送信するときは、常にセキュリティーが保証されます。
ハンドシェークの完了を伝えるイベント通知を受信する設定にすることができます。この場合、2 つの追加クラスを利用する必要があります。HandshakeCompletedEvent オブジェクトは、この API のユーザーによって登録された HandshakeCompletedListener インスタンスに渡されます。
SSLSocket は、SSLSocketFactory によって作成されます。このほか、SSLServerSocket からの接続を accept した場合にも作成されます。
SSL ソケットの動作には、クライアントモードまたはサーバーモードがあります。ハンドシェークプロセスを開始するピア、および各ピアから送信されるメッセージは、モードによって決まります。ただし、接続には、クライアントとサーバーが 1 つずつ必要です。この要件を満たしていない場合、ハンドシェークは正しく行われません。最初のハンドシェークが開始されてからは、ネゴシエーションをやり直す場合であっても、クライアントモードとサーバーモードを切り替えることはできません。
Socket, SSLServerSocket, SSLSocketFactory| 修飾子 | コンストラクタと説明 |
|---|---|
protected |
SSLSocket()
サブクラスでだけ使用されます。
|
protected |
SSLSocket(InetAddress address, int port)
サブクラスでだけ使用されます。
|
protected |
SSLSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort)
サブクラスでだけ使用されます。
|
protected |
SSLSocket(String host, int port)
サブクラスでだけ使用されます。
|
protected |
SSLSocket(String host, int port, InetAddress clientAddress, int clientPort)
サブクラスでだけ使用されます。
|
| 修飾子と型 | メソッドと説明 |
|---|---|
abstract void |
addHandshakeCompletedListener(HandshakeCompletedListener listener)
この接続の SSL ハンドシェークの完了通知を受け取るためのイベントリスナーを登録します。
|
abstract String[] |
getEnabledCipherSuites()
この接続で現在使用可能になっている SSL 暗号化方式群の名前を返します。
|
abstract String[] |
getEnabledProtocols()
この接続に対して現在使用可能になっているプロトコルの名前を返します。
|
abstract boolean |
getEnableSessionCreation()
このソケットで新しい SSL セッションを確立できる場合は true を返します。
|
SSLSession |
getHandshakeSession()
SSL/TLS ハンドシェーク時に構築中の
SSLSession を返します。 |
abstract boolean |
getNeedClientAuth()
ソケットにクライアント認証が必要な場合は true を返します。
|
abstract SSLSession |
getSession()
この接続で使用されている SSL セッションを返します。
|
SSLParameters |
getSSLParameters()
この SSLSocket で有効な SSLParameters を返します。
|
abstract String[] |
getSupportedCipherSuites()
この接続で使用可能にできる暗号化方式群の名前を返します。
|
abstract String[] |
getSupportedProtocols()
SSL 接続で使用可能にできるプロトコルの名前を返します。
|
abstract boolean |
getUseClientMode()
ハンドシェーク時にクライアントモードを使用するようにソケットが設定されている場合は true。
|
abstract boolean |
getWantClientAuth()
ソケットがクライアント認証を要求する場合は true を返します。
|
abstract void |
removeHandshakeCompletedListener(HandshakeCompletedListener listener)
以前に登録されたハンドシェーク完了リスナーを削除します。
|
abstract void |
setEnabledCipherSuites(String[] suites)
この接続で使用可能な暗号化方式群を設定します。
|
abstract void |
setEnabledProtocols(String[] protocols)
この接続で使用可能なプロトコルのバージョンを設定します。
|
abstract void |
setEnableSessionCreation(boolean flag)
このソケットで新しい SSL セッションを確立できるかどうかを制御します。
|
abstract void |
setNeedClientAuth(boolean need)
クライアント認証が必要なようにソケットを構成します。
|
void |
setSSLParameters(SSLParameters params)
このソケットに SSLParameters を適用します。
|
abstract void |
setUseClientMode(boolean mode)
ハンドシェーク時、ソケットがクライアント (またはサーバー) モードを使用するように構成します。
|
abstract void |
setWantClientAuth(boolean want)
クライアント認証を要求するようにソケットを構成します。
|
abstract void |
startHandshake()
この接続上で SSL ハンドシェークを開始します。
|
bind, close, connect, connect, getChannel, getInetAddress, getInputStream, getKeepAlive, getLocalAddress, getLocalPort, getLocalSocketAddress, getOOBInline, getOutputStream, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoLinger, getSoTimeout, getTcpNoDelay, getTrafficClass, isBound, isClosed, isConnected, isInputShutdown, isOutputShutdown, sendUrgentData, setKeepAlive, setOOBInline, setPerformancePreferences, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSocketImplFactory, setSoLinger, setSoTimeout, setTcpNoDelay, setTrafficClass, shutdownInput, shutdownOutput, toStringprotected SSLSocket()
protected SSLSocket(String host, int port) throws IOException, UnknownHostException
セキュリティーマネージャーが存在する場合、その checkConnectメソッドが、ホストアドレスと port を引数に指定して呼び出されます。この結果、SecurityException がスローされることがあります。
host - 接続先のホストの名前、またはループバックアドレスの場合は null。port - サーバーのポートの番数IOException - ソケットの作成時に入出力エラーが発生した場合SecurityException - セキュリティーマネージャーが存在し、その checkConnect メソッドでこの操作が許可されていない場合。UnknownHostException - ホストが不明である場合IllegalArgumentException - port パラメータが指定された有効なポート値の範囲 (0 から 65535) 外である場合。SecurityManager.checkConnect(java.lang.String, int)protected SSLSocket(InetAddress address, int port) throws IOException
セキュリティーマネージャーが存在する場合、その checkConnectメソッドが、ホストアドレスと port を引数に指定して呼び出されます。この結果、SecurityException がスローされることがあります。
address - サーバーのホストport - ポートIOException - ソケットの作成時に入出力エラーが発生した場合SecurityException - セキュリティーマネージャーが存在し、その checkConnect メソッドでこの操作が許可されていない場合。IllegalArgumentException - port パラメータが指定された有効なポート値の範囲 (0 から 65535) 外である場合。NullPointerException - address が null である場合。SecurityManager.checkConnect(java.lang.String, int)protected SSLSocket(String host, int port, InetAddress clientAddress, int clientPort) throws IOException, UnknownHostException
セキュリティーマネージャーが存在する場合、その checkConnectメソッドが、ホストアドレスと port を引数に指定して呼び出されます。この結果、SecurityException がスローされることがあります。
host - 接続先のホストの名前、またはループバックアドレスの場合は null。port - サーバーのポートの番数clientAddress - ソケットのバインド先のクライアントのアドレス、または anyLocal アドレスの場合は null。clientPort - ソケットのバインド先のクライアントのポート、またはシステムで選択された空いているポートの場合は zero。IOException - ソケットの作成時に入出力エラーが発生した場合SecurityException - セキュリティーマネージャーが存在し、その checkConnect メソッドでこの操作が許可されていない場合。UnknownHostException - ホストが不明である場合IllegalArgumentException - port パラメータまたは clientPort パラメータが指定された有効なポート値の範囲 (0 から 65535 まで) にない場合。SecurityManager.checkConnect(java.lang.String, int)protected SSLSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort) throws IOException
セキュリティーマネージャーが存在する場合、その checkConnectメソッドが、ホストアドレスと port を引数に指定して呼び出されます。この結果、SecurityException がスローされることがあります。
address - サーバーのホストport - ポートclientAddress - ソケットのバインド先のクライアントのアドレス、または anyLocal アドレスの場合は null。clientPort - ソケットのバインド先のクライアントのポート、またはシステムで選択された空いているポートの場合は zero。IOException - ソケットの作成時に入出力エラーが発生した場合SecurityException - セキュリティーマネージャーが存在し、その checkConnect メソッドでこの操作が許可されていない場合。IllegalArgumentException - port パラメータまたは clientPort パラメータが指定された有効なポート値の範囲 (0 から 65535 まで) にない場合。NullPointerException - address が null である場合。SecurityManager.checkConnect(java.lang.String, int)public abstract String[] getSupportedCipherSuites()
getEnabledCipherSuites(), setEnabledCipherSuites(String [])public abstract String[] getEnabledCipherSuites()
暗号化方式群は、たとえ有効でも使用されないことがあります。たとえば、ピアが暗号化方式群をサポートしない場合、この暗号化方式群に必要な証明書 (および非公開鍵) を使用することができない場合、または、匿名の暗号化方式群が利用可能であっても認証が要求される場合などです。
getSupportedCipherSuites(), setEnabledCipherSuites(String [])public abstract void setEnabledCipherSuites(String[] suites)
suites パラメータ内の各暗号化方式群は getSupportedCipherSuites() でリストされている必要があります。そうでない場合、このメソッドは失敗します。このメソッドの呼び出しが成功したあと、suites パラメータに示されている暗号化方式群のみが使用可能になります。
なぜ特定の暗号化方式群を接続で使用することができないかについては、getEnabledCipherSuites() を参照してください。
suites - 有効にするすべての暗号化方式群の名前IllegalArgumentException - パラメータで指定された暗号化方式群の 1 つ以上がサポートされていないか、またはパラメータが null である場合。getSupportedCipherSuites(), getEnabledCipherSuites()public abstract String[] getSupportedProtocols()
public abstract String[] getEnabledProtocols()
setEnabledProtocols(String [])public abstract void setEnabledProtocols(String[] protocols)
プロトコルは、getSupportedProtocols() により、サポート対象としてリストされていなければいけません。このメソッドの呼び出しが成功したあと、protocols パラメータに示されているプロトコルのみが使用可能になります。
protocols - 有効にするすべてのプロトコルの名前。IllegalArgumentException - パラメータで指定されたプロトコルの 1 つ以上がサポートされていないか、または protocols パラメータが null である場合。getEnabledProtocols()public abstract SSLSession getSession()
このメソッドは、必要に応じて初期ハンドシェークを開始し、ハンドシェークが確立したときにブロックを解除します。
初期ハンドシェークでエラーが発生すると、無効なセッションオブジェクトが返され、「SSL_NULL_WITH_NULL_NULL」という無効な暗号化方式群が報告されます。
SSLSessionpublic SSLSession getHandshakeSession()
SSLSession を返します。
TLS プロトコルでは、このクラスのインスタンスを使用しているとき、ただし SSLSession が完全に初期化され、getSession によって使用可能になる前に必要なパラメータのネゴシエーションを行う可能性があります。たとえば、有効な署名アルゴリズムのリストによって、TrustManager の決定中に使用できる証明書の種類が制限される可能性があります。または、ネットワーク環境をより適切にサポートするために、最大 TLS フラグメントパケットサイズが変更される場合があります。
このメソッドでは、構築されている SSLSession に早期にアクセスできます。ハンドシェークの進捗状況によっては、一部のデータがまだ使用できない可能性があります。たとえば、リモートサーバーが証明書チェーンを送信しようとしているが、そのチェーンがまだ処理されていない場合、SSLSession の getPeerCertificates メソッドは SSLPeerUnverifiedException をスローします。そのチェーンの処理が完了すると、getPeerCertificates は適切な値を返します。
getSession() とは異なり、このメソッドは最初のハンドシェークを開始せず、ハンドシェークが完了するまでブロックしません。
SSLSession を返します。UnsupportedOperationException - ベースとなるプロバイダがこの操作を実装していない場合。SSLEngine, SSLSession, ExtendedSSLSession, X509ExtendedKeyManager, X509ExtendedTrustManagerpublic abstract void addHandshakeCompletedListener(HandshakeCompletedListener listener)
listener - HandShakeCompleted イベントリスナーIllegalArgumentException - 引数が null である場合。startHandshake(), removeHandshakeCompletedListener(HandshakeCompletedListener)public abstract void removeHandshakeCompletedListener(HandshakeCompletedListener listener)
listener - HandShakeCompleted イベントリスナーIllegalArgumentException - リスナーが登録されていない場合、または引数が null である場合。addHandshakeCompletedListener(HandshakeCompletedListener)public abstract void startHandshake()
throws IOException
すでに接続上に送信されたデータは、このハンドシェークが完了するまではそのままの状態を維持します。ハンドシェークが完了するとイベントから信号を受け取ります。 このメソッドは、接続上の最初のハンドシェークと同時に開始され、ハンドシェークのネゴシエーションが完了すると終了します。既存のソケット上での複数のハンドシェークをサポートしないプロトコルは、IOException をスローします。
IOException - ネットワークレベルのエラーaddHandshakeCompletedListener(HandshakeCompletedListener)public abstract void setUseClientMode(boolean mode)
このメソッドは、すべてのハンドシェークの前に呼び出す必要があります。いったんハンドシェークが開始されると、このソケットの寿命が尽きるまで、現在のモードをリセットすることはできません。
通常、サーバーは自身を認証しますが、クライアントは必ずしもそうとはかぎりません。
mode - ハンドシェークをクライアントモードで開始する場合は trueIllegalArgumentException - 最初のハンドシェークが開始されてからモードを変更しようとした場合。getUseClientMode()public abstract boolean getUseClientMode()
setUseClientMode(boolean)public abstract void setNeedClientAuth(boolean need)
ソケットのクライアント認証設定は、次のいずれかになります。
setWantClientAuth(boolean) と異なり、このオプションが設定されていて、かつクライアント認証情報が提供されない場合は、ネゴシエーションが停止し、接続が切断されます。
このメソッドを呼び出すと、このメソッドまたは setWantClientAuth(boolean) によって行われた以前の設定がすべてオーバーライドされます。
need - クライアント認証が必要な場合は true に、クライアント認証が不要な場合は false に設定される。getNeedClientAuth(), setWantClientAuth(boolean), getWantClientAuth(), setUseClientMode(boolean)public abstract boolean getNeedClientAuth()
setNeedClientAuth(boolean), setWantClientAuth(boolean), getWantClientAuth(), setUseClientMode(boolean)public abstract void setWantClientAuth(boolean want)
ソケットのクライアント認証設定は、次のいずれかになります。
setNeedClientAuth(boolean) とは異なり、このオプションが設定されていて、かつクライアントが自身に関する認証情報を提供しないことを選択した場合でも、ネゴシエーションは続行されます。
このメソッドを呼び出すと、このメソッドまたは setNeedClientAuth(boolean) によって行われた以前の設定がすべてオーバーライドされます。
want - クライアント認証が要求されている場合は true に、クライアント認証が不要な場合は false に設定される。getWantClientAuth(), setNeedClientAuth(boolean), getNeedClientAuth(), setUseClientMode(boolean)public abstract boolean getWantClientAuth()
setNeedClientAuth(boolean), getNeedClientAuth(), setWantClientAuth(boolean), setUseClientMode(boolean)public abstract void setEnableSessionCreation(boolean flag)
flag - セッションを作成できる場合は true (デフォルト)。既存のセッションを再開する場合は falsegetEnableSessionCreation()public abstract boolean getEnableSessionCreation()
setEnableSessionCreation(boolean)public SSLParameters getSSLParameters()
public void setSSLParameters(SSLParameters params)
これは次のことを意味します。
params.getCipherSuites() が null 以外の場合は、その値を使用して setEnabledCipherSuites() が呼び出される
params.getProtocols() が null 以外の場合は、その値を使用して setEnabledProtocols() が呼び出される
params.getNeedClientAuth() または params.getWantClientAuth() が true を返した場合は、それぞれ setNeedClientAuth(true) と setWantClientAuth(true) が呼び出される。それ以外の場合は setWantClientAuth(false) が呼び出される。
params - パラメータIllegalArgumentException - setEnabledCipherSuites() または setEnabledProtocols() の呼び出しが失敗した場合 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.