ONOS与OVS间设置SSL安全连接

作者简介:张泽阳,2016年7月至今,北京邮电大学未来网络理论与应用实验室保送研究生。

SSL(Secure Sockets Layer)是为网络通信提供安全性的协议,我们可以使用SSL来保证OpenFlow传输通道的安全。本篇文章主要介绍ONOS控制器与OVS(Open vSwitch)交换机之间使用自签名证书进行SSL连接(这是实现SSL的一种较为简便的方式 )的配置过程。这部分内容在ONOS的官方Wiki上有介绍,但是其内容不是很细致,有一些需要特别注意的步骤没有进行强调,有的命令也漏掉了一些选项设置,导致我花了好长时间才配置好。所以写这篇文章,是想让大家照着流程做就一定能成功。如果对这方面有什么问题,欢迎与我交流。

以下步骤中的ONOS端与OVS端可以是两台不同的机器,也可以是相同的机器(为了实验方便),本文以两台不同的虚拟机为例。

一、配置步骤

1.1 生成ONOS端的自签名证书

在ONOS端新建一个文件夹(本文称作SSL文件夹)用来存储本实验中的所有相关文件,在SSL文件夹下使用keytool工具生成一个自签名的证书库onos.jks(包含私钥与公钥证书信息):

其中storepass(至少6个字符)应该牢记,各种信息随便填。

请注意:在输入的主密码时一定要直接敲回车(即的主密码一定要和keystore密码相同,否则在测试时ONOS端会出现"SSL init failed: Cannot recover key"错误)。

将onos.jks经过两步转换为onos.pem文件:onos.jks→onos.p12→onos.pem

onos.pem的内容大概是这样的:

接下来我们需要新建一个叫做cacert.pem的文件用来给OVS使用,它的内容是onos.pem的证书部分,即从中间的"Bag Attributes"到最后的部分:

请注意:两个中间文件onos.p12和onos.pem已经没有用了,安全起见应该被删除。

1.2 将ONOS的证书复制到OVS端

把cacert.pem复制到OVS端的/var/lib/openvswitch/pki/controllerca目录下(该目录中可能已经有了一个名为cacert.pem的文件,可先将其备份一下),此目录用来存放OVS信任的证书授权机构的证书。

1.3 生成OVS端的自签名证书并配置OVS端的SSL

进入OVS端的/etc/openvswitch目录,使用自己的pki请求和签署一个数字证书,生成OVS的私钥文件sc-privkey.pem和公钥证书sc-cert.pem:

开启OVS服务,使用ovs-vsctl set-ssl设置OVS端的SSL(配置OVS的私钥文件、OVS的证书文件和ONOS的证书文件的位置):

1.4 将OVS的证书复制到ONOS端并配置ONOS端的SSL

把OVS端的sc-cert.pem复制到ONOS端的SSL文件夹中,然后在ONOS端使用keytool -importcert将sc-cert.pem导入到ONOS的证书库onos.jks中:

使用下面的命令查看证书库的内容,可以发现证书库已经包含有了PrivateKeyEntry和trustedCertEntry。

下面一步是设置相关的环境变量。ONOS的Wiki上给出的方法是将命令加入$ONOS_HOME/tools/package/bin/onos-service,但是我试了之后发现并没有用。其实直接在终端里export以下就行了,如下(注意写出onos.jks的绝对路径,保证Password正确):

若要使ONOS每次开启时都进入SSL模式,可以将这个命令写入.profile之类的文件。

这样,ONOS端的SSL就配置完成了。

二、进行测试

使用onos-karaf clean开启ONOS端的ONOS系统,启动后在ONOS的日志里会看到以下记录,说明ONOS已经进入了SSL模式。

在OVS端启动OVS服务,新建一个网桥并使用SSL方式链接到ONOS控制器:

这时在ONOS端使用devices命令,会发现OVS已经成功连接到了ONOS控制器:

也可以使用mininet连接控制器,需要注意只有为每个交换机正确打开SSL连接后才能连接成功。

大家可以在此基础上做一些实验,如试一试在两端证书不匹配的情况下进行连接会发生什么,以此来验证SSL连接的安全性。也可以进行抓包分析,来验证SSL的加密传输特性。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。
  • 本文链接http://www.sdnlab.com/17969.html
分享到:
相关文章
14条评论

登录后才可以评论

  1. comment reply hautky 2016/10/24 14:11
    您好,我按照教程中的步骤设置出现了点问题,当我开启ONOS端的ONOS系统后,日志如下:
        1楼
  2. comment reply hautky 2016/10/24 14:13
    您好,我按照教程中的步骤设置出现了点问题,当我开启ONOS端的ONOS系统后,日志如下: 2016-10-24 14:08:23,535 | INFO | ew I/O worker #6 | OFChannelHandler | 182 - org.onosproject.onos-of-ctl - 1.8.0.SNAPSHOT | New switch connection from /100.7.8.68:45136 2016-10-24 14:08:23,536 | ERROR | ew I/O worker #6 | OFChannelHandler | 182 - org.onosproject.onos-of-ctl - 1.8.0.SNAPSHOT | Error while processing message from switch [/100.7.8.68:45136 DPID[?]]state WAIT_HELLO java.lang.IllegalArgumentException: Unknown wire version: 22 at org.projectfloodlight.openflow.protocol.OFFactories$GenericReader.readFrom(OFFactories.java:72)[180:org.onosproject.openflowj:0.9.6.onos] at org.projectfloodlight.openflow.protocol.OFFactories$GenericReader.readFrom(OFFactories.java:49)[180:org.onosproject.openflowj:0.9.6.onos] at org.onosproject.openflow.controller.impl.OFMessageDecoder.decode(OFMessageDecoder.java:50)[182:org.onosproject.onos-of-ctl:1.8.0.SNAPSHOT] at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:425)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)[44:org.jboss.netty:3.10.5.Final] at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)[44:org.jboss.netty:3.10.5.Final] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_45] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_45] at java.lang.Thread.run(Thread.java:745)[:1.8.0_45] 2016-10-24 14:08:23,538 | INFO | ew I/O worker #6 | OFChannelHandler | 182 - org.onosproject.onos-of-ctl - 1.8.0.SNAPSHOT | Switch disconnected callback for sw:[/100.7.8.68:45136 DPID[?]]. Cleaning up ... 2016-10-24 14:08:23,538 | WARN | ew I/O worker #6 | OFChannelHandler | 182 - org.onosproject.onos-of-ctl - 1.8.0.SNAPSHOT | no dpid in channelHandler registered for disconnected switch [/100.7.8.68:45136 DPID[?]] 与你的设置唯一不同的地方就是:OVS端的/var/lib/openvswitch/pki/controllerca目录不存在,我是通过ovs-pki init --force后才出现的这个目录。
        2楼
  3. comment reply 要炼成金子 2016/10/24 14:35
    @hautky 这个情况应该是OVS端开启了SSL而ONOS端没有开启,您可以看看ONOS启动后的日志中显示的是OpenFlow Security is enabled还是OpenFlow Security is disabled,再看看EXTRA_JAVA_OPTS是否正确设置
        3楼
  4. comment reply hautky 2016/10/24 15:41
    @要炼成金子 EXTRA_JAVA_OPTS没问题,但OpenFlow Security is disabled,大神,这个应该怎么处理啊?
        4楼
  5. comment reply 要炼成金子 2016/10/24 16:03
    @hautky 这个情况我也没遇到过唉,你看看这个wiki:https://wiki.onosproject.org/pages/viewpage.action?pageId=6358090 如果用JAVA_OPTS呢?
        5楼
  6. comment reply hautky 2016/10/27 17:55
    @要炼成金子 重新搞了一下onos的环境,按照你说的,又来一遍。连接上了,谢谢!!!我还有个疑问,假如我的另一台的ovs机器也想与这个onos连接,这时候应该怎么配置?好像ONOS的证书库onos.jks并不能再继续导入来自其他机器的sc-cert.pem了。
        6楼
  7. comment reply hautky 2016/10/27 18:09
    @要炼成金子 哦,知道了,复制sc-prikey和sc-cert到新的机器上
        7楼
  8. comment reply 要炼成金子 2016/10/27 18:45
    @hautky 这也是一种方法,但是由于要复制出交换机的私钥,实际上不是很安全。你可以看一下这篇文章:http://openvswitch.org/support/dist-docs/INSTALL.SSL.md.html,里面描述了一种比较安全的SSL实现方法:SWITCH KEY GENERATION WITH A SWITCH PKI(通过一台既非控制器也非交换机的机器为控制器/交换机的证书签名),实际上是建立了一个自己的证书授权机构。
        8楼
  9. comment reply hautky 2016/10/28 16:29
    @要炼成金子 嗯,好的,谢谢。还个疑问,本来已经连接成功的onos和ovs,我为了写文档,把两台机器上原来生成的所有的密钥和证书全部删除,然后在这两台机器上,按照这个文档再重新做了一遍,包括在ovs上执行ovs-pki init --force ,又出现了OpenFlow Security is disabled,请问这是什么原因导致的?
        9楼
  10. comment reply 要炼成金子 2016/10/28 17:04
    @hautky 我感觉不同版本的ONOS和OVS设置方法可能会稍不一样?我使用的是ONOS1.7和OVS2.6版本。这个设置过程就是比较复杂。我也经历了几次第一次配置成功了,第二次照着记录做竟然不成功的事件,但最后都找到了问题所在。除了echo一下来检查本终端中的环境变量的配置外,还需要注意命令执行的循序、命令的那些选项设置与否都有可能影响最后的结果,最好是理解每一个命令其不同选项的作用。
        10楼
  11. comment reply hautky 2016/10/31 10:06
    @要炼成金子 好像找到原因了,https://groups.google.com/a/onosproject.org/d/msg/onos-dev/CHCwyRNctHM/mz6CRvUbBQAJ 这个帖子里说的-DenableOFTLS -Djavax.net.ssl.keyStore=/home/admin/keys/onos.jks -Djavax.net.ssl.keyStorePassword=222222 -Djavax.net.ssl.trustStore=/home/admin/keys/onos.jks -Djavax.net.ssl.trustStorePassword=222222,我ps aux的时候并没有发现类似的内容,是不是说明我的export EXTRA_JAVA_OPTS并未起作用?但我的echo $EXTRA_JAVA_OPTS的时候,是可以看到设置的内容,请问你知道这是为什么吗?
        11楼
  12. comment reply 要炼成金子 2016/10/31 11:18
    @hautky 我不知道他在这里提到ps aux是什么意思。您可以描述一下如果设置成功的话,使用ps aux会出现什么样的内容,然后我可以验证一下(也许是用ps e列出环境变量?)。
        12楼
  13. comment reply hautky 2016/10/31 13:23
    @要炼成金子 可以了,把export EXTRA_JAVA_OPTS写到了/etc/profile里,重新了下虚拟机,再启动ONOS就可以,谢谢
        13楼
  14. comment reply hautky 2017/01/05 16:24
    你好,请问pssl连接怎么配置你知道吗?能否说一下?
        14楼
要炼成金子 发表于16-10-18
3