4.3. SSL/TLS プロトコルのバージョン

概要

Apache CXF がサポートする SSL/TLS プロトコルのバージョンは、設定された特定の JSSE プロバイダー によって異なります。デフォルトでは、JSSE プロバイダーは SUN の JSSE プロバイダー実装に設定されます。

警告

SSL/TLS セキュリティーを有効にする場合は、Poodle 脆弱性 (CVE-2014-3566) に対して保護するために、SSLv3 プロトコルを明示的に無効にする必要があります。詳細は、Disabling SSLv3 in JBoss Fuse 6.x and JBoss A-MQ 6.x を参照してください。

SunJSSE でサポートされる SSL/TLS プロトコルバージョン

表4.2「SUN の JSSE プロバイダーがサポートする SSL/TLS プロトコル」 は、SUN の JSSE プロバイダーがサポートする SSL/TLS プロトコルバージョンを示しています。

表4.2 SUN の JSSE プロバイダーがサポートする SSL/TLS プロトコル

Protocol説明

SSLv2Hello

使用しないでください !(POODLE セキュリティー脆弱性)

SSLv3

使用しないでください !(POODLE セキュリティー脆弱性)

TLSv1

TLS バージョン 1 をサポートします。

TLSv1.1

TLS バージョン 1.1 (JDK 7 以降) をサポートします。

TLSv1.2

TLS バージョン 1.2 (JDK 7 以降) をサポートします。

特定の SSL/TLS プロトコルバージョンの除外

デフォルトでは、JSSE プロバイダーによって提供される SSL/TLS プロトコルはすべて、CXF エンドポイントで利用できます (ただし、SSLv2Hello および SSLv3 プロトコルは除きます。これらは、Poodle の脆弱性 (CVE-2014-3566) が原因で、Fuse バージョン 6.2.0 以降、CXF ラインタイムによって明確に除外されています)。

特定の SSL/TLS プロトコルを除外するには、エンドポイント設定で sec:excludeProtocols 要素を使用します。sec:excludeProtocols 要素を httpj:tlsServerParameters 要素の子として設定できます (サーバーサイド)。

TLS バージョン 1.2 以外のすべてのプロトコルを除外するには、以下のように sec:excludeProtocols 要素を設定します (JDK 7 以降を使用していることを前提とします)。

<?xml version="1.0" encoding="UTF-8"?>
<beans ... >
  ...
  <httpj:engine-factory bus="cxf">
    <httpj:engine port="9001">
      ...
      <httpj:tlsServerParameters>
        ...
        <sec:excludeProtocols>
          <sec:excludeProtocol>SSLv2Hello</sec:excludeProtocol>
          <sec:excludeProtocol>SSLv3</sec:excludeProtocol>
          <sec:excludeProtocol>TLSv1</sec:excludeProtocol>
          <sec:excludeProtocol>TLSv1.1</sec:excludeProtocol>
        </sec:excludeProtocols>
      </httpj:tlsServerParameters>
    </httpj:engine>
  </httpj:engine-factory>
  ...
</beans>
重要

Poodle の脆弱性 (CVE-2014-3566) から保護するには、常に SSLv2Hello および SSLv3 プロトコルを除外することを推奨します。

secureSocketProtocol 属性

http:tlsClientParameters 要素と httpj:tlsServerParameters 要素の両方が secureSocketProtocol 属性をサポートするため、特定のプロトコルを指定できます。

この属性のセマンティクスは混乱しますが、この属性は指定のプロトコルをサポートする SSL プロバイダーを選択するよう CXF を強制的に実行しますが、プロバイダーが指定されたプロトコルのみを使用するように制限されません。そのため、エンドポイントは指定されたプロトコルとは異なるプロトコルを使用して終了します。このため、コードで secureSocketProtocol 属性を 使用しない ことが推奨されます。