NICE DCV Error performing TLS handshake のエラーで接続に失敗するときの原因と対応方法

お客様の中に firewalld 停止し忘れの方はいらっしゃいませんか?
2022.07.06

NICE DCV Client から NICE DCV サーバーへリモート接続時に下記のエラーメッセージが出力され接続できませんでした。そのときの原因と対象方法を紹介します。

エラーメッセージ

Unable to connect: Error performing TLS handshake: error:00000005:lib(0):func(0):DH lib

NICE DCV Client の接続画面のキャプチャ

実行環境

RHEL8.4 の AMI から起動し、NIVIDA のグラッフィクドライバー、NICE DCV サーバーをインストールした状態です。

項目 バージョン
AMI ID ami-09ed1fd8c4c00daca
AMI Name RHEL-8.4.0_HVM-20210825-x86_64-0-Hourly2-GP2
Instance Type g5.xlarge
OS Red Hat Enterprise Linux 8.4
NVIDIA Driver 510.47.03
NICE DCV 2022.1 (r13067)
NICE DCV Client 2022.0 (r4131)

調査

DCV のサービスは起動しています。

$ sudo systemctl status dcvserver
● dcvserver.service - NICE DCV server daemon
   Loaded: loaded (/usr/lib/systemd/system/dcvserver.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-07-06 00:45:04 UTC; 3min 17s ago
  Process: 981 ExecStartPre=/sbin/modprobe eveusb (code=exited, status=1/FAILURE)
 Main PID: 1021 (dcvserver)
    Tasks: 5 (limit: 99347)
   Memory: 46.4M
   CGroup: /system.slice/dcvserver.service
           ├─1021 /bin/bash /usr/bin/dcvserver -d --service
           └─1025 /usr/libexec/dcv/dcvserver --service

 7月 06 00:45:03 ip-10-0-1-225.ap-northeast-1.compute.internal systemd[1]: Starting NICE DCV server daemon...
 7月 06 00:45:04 ip-10-0-1-225.ap-northeast-1.compute.internal systemd[1]: Started NICE DCV server daemon.

仮想セッションを作成。

$ dcv create-session dcvdemo

仮想セッションが作成されたことは確認済み。

$ dcv list-sessions
Session: 'dcvdemo' (owner:ec2-user type:virtual)

セキュリティグループのインバウンドは必要なポート(TCP/UDP 8443)を許可済み。

$ aws ec2 describe-security-groups --group-ids sg-0e5ee023e794b8fa9 --query "SecurityGroups[*].IpPermissions[*]" --output table
--------------------------------------
|       DescribeSecurityGroups       |
+----------+--------------+----------+
| FromPort | IpProtocol   | ToPort   |
+----------+--------------+----------+
|  8443    |  udp         |  8443    |
+----------+--------------+----------+
||             IpRanges             ||
|+----------------------------------+|
||              CidrIp              ||
|+----------------------------------+|
||  203.0.113.1/32                  ||
|+----------------------------------+|
+----------+--------------+----------+
| FromPort | IpProtocol   | ToPort   |
+----------+--------------+----------+
|  8443    |  tcp         |  8443    |
+----------+--------------+----------+
||             IpRanges             ||
|+----------------------------------+|
||              CidrIp              ||
|+----------------------------------+|
||  203.0.113.1/32                  ||
|+----------------------------------+|

DCV Client から接続しようとするとUnable to connect: Error performing TLS handshakeのエラーメッセージで接続できません。

原因

RHEL なので firewalld がデフォルトで有効でした。セキュリティグループで許可していてもfirewalld側で拒否されていました。

$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2022-07-05 02:07:42 UTC; 14min ago
     Docs: man:firewalld(1)
 Main PID: 1021 (firewalld)
    Tasks: 2 (limit: 99347)
   Memory: 33.8M
   CGroup: /system.slice/firewalld.service
           └─1021 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

 7月 05 02:07:42 ip-10-0-1-225.ap-northeast-1.compute.internal systemd[1]: Starting firewalld - dynamic firewall daemon...
 7月 05 02:07:42 ip-10-0-1-225.ap-northeast-1.compute.internal systemd[1]: Started firewalld - dynamic firewall daemon.
 7月 05 02:07:43 ip-10-0-1-225.ap-northeast-1.compute.internal firewalld[1021]: WARNING: AllowZoneDrifting is enabled. This is >

対応

AWS で利用することもあり、EC2 のセキュリティグループでの制御に寄せたいため firewalld は停止・無効化します。

$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

接続テスト

ユーザー、パスワードを入力すると今度は接続できました。

おわりに

Amazon Linux2 を使うことが多いので完全に油断していました。SELinux も現役なのですね。

$ getenforce
Enforcing

参考