diff --git a/release-log.txt b/release-log.txt
index 2ebc296..6405baf 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -1,5 +1,6 @@
 -- Oozie 4.3.1 release
 
+OOZIE-3171 Revert OOZIE-2771 commit on branch-4.3 (satishsaley)
 OOZIE-2533 Oozie Web UI gives Error 500 with Java 8u91 (asasvari via satishsaley)
 OOZIE-3167 Upgrade tomcat version on Oozie 4.3 branch (satishsaley)
 OOZIE-3161 Spark job failing because of servlet-api-2.5 jar (satishsaley)
@@ -33,7 +34,6 @@
 OOZIE-2790 log4j configuration is not passed to spark executors (satishsaley)
 OOZIE-2787 Oozie distributes application jar twice making the spark job fail (satishsaley)
 OOZIE-2777 Config-default.xml longer than 64k results in java.io.UTFDataFormatException (gezapeti via harsh)
-OOZIE-2771 Allow retrieving keystore and truststore passwords from Hadoop Credential Provider (asasvari via abhishekbafna)
 OOZIE-2748 NPE in LauncherMapper.printArgs() (pbacsko via rkanter)
 OOZIE-2654 Zookeeper dependent services should not depend on Connectionstate to be valid before cleaning up (venkatnrangan via abhishekbafna)
 OOZIE-2690 OOZIE NPE while executing kill() (abhishekbafna via jaydeepvishwakarma)
diff --git a/server/src/main/java/org/apache/oozie/server/SSLServerConnectorFactory.java b/server/src/main/java/org/apache/oozie/server/SSLServerConnectorFactory.java
deleted file mode 100644
index a7253d7..0000000
--- a/server/src/main/java/org/apache/oozie/server/SSLServerConnectorFactory.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.oozie.server;
-
-
-import com.google.common.base.Preconditions;
-import com.google.inject.Inject;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.oozie.service.ConfigurationService;
-import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.server.SecureRequestCustomizer;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.SslConnectionFactory;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Arrays;
-
-/**
- * Factory that is used to configure SSL settings for the Oozie server.
- */
-class SSLServerConnectorFactory {
-    private static final Logger LOG = LoggerFactory.getLogger(SSLServerConnectorFactory.class);
-    public static final String OOZIE_HTTPS_TRUSTSTORE_FILE = "oozie.https.truststore.file";
-    public static final String OOZIE_HTTPS_TRUSTSTORE_PASS = "oozie.https.truststore.pass";
-    public static final String OOZIE_HTTPS_KEYSTORE_PASS = "oozie.https.keystore.pass";
-    public static final String OOZIE_HTTPS_KEYSTORE_FILE = "oozie.https.keystore.file";
-    public static final String OOZIE_HTTPS_EXCLUDE_PROTOCOLS = "oozie.https.exclude.protocols";
-    public static final String OOZIE_HTTPS_INCLUDE_PROTOCOLS = "oozie.https.include.protocols";
-    public static final String OOZIE_HTTPS_INCLUDE_CIPHER_SUITES = "oozie.https.include.cipher.suites";
-    public static final String OOZIE_HTTPS_EXCLUDE_CIPHER_SUITES = "oozie.https.exclude.cipher.suites";
-
-    private SslContextFactory sslContextFactory;
-    private Configuration conf;
-
-    @Inject
-    public SSLServerConnectorFactory(final SslContextFactory sslContextFactory) {
-        this.sslContextFactory = Preconditions.checkNotNull(sslContextFactory,  "sslContextFactory is null");
-    }
-
-    /**
-     *  Construct a ServerConnector object with SSL settings
-     *
-     *  @param oozieHttpsPort Oozie HTTPS port
-     *  @param conf Oozie configuration
-     *  @param server jetty Server which the connector is attached to
-     *
-     *  @return ServerConnector
-    */
-    public ServerConnector createSecureServerConnector(int oozieHttpsPort, Configuration conf, Server server) {
-        this.conf = Preconditions.checkNotNull(conf, "conf is null");
-        Preconditions.checkNotNull(server, "server is null");
-        Preconditions.checkState(oozieHttpsPort >= 1 && oozieHttpsPort <= 65535,
-                String.format("Invalid port number specified: \'%d\'. It should be between 1 and 65535.", oozieHttpsPort));
-
-        setIncludeProtocols();
-        setExcludeProtocols();
-
-        setIncludeCipherSuites();
-        setExludeCipherSuites();
-
-        setTrustStorePath();
-        setTrustStorePass();
-
-        setKeyStoreFile();
-        setKeystorePass();
-
-        HttpConfiguration httpsConfiguration = getHttpsConfiguration();
-        ServerConnector secureServerConnector = new ServerConnector(server,
-                new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
-                new HttpConnectionFactory(httpsConfiguration));
-
-        secureServerConnector.setPort(oozieHttpsPort);
-
-        LOG.info(String.format("Secure server connector created, listenning on port %d", oozieHttpsPort));
-        return secureServerConnector;
-    }
-
-    private void setExludeCipherSuites() {
-        String excludeCipherList = conf.get(OOZIE_HTTPS_EXCLUDE_CIPHER_SUITES);
-        String[] excludeCipherSuites = excludeCipherList.split(",");
-        sslContextFactory.setExcludeCipherSuites(excludeCipherSuites);
-
-        LOG.info(String.format("SSL context - excluding cipher suites: %s", Arrays.toString(excludeCipherSuites)));
-    }
-
-    private void setIncludeCipherSuites() {
-        String includeCipherList = conf.get(OOZIE_HTTPS_INCLUDE_CIPHER_SUITES);
-        if (includeCipherList == null || includeCipherList.isEmpty()) {
-            return;
-        }
-
-        String[] includeCipherSuites = includeCipherList.split(",");
-        sslContextFactory.setIncludeCipherSuites(includeCipherSuites);
-
-        LOG.info(String.format("SSL context - including cipher suites: %s", Arrays.toString(includeCipherSuites)));
-    }
-
-    private void setIncludeProtocols() {
-        String enabledProtocolsList = conf.get(OOZIE_HTTPS_INCLUDE_PROTOCOLS);
-        String[] enabledProtocols = enabledProtocolsList.split(",");
-        sslContextFactory.setIncludeProtocols(enabledProtocols);
-
-        LOG.info(String.format("SSL context - including protocols: %s", Arrays.toString(enabledProtocols)));
-    }
-
-    private void setExcludeProtocols() {
-        String excludedProtocolsList = conf.get(OOZIE_HTTPS_EXCLUDE_PROTOCOLS);
-        if (excludedProtocolsList == null || excludedProtocolsList.isEmpty()) {
-            return;
-        }
-        String[] excludedProtocols = excludedProtocolsList.split(",");
-        sslContextFactory.setExcludeProtocols(excludedProtocols);
-        LOG.info(String.format("SSL context - excluding protocols: %s", Arrays.toString(excludedProtocols)));
-    }
-
-    private void setTrustStorePath() {
-        String trustStorePath = conf.get(OOZIE_HTTPS_TRUSTSTORE_FILE);
-        Preconditions.checkNotNull(trustStorePath, "trustStorePath is null");
-        sslContextFactory.setTrustStorePath(trustStorePath);
-    }
-
-    private void setTrustStorePass() {
-        String trustStorePass = ConfigurationService.getPassword(conf, OOZIE_HTTPS_TRUSTSTORE_PASS).trim();
-        Preconditions.checkNotNull(trustStorePass, "setTrustStorePass is null");
-        sslContextFactory.setTrustStorePassword(trustStorePass);
-    }
-
-    private void setKeystorePass() {
-        String keystorePass = ConfigurationService.getPassword(conf, OOZIE_HTTPS_KEYSTORE_PASS).trim();
-        Preconditions.checkNotNull(keystorePass, "keystorePass is null");
-        sslContextFactory.setKeyManagerPassword(keystorePass);
-    }
-
-    private void setKeyStoreFile() {
-        String keystoreFile = conf.get(OOZIE_HTTPS_KEYSTORE_FILE);
-        Preconditions.checkNotNull(keystoreFile, "keystoreFile is null");
-        sslContextFactory.setKeyStorePath(keystoreFile);
-    }
-
-    private HttpConfiguration getHttpsConfiguration() {
-        HttpConfiguration https = new HttpConfigurationWrapper(conf).getDefaultHttpConfiguration();
-        https.setSecureScheme("https");
-        https.addCustomizer(new SecureRequestCustomizer());
-        return https;
-    }
-}
