본문 바로가기
Language & Framework & GIT/ROS2

[ROS2] Rosbridge_suite & websocket secure

by veganwithbacon 2024. 4. 29.
반응형

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)를 해준다.

Advanced 클릭

Proceed unsafe

반응형

댓글