[ROS2] Rosbridge_suite & websocket secure
Rosbridge_suite
We need to first install and run the rosbridge-server on the robot as follows:
sudo apt-get install ros-<rosdistro>-rosbridge-server
source /opt/ros/<rosdistro>/setup.bash
ros2 launch rosbridge_server rosbridge_websocket.launch
Now the robot is ready. Let's create React frontend app to control the robot remotely.
npx create-react-app robot-app
npm install --save roslibjs fabric
Using fabric.js, build a webapp showing robot slam map, and the position (x,y) when mouse is clicked. Unfortunately, the position changes when the map is being panned or zoomed.
Rosbridge_suite with wss (websocket secure)
요즘 TLS 기반 보안 프로토콜이 적용된 HTTPS가 대세인데요, 이 사이트에 연결된 모든 연결은 반드시 secure해야하고 그렇지 않은 경우 Mixed Content 오류를 내며 블락해버립니다. 전에는 크롬 설정에서 Insecure content - allow로 허용해줬는데 언제부턴가 그 옵션도 허용하지 않고 있네요.
우리가 개발하는 웹사이트가 HTTPS 기반이고 여기서 rosbridge_suite 연결을 한다고 할 때, rosbridge_suite는 웹소켓 기반이므로 websocket-secure(wss://)를 적용해줘야 하는데요, 이 부분에 대해 알아보겠습니다.
보통 웹사이트는 고정 IP를 갖고 있어서 공인된 인증서로 TLS 보안을 적용할 수 있지만, 로봇이나 디바이스의 경우에는 고정 IP를 갖는 경우가 드물고 일종의 IoT 머신 개념이므로 공인된 인증서를 적용하기가 어렵죠. 이런 경우, 고정 IP 없이 자체적으로 인증서를 생성해서 사용하는 이른바 self-signed certificate라는 것이 있는데, 우분투에서는 기본적으로 snakeoil이라는 self-signed certificate를 갖고 있습니다. 이 인증서를 사용하지 않을 거라면 별도로 만드는 방법을 찾아봐야겠죠.
우리는 편의상 snakeoil self-signed 인증서를 사용해보겠습니다.
$sudo /etc/ssl/private/ssl-cert-snakeoil.key /etc/ssl/certs/
$sudo chmod 644 /etc/ssl/certs/ssl-cert-snakeoil.key
$ls /etc/ssl/certs/ssl*
-rw-r--r-- ssl-cert-snakeoil.key
-rw-r--r-- ssl-cert-snakeoil.pem
인증서가 준비되었으니 이제 rosbridge를 고칩니다. ROS2 Foxy가 설치되어 있다면 /opt/ros/foxy/share/rosbridge_server/launch/rosbridge_websocket.launch 파일을 편집하면 됩니다.
<arg name="ssl" default="true" />
<arg name="certfile" default="/etc/ssl/certs/ssl-cert-snakeoil.pem" />
<arg name="keyfile" default="/etc/ssl/certs/ssl-cert-snakeoil.key" />
실행해서 연결해 보면 아래와 같이 SSLV3_ALERT_CERTIFICATE_UNKNOWN 경고가 뜹니다. Self-signed 인증서라 어쩔 수 없습니다. 문제는 바로 연결을 시도하면 연결이 끊긴다는 것!
$ ros2 launch rosbridge_server rosbridge_websocket_launch.xml
[INFO] [rosbridge_websocket-1]: process started with pid [17915]
[INFO] [rosapi_node-2]: process started with pid [17917]
[rosbridge_websocket-1] [INFO] [1648176364.789538667] [rosbridge_websocket]: Rosbridge WebSocket server started on port 9090
[rosbridge_websocket-1] WARNING:tornado.general:SSL Error on 20 ('192.168.0.18', 42584): [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:1131)
최초 1회, 반드시 (wss 접속하려는 주소로) 접속해서 허용을 해줘야 합니다.
가령 저의 경우는 192.168.0.18 PC에 rosbridge를 띄울 것이니, https://192.168.0.18:9090/ 에 접속해서 Advanced - Proceed to 192.168.0.18 (unsafe)를 해줍니다.
이제 다시 한 번 접속하면, 잘 연결됩니다.