Return-Path: X-Original-To: apmail-hadoop-hdfs-commits-archive@minotaur.apache.org Delivered-To: apmail-hadoop-hdfs-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 92AE8D17C for ; Wed, 19 Sep 2012 17:40:32 +0000 (UTC) Received: (qmail 58239 invoked by uid 500); 19 Sep 2012 17:40:32 -0000 Delivered-To: apmail-hadoop-hdfs-commits-archive@hadoop.apache.org Received: (qmail 58163 invoked by uid 500); 19 Sep 2012 17:40:31 -0000 Mailing-List: contact hdfs-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: hdfs-dev@hadoop.apache.org Delivered-To: mailing list hdfs-commits@hadoop.apache.org Received: (qmail 58153 invoked by uid 99); 19 Sep 2012 17:40:31 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 19 Sep 2012 17:40:31 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 19 Sep 2012 17:40:30 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 3369523888EA; Wed, 19 Sep 2012 17:39:47 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1387688 - in /hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs: CHANGES.txt src/main/java/org/apache/hadoop/hdfs/server/datanode/SecureDataNodeStarter.java Date: Wed, 19 Sep 2012 17:39:47 -0000 To: hdfs-commits@hadoop.apache.org From: tucu@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120919173947.3369523888EA@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: tucu Date: Wed Sep 19 17:39:46 2012 New Revision: 1387688 URL: http://svn.apache.org/viewvc?rev=1387688&view=rev Log: HDFS-3951. datanode web ui does not work over HTTPS when datanode is started in secure mode. (tucu) Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/SecureDataNodeStarter.java Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1387688&r1=1387687&r2=1387688&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Wed Sep 19 17:39:46 2012 @@ -246,6 +246,8 @@ Release 2.0.3-alpha - Unreleased HDFS-3936. MiniDFSCluster shutdown races with BlocksMap usage. (eli) + HDFS-3951. datanode web ui does not work over HTTPS when datanode is started in secure mode. (tucu) + Release 2.0.2-alpha - 2012-09-07 INCOMPATIBLE CHANGES Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/SecureDataNodeStarter.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/SecureDataNodeStarter.java?rev=1387688&r1=1387687&r2=1387688&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/SecureDataNodeStarter.java (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/SecureDataNodeStarter.java Wed Sep 19 17:39:46 2012 @@ -16,9 +16,11 @@ */ package org.apache.hadoop.hdfs.server.datanode; +import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.channels.ServerSocketChannel; +import java.security.GeneralSecurityException; import org.apache.commons.daemon.Daemon; import org.apache.commons.daemon.DaemonContext; @@ -26,9 +28,15 @@ import org.apache.hadoop.conf.Configurat import org.apache.hadoop.hdfs.DFSConfigKeys; import org.apache.hadoop.hdfs.server.common.HdfsServerConstants; +import org.apache.hadoop.http.HttpConfig; import org.apache.hadoop.http.HttpServer; import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hadoop.security.ssl.SSLFactory; +import org.mortbay.jetty.Connector; import org.mortbay.jetty.nio.SelectChannelConnector; +import org.mortbay.jetty.security.SslSocketConnector; + +import javax.net.ssl.SSLServerSocketFactory; /** * Utility class to start a datanode in a secure cluster, first obtaining @@ -40,9 +48,9 @@ public class SecureDataNodeStarter imple */ public static class SecureResources { private final ServerSocket streamingSocket; - private final SelectChannelConnector listener; + private final Connector listener; public SecureResources(ServerSocket streamingSocket, - SelectChannelConnector listener) { + Connector listener) { this.streamingSocket = streamingSocket; this.listener = listener; @@ -50,12 +58,13 @@ public class SecureDataNodeStarter imple public ServerSocket getStreamingSocket() { return streamingSocket; } - public SelectChannelConnector getListener() { return listener; } + public Connector getListener() { return listener; } } private String [] args; private SecureResources resources; - + private SSLFactory sslFactory; + @Override public void init(DaemonContext context) throws Exception { System.err.println("Initializing secure datanode resources"); @@ -80,13 +89,30 @@ public class SecureDataNodeStarter imple } // Obtain secure listener for web server - SelectChannelConnector listener = - (SelectChannelConnector)HttpServer.createDefaultChannelConnector(); + Connector listener; + if (HttpConfig.isSecure()) { + sslFactory = new SSLFactory(SSLFactory.Mode.SERVER, conf); + try { + sslFactory.init(); + } catch (GeneralSecurityException ex) { + throw new IOException(ex); + } + SslSocketConnector sslListener = new SslSocketConnector() { + @Override + protected SSLServerSocketFactory createFactory() throws Exception { + return sslFactory.createSSLServerSocketFactory(); + } + }; + listener = sslListener; + } else { + listener = HttpServer.createDefaultChannelConnector(); + } + InetSocketAddress infoSocAddr = DataNode.getInfoAddr(conf); listener.setHost(infoSocAddr.getHostName()); listener.setPort(infoSocAddr.getPort()); // Open listener here in order to bind to port as root - listener.open(); + listener.open(); if (listener.getPort() != infoSocAddr.getPort()) { throw new RuntimeException("Unable to bind on specified info port in secure " + "context. Needed " + streamingAddr.getPort() + ", got " + ss.getLocalPort()); @@ -109,6 +135,9 @@ public class SecureDataNodeStarter imple DataNode.secureMain(args, resources); } - @Override public void destroy() { /* Nothing to do */ } + @Override public void destroy() { + sslFactory.destroy(); + } + @Override public void stop() throws Exception { /* Nothing to do */ } }