ROS1中rosbridge使用rosauth认证连接

0 前言

机器人和管理平台之间通讯使用了rosbridge的websocket为了要把ROS1的机器人长时间运行的安全性,保证机器人不被恶意控制,需要增加一些安全措施,比如认证,或者防火墙一类。这里只讲认证方式。因为作者不会javascript,所以只是摸索如何发送json给rosbridge来实现认证的通讯。

1 rosbridge

因为我们用的是ros1,所以源码请看https://github.com/RobotWebTools/rosbridge_suite/tree/ros1/rosbridge_server

2 rosauth

包使用解释请看
http://wiki.ros.org/rosauth
源代码请看
https://github.com/GT-RAIL/rosauth

3 环境和工具

虚拟机运行ubuntu16,自己的电脑打开https://hanyajun.com/wstool/,这个websocket工具来测试和ros的通讯需要发什么json字符串。
启用认证## 标题
运行rosbridge的server

roslaunch rosbridge_server rosbridge_websocket.launch authenticate:=true

然后把秘钥放到临时文件中

echo "1234567890abcdef" > /tmp/secret.txt

然后启动rosauth授权节点,注意allowed_time_delta=-1是不管你认证的时间的,这个必须要写。

rosrun rosauth ros_mac_authentication _secret_file_location:=/tmp/secret.txt _allowed_time_delta:=-1

计算一下 MAC (hashed) string given by the client,

echo -n "1234567890abcdefclientdestrand0level0"|sha512sum

在这里插入图片描述

4 调用服务认证

在虚拟机中shell运行以下命令,是可以返回真,是通过了认证

rosservice call /authenticate "mac: '19d9d2166799f1ffd6fee6379f957502aff8716bfebc8cc8b3bac57ade14441bb9678be89d0a7eec9c81291f854d754d7a4de2278bede56f162c2faeb468c68a'
client: 'client'
dest: 'dest'
rand: 'rand'
t: {secs: 0, nsecs: 0}
level: 'level'
end: {secs: 0, nsecs: 0}"

ROS1中rosbridge使用rosauth认证连接_第1张图片

5 websocket工具测试认证

这里受以前callservice的影响,把json字符串写成了这样
{“op”: “call_service”,
“service”: “/authenticate”,
“args”: {
“mac”: “19d9d2166799f1ffd6fee6379f957502aff8716bfebc8cc8b3bac57ade14441bb9678be89d0a7eec9c81291f854d754d7a4de2278bede56f162c2faeb468c68a”,
“client”: “client”,
“dest”: “dest”,
“rand”: “rand”,
“t”: { “secs”: 0,“nsecs”: 0},
“level”: “level”,
“end”: {“secs”: 0,“nsecs”: 0}
}
}
发送之后链接就断开了,没有通过认证。
但实际上是通过rosbridge_server来调用的认证服务,所以op也不是call_service,但经过看这位博主的文章https://blog.csdn.net/qq_29230261/article/details/82666671的3.3
或者看https://github.com/RobotWebTools/rosbridge_suite/blob/ros1/rosbridge_server/src/rosbridge_server/websocket_handler.py的127行
或者直接看https://hub.fastgit.org/RobotWebTools/roslibjs/blob/develop/src/core/Ros.js的99~123行
就明白应该如何写json字符串了。应该是如下
{“op”: “auth”,
“mac”: “19d9d2166799f1ffd6fee6379f957502aff8716bfebc8cc8b3bac57ade14441bb9678be89d0a7eec9c81291f854d754d7a4de2278bede56f162c2faeb468c68a”,
“client”: “client”,
“dest”: “dest”,
“rand”: “rand”,
“t”: 0,
“level”: “level”,
“end”: 0}
发送以上字符串可以通过认证,链接保持,如果想要增加安全性,就要在client和dest,以及t和end字段上面设置,启动rosauth的时候把_allowed_time_delta:=-1去掉,就有了时间限制。

6时间间隔

kinetic的rosauth版本为0.1.7,时间差要小于5秒,结束时间要大于当前时间,如果你不仔细写时间t和end,认证通过不了。ROS1中rosbridge使用rosauth认证连接_第2张图片
最新版本的代码但melodic的rosauth是1.0.1,可以使用_allowed_time_delta:=-1。
ROS1中rosbridge使用rosauth认证连接_第3张图片
认证通过链接就不会断开,不通过网络连接就会断掉。
这里是一个通过认证的例子
ROS1中rosbridge使用rosauth认证连接_第4张图片
在wstools网页中,打开连接,然后填入以下字符串,注意t需要跟你发送的时间很接近,误差在5秒内。然后end要大于发送时间。mac是用linux的sha512sum来计算的。
{“op”: “auth”,
“mac”: “86c31bcf2c68b517668a03a894ad2996622a78276a3217666278efa6443a09af033bd1af98468780c3731e869ab1f7254eafed10933fef6ed20908415fb56981”,
“client”: “client”,
“dest”: “dest”,
“rand”: “rand”,
“t”: 1646270850,
“level”: “level”,
“end”: 1646370099}
在linux下终端输入echo -n “1234567890abcdefclientdestrand1646270850level1646370099”|sha512sum注意引号内的字符串都是上面的内容,特别是时间t和结束时间end
计算sha512sum
将计算后的一长串字符黏贴到wstools网页的mac中,在时间接近的时候,点击发送,可以看到ros端已经完成验证。
在这里插入图片描述

建议:
大家需要去github上下载最新的rosauth代码,然后编译。注意在~/.bashrc中添加编译后的路径,后面的路径中的包会覆盖前面的路径。如果不确定用的是哪个路径的rosauth,就用rospack find rosauth来查找一下。

你可能感兴趣的:(机器人,websocket,网络协议,网络,ubuntu)