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からの接続を受け入れます。
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ハンドシェークの完了通知を受け取るためのイベント・リスナーを登録します。
|
String |
getApplicationProtocol() |
この接続でネゴシエートされた最新のアプリケーション・プロトコル値を返します。
|
abstract String[] |
getEnabledCipherSuites() |
この接続で現在使用可能になっているSSL暗号化方式群の名前を返します。
|
abstract String[] |
getEnabledProtocols() |
この接続に対して現在使用可能になっているプロトコルの名前を返します。
|
abstract boolean |
getEnableSessionCreation() |
このソケットで新しいSSLセッションを確立できる場合はtrueを返します。
|
String |
getHandshakeApplicationProtocol() |
現在進行中のSSL/TLSハンドシェイクでネゴシエートされたアプリケーション・プロトコル値を返します。
|
BiFunction<SSLSocket,List<String>,String> |
getHandshakeApplicationProtocolSelector() |
SSL/TLS/DTLSハンドシェイク中にアプリケーション・プロトコル値を選択するコールバック関数を取得します。
|
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セッションを確立できるかどうかを制御します。
|
void |
setHandshakeApplicationProtocolSelector(BiFunction<SSLSocket,List<String>,String> selector) |
SSL/TLS/DTLSハンドシェイクのアプリケーション・プロトコル値を選択するコールバック関数を登録します。
|
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.getServerNames()がnull以外の場合、ソケットはサーバー名をその値で構成する。params.getSNIMatchers()がnull以外の場合、ソケットはSNIマッチャをその値で構成する。params - パラメータIllegalArgumentException - setEnabledCipherSuites()またはsetEnabledProtocols()の呼出しが失敗した場合public String getApplicationProtocol()
基になるSSL/TLS/DTLS実装でサポートされている場合、RFC 7301、アプリケーション層プロトコル・ネゴシエーション(ALPN)などのアプリケーション・ネーム・ネゴシエーション・メカニズムは、ピア間のアプリケーション・レベルの値をネゴシエートできます。
UnsupportedOperationExceptionをスローし、他のアクションを実行しません。String、値が正常にネゴシエートされた場合は空のアプリケーション・プロトコルString。UnsupportedOperationException - ベースとなるプロバイダがこの操作を実装していない場合。public String getHandshakeApplicationProtocol()
getHandshakeSession()と同様に、接続はハンドシェイクの途中にある可能性があります。 アプリケーション・プロトコルはまだ利用可能であるかもしれないし、利用可能でないかもしれません。
UnsupportedOperationExceptionをスローし、他のアクションを実行しません。String、値が正常にネゴシエートされた場合は空ではないアプリケーション・プロトコルString。UnsupportedOperationException - ベースとなるプロバイダがこの操作を実装していない場合。public void setHandshakeApplicationProtocolSelector(BiFunction<SSLSocket,List<String>,String> selector)
SSLParameters.setApplicationProtocolsを使用して指定された値をオーバーライドし、次の型パラメータをサポートします:
たとえば、次の呼び出しは、TLSハンドシェイク・パラメータを調べてアプリケーション・プロトコル名を選択するコールバック関数を登録します:
SSLSocket- 最初の引数は、ハンドシェーク・セッションや構成を含め、現在の
SSLSocketを検査できるようにします。List<String>- 関数の第2引数は、TLSピアによって通知されたアプリケーション・プロトコル名をリストします。
String- 関数の結果はアプリケーションのプロトコル名であり、宣言された名前のどれも受け入れられないことを示すためにはnullです。 戻り値が空の
Stringの場合、アプリケーション・プロトコルの指示は使用されません。 戻り値がnull (値が選択されていない)またはピアによって宣言されていない値である場合、基になるプロトコルは、実行するアクションを決定します。 (たとえば、ALPNは"no_application_protocol"アラートを送信し、接続を終了します。)
serverSocket.setHandshakeApplicationProtocolSelector(
(serverSocket, clientProtocols) -> {
SSLSession session = serverSocket.getHandshakeSession();
return chooseApplicationProtocol(
serverSocket,
clientProtocols,
session.getProtocol(),
session.getCipherSuite());
});
このメソッドは、TLSハンドシェイクが開始される前にTLSサーバー・アプリケーションによって呼び出される必要があります。 また、このSSLSocketは、コールバック関数で選択されたアプリケーション・プロトコルと互換性のあるパラメータで構成する必要があります。 たとえば、暗号スイートの選択肢を誤ると、適切なアプリケーション・プロトコルが得られない可能性があります。 SSLParametersを参照してください。
UnsupportedOperationExceptionをスローし、他のアクションを実行しません。selector - コールバック関数、または登録解除の場合はnull。UnsupportedOperationException - ベースとなるプロバイダがこの操作を実装していない場合。public BiFunction<SSLSocket,List<String>,String> getHandshakeApplicationProtocolSelector()
setHandshakeApplicationProtocolSelectorを参照してください。 UnsupportedOperationExceptionをスローし、他のアクションを実行しません。UnsupportedOperationException - ベースとなるプロバイダがこの操作を実装していない場合。 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。 そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyも参照してください。