diff --git a/protocols/openflow/ctl/BUCK b/protocols/openflow/ctl/BUCK
index 26a6a58..9b68ba9 100644
--- a/protocols/openflow/ctl/BUCK
+++ b/protocols/openflow/ctl/BUCK
@@ -9,6 +9,7 @@
     '//lib:netty-handler',
     '//lib:netty-transport',
     '//lib:netty-transport-native-epoll',
+    '//lib:JACKSON',
 ]
 
 TEST_DEPS = [
diff --git a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/config/OpenFlowDeviceConfig.java b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/config/OpenFlowDeviceConfig.java
new file mode 100644
index 0000000..148860a
--- /dev/null
+++ b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/config/OpenFlowDeviceConfig.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.openflow.config;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.config.Config;
+
+import java.util.Optional;
+
+/**
+ * Configuration for OpenFlow devices.
+ */
+@Beta
+public class OpenFlowDeviceConfig extends Config<DeviceId> {
+
+    /**
+     * netcfg ConfigKey.
+     */
+    public static final String CONFIG_KEY = "openflow";
+
+    public static final String CLIENT_KEY_ALIAS = "keyAlias";
+
+    @Override
+    public boolean isValid() {
+        return hasOnlyFields(CLIENT_KEY_ALIAS);
+    }
+
+    /**
+     * Gets the certFile for the switch.
+     *
+     * @return cert file
+     */
+    public Optional<String> keyAlias() {
+        String keyAlias = get(CLIENT_KEY_ALIAS, "");
+        return (keyAlias.isEmpty() ? Optional.empty() : Optional.ofNullable(keyAlias));
+    }
+
+    /**
+     * Sets the key alias for the Device.
+     *
+     * @param keyAlias key alias as string
+     * @return instance for chaining
+     */
+    public OpenFlowDeviceConfig setKeyAlias(String keyAlias) {
+        return (OpenFlowDeviceConfig) setOrClear(CLIENT_KEY_ALIAS, keyAlias);
+    }
+}
diff --git a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/config/package-info.java b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/config/package-info.java
new file mode 100644
index 0000000..f746d88
--- /dev/null
+++ b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/config/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.
+ */
+
+/**
+ * Implementation of the OpenFlow controller IO subsystem.
+ */
+package org.onosproject.openflow.config;
diff --git a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/Controller.java b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/Controller.java
index 324e06d..6122e63 100644
--- a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/Controller.java
+++ b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/Controller.java
@@ -30,10 +30,12 @@
 import io.netty.util.concurrent.GlobalEventExecutor;
 import org.onlab.util.ItemNotFoundException;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.driver.DefaultDriverData;
 import org.onosproject.net.driver.DefaultDriverHandler;
 import org.onosproject.net.driver.Driver;
 import org.onosproject.net.driver.DriverService;
+import org.onosproject.openflow.config.OpenFlowDeviceConfig;
 import org.onosproject.openflow.controller.Dpid;
 import org.onosproject.openflow.controller.driver.OpenFlowAgent;
 import org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver;
@@ -54,11 +56,14 @@
 import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
 import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
 import java.security.cert.CertificateException;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -99,12 +104,14 @@
     protected char[] ksPwd;
     protected char[] tsPwd;
     protected SSLContext sslContext;
+    protected KeyStore keyStore;
 
     // Perf. related configuration
     protected static final int SEND_BUFFER_SIZE = 4 * 1024 * 1024;
 
     private DriverService driverService;
     private boolean enableOfTls = TLS_DISABLED;
+    private NetworkConfigRegistry netCfgService;
 
     // **************
     // Initialization
@@ -241,9 +248,9 @@
             tmFactory.init(ts);
 
             KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
-            KeyStore ks = KeyStore.getInstance("JKS");
-            ks.load(new FileInputStream(ksLocation), ksPwd);
-            kmf.init(ks, ksPwd);
+            keyStore = KeyStore.getInstance("JKS");
+            keyStore.load(new FileInputStream(ksLocation), ksPwd);
+            kmf.init(keyStore, ksPwd);
 
             sslContext = SSLContext.getInstance("TLS");
             sslContext.init(kmf.getKeyManagers(), tmFactory.getTrustManagers(), null);
@@ -275,6 +282,36 @@
         return (this.systemStartTime);
     }
 
+    public boolean isValidCertificate(Long dpid, Certificate peerCert) {
+        if (netCfgService == null) {
+            // netcfg service not available; accept any cert
+            return true;
+        }
+
+        DeviceId deviceId = DeviceId.deviceId(Dpid.uri(new Dpid(dpid)));
+        OpenFlowDeviceConfig config =
+                netCfgService.getConfig(deviceId, OpenFlowDeviceConfig.class);
+        if (config == null) {
+            // Config not set for device, accept any certificate
+            return true;
+        }
+
+        Optional<String> alias = config.keyAlias();
+        if (!alias.isPresent()) {
+            // Config for device does not specify a certificate chain, accept any cert
+            return true;
+        }
+
+        try {
+            Certificate configuredCert = keyStore.getCertificate(alias.get());
+            //FIXME there's probably a better way to compare these
+            return Objects.deepEquals(peerCert, configuredCert);
+        } catch (KeyStoreException e) {
+            log.info("failed to load key", e);
+        }
+        return false;
+    }
+
     /**
      * Forward to the driver-manager to get an IOFSwitch instance.
      *
@@ -317,10 +354,17 @@
         return ofSwitchDriver;
     }
 
+    @Deprecated
     public void start(OpenFlowAgent ag, DriverService driverService) {
+        start(ag, driverService, null);
+    }
+
+    public void start(OpenFlowAgent ag, DriverService driverService,
+                      NetworkConfigRegistry netCfgService) {
         log.info("Starting OpenFlow IO");
         this.agent = ag;
         this.driverService = driverService;
+        this.netCfgService = netCfgService;
         this.init();
         this.run();
     }
diff --git a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFChannelHandler.java b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFChannelHandler.java
index ac046d9..55ea65e 100644
--- a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFChannelHandler.java
+++ b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFChannelHandler.java
@@ -22,6 +22,7 @@
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.nio.channels.ClosedChannelException;
+import java.security.cert.Certificate;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -36,6 +37,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.RejectedExecutionException;
+
 import org.onlab.packet.IpAddress;
 import org.onosproject.openflow.controller.Dpid;
 import org.onosproject.openflow.controller.OpenFlowSession;
@@ -86,10 +88,13 @@
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
+import io.netty.handler.ssl.SslHandler;
 import io.netty.handler.timeout.IdleStateEvent;
 import io.netty.handler.timeout.ReadTimeoutException;
 import io.netty.util.ReferenceCountUtil;
 
+import javax.net.ssl.SSLPeerUnverifiedException;
+
 /**
  * Channel handler deals with the switch connection and dispatches
  * switch messages to the appropriate locations.
@@ -310,9 +315,15 @@
          */
         WAIT_FEATURES_REPLY(false) {
             @Override
-            void processOFFeaturesReply(OFChannelHandler h, OFFeaturesReply  m)
+            void processOFFeaturesReply(OFChannelHandler h, OFFeaturesReply m)
                     throws IOException {
-                h.thisdpid = m.getDatapathId().getLong();
+                Long dpid = m.getDatapathId().getLong();
+                if (!h.setDpid(dpid, h.channel)) {
+                    log.error("Switch presented invalid certificate for dpid {}. Disconnecting",
+                            dpid);
+                    h.channel.disconnect();
+                    return;
+                }
                 log.debug("Received features reply for switch at {} with dpid {}",
                         h.getSwitchInfoString(), h.thisdpid);
 
@@ -1505,6 +1516,25 @@
         this.lastStateChange = System.currentTimeMillis();
     }
 
+    private boolean setDpid(Long dpid, Channel channel) {
+        ChannelHandlerContext sslContext = channel.pipeline().context(SslHandler.class);
+        if (sslContext != null) {
+            try {
+                SslHandler sslHandler = (SslHandler) sslContext.handler();
+                Certificate[] certs = sslHandler.engine().getSession().getPeerCertificates();
+                Certificate cert = certs.length > 0 ? certs[0] : null;
+                if (!controller.isValidCertificate(dpid, cert)) {
+                    return false;
+                }
+            } catch (SSLPeerUnverifiedException e) {
+                log.info("Switch with dpid {} is an unverified SSL peer.", dpid, e);
+                return false;
+            }
+        }
+        this.thisdpid = dpid;
+        return true;
+    }
+
     /**
      * Send hello message to the switch using the handshake transactions ids.
      * @throws IOException
diff --git a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
index ab7009f..9113e5c 100644
--- a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
+++ b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
@@ -28,7 +28,12 @@
 import org.apache.felix.scr.annotations.Service;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.CoreService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.config.ConfigFactory;
+import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.driver.DriverService;
+import org.onosproject.openflow.config.OpenFlowDeviceConfig;
 import org.onosproject.openflow.controller.DefaultOpenFlowPacketContext;
 import org.onosproject.openflow.controller.Dpid;
 import org.onosproject.openflow.controller.OpenFlowController;
@@ -107,6 +112,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ComponentConfigService cfgService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigRegistry netCfgService;
+
     @Property(name = "openflowPorts", value = DEFAULT_OFPORT,
             label = "Port numbers (comma separated) used by OpenFlow protocol; default is 6633,6653")
     private String openflowPorts = DEFAULT_OFPORT;
@@ -173,14 +181,25 @@
     protected Multimap<Dpid, OFQueueStatsEntry> fullQueueStats =
             ArrayListMultimap.create();
 
+    protected final ConfigFactory factory =
+            new ConfigFactory<DeviceId, OpenFlowDeviceConfig>(
+                    SubjectFactories.DEVICE_SUBJECT_FACTORY,
+                    OpenFlowDeviceConfig.class, OpenFlowDeviceConfig.CONFIG_KEY) {
+                @Override
+                public OpenFlowDeviceConfig createConfig() {
+                    return new OpenFlowDeviceConfig();
+                }
+            };
+
     private final Controller ctrl = new Controller();
 
     @Activate
     public void activate(ComponentContext context) {
         coreService.registerApplication(APP_ID, this::cleanup);
         cfgService.registerProperties(getClass());
+        netCfgService.registerConfigFactory(factory);
         ctrl.setConfigParams(context.getProperties());
-        ctrl.start(agent, driverService);
+        ctrl.start(agent, driverService, netCfgService);
     }
 
     private void cleanup() {
@@ -197,13 +216,14 @@
     public void deactivate() {
         cleanup();
         cfgService.unregisterProperties(getClass(), false);
+        netCfgService.unregisterConfigFactory(factory);
     }
 
     @Modified
     public void modified(ComponentContext context) {
         ctrl.stop();
         ctrl.setConfigParams(context.getProperties());
-        ctrl.start(agent, driverService);
+        ctrl.start(agent, driverService, netCfgService);
     }
 
     @Override
diff --git a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImplTest.java b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImplTest.java
index f3f7769..16fea6b 100644
--- a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImplTest.java
+++ b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImplTest.java
@@ -32,6 +32,7 @@
 import org.junit.Test;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.CoreService;
+import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.openflow.OpenflowSwitchDriverAdapter;
 import org.onosproject.openflow.controller.Dpid;
 import org.onosproject.openflow.controller.OpenFlowSwitch;
@@ -149,6 +150,9 @@
         controller.cfgService = mockConfigService;
         replay(mockConfigService);
 
+        NetworkConfigRegistry netConfigService = EasyMock.createMock(NetworkConfigRegistry.class);
+        controller.netCfgService = netConfigService;
+
         ComponentContext mockContext = EasyMock.createMock(ComponentContext.class);
         Dictionary<String, Object> properties = new Hashtable<>();
         properties.put("openflowPorts",
