001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019 package org.apache.hadoop.security.ssl; 020 021 import org.mortbay.jetty.security.SslSocketConnector; 022 023 import javax.net.ssl.SSLServerSocket; 024 import java.io.IOException; 025 import java.net.ServerSocket; 026 import java.util.ArrayList; 027 028 /** 029 * This subclass of the Jetty SslSocketConnector exists solely to control 030 * the TLS protocol versions allowed. This is fallout from the POODLE 031 * vulnerability (CVE-2014-3566), which requires that SSLv3 be disabled. 032 * Only TLS 1.0 and later protocols are allowed. 033 */ 034 public class SslSocketConnectorSecure extends SslSocketConnector { 035 036 public SslSocketConnectorSecure() { 037 super(); 038 } 039 040 /** 041 * Create a new ServerSocket that will not accept SSLv3 connections, 042 * but will accept TLSv1.x connections. 043 */ 044 protected ServerSocket newServerSocket(String host, int port,int backlog) 045 throws IOException { 046 SSLServerSocket socket = (SSLServerSocket) 047 super.newServerSocket(host, port, backlog); 048 ArrayList<String> nonSSLProtocols = new ArrayList<String>(); 049 for (String p : socket.getEnabledProtocols()) { 050 if (!p.contains("SSLv3")) { 051 nonSSLProtocols.add(p); 052 } 053 } 054 socket.setEnabledProtocols(nonSSLProtocols.toArray( 055 new String[nonSSLProtocols.size()])); 056 return socket; 057 } 058 }