3.1. SSL/TLS通信ガイド

3.1.1. 概要

EdgeとBackend間で行うHTTPとMQTTの通信は、Ansible playbookの設定によりSSL/TLS暗号化を行うかどうかを設定できます。

ここでは、SSL/TLSによる通信の暗号化を行わずにインストールした場合に後から暗号化を有効化する手順を説明します。

3.1.2. BackendのSSL/TLS設定

この節では、BackendでSSL/TLS対応を行うための構成例を説明します。

3.1.2.1. 構成

BackendではHTTP通信をNginxで処理し、MQTT通信をRabbitMQで処理しますので、次の図のようにHTTPSの暗号と復号をNginxで行い、MQTTSの暗号と復号をRabbitMQで行うように設定します。

ssl1

3.1.2.2. 設定手順

  • 証明書、秘密鍵を配置

    ファイルを以下に配置します。配置先のパスは環境に合わせて読み替えてください。

    証明書ファイル ファイルパス
    サーバ証明書 /path/to/server.pem
    中間CA証明書 /path/to/cacert.pem
    サーバ証明書と中間CA証明書を結合したファイル /path/to/cert.pem
    サーバ鍵 /path/to/cert.key

    サーバ証明書と中間CA証明書を結合するには次のコマンドを実行します。 ```bash $ cd /path/to/

    $ cat /path/to/server.pem /path/to/cacert.pem > /path/to/cert.pem ```

    RabbitMQはサーバ証明書、中間CA証明書およびサーバ鍵のオーナーがRabbitMQプロセスの実行ユーザでないとSSL/TLS通信ができません。

    そのため、これらのファイルのオーナーをRabbitMQプロセスの実行ユーザであるrabbitmqに変更します。

    $ chown rabbitmq:rabbitmq /path/to/server.pem /path/to/cacert.pem /path/to/cert.key
    
  • Nginxの設定(HTTPS)

    エディタでNginxの設定ファイルを編集します。 bash  $ vi /etc/nginx/conf.d/common-proxies.conf

    • 変更前
    server {
        listen       80;
        listen       [::]:80 ipv6only=on;
        ...
    
    • 変更後

      設定値は後述の表に従って、適宜変更してください。

    server {
        listen       443 ssl;
        listen       [::]:443 ipv6only=on ssl;
    
        ssl_certificate      /path/to/cert.pem;
        ssl_certificate_key  /path/to/cert.key;
        ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers          HIGH:!ADH:!MD5;
    
        ssl_verify_client       off;
        ssl_client_certificate  /path/to/cacert.pem;
        ...
    
    項目名 説明
    listen nginxがlistenするIPアドレスとポート番号。SSL通信する場合はsslを指定する。
    ssl_certificate サーバ証明書のファイルパス。
    ssl_certificate_key サーバ鍵のファイルパス。
    ssl_protocols 有効なSSL/TLS通信プロトコル一覧。
    ssl_ciphers 有効な暗号スイート。
    ssl_verify_client クライアント認証するか。クライアント認証する場合はonを指定する。
    ssl_client_certificate クライアント証明書のCA証明書のファイルパス。

    編集が完了したら、nginxを再起動します。 bash  $ service nginx restart

  • ICE Backend APIの設定 既定の設定では、ICE Backend APIがエッジに通知するファイルダウンロード用のURLがHTTP通信になっているため、これをHTTPS通信用に変更します。

    エディタで設定ファイルを編集します。 bash  $ vi /opt/nec/pf/ice/config/backendapi1.config.json

    • 変更前
    {
    ...
      "fileDelivery": {
        "baseUrl": "http://<ホスト名>/fileserver/",
    ...
    }
    
    • 変更後
    {
    ...
      "fileDelivery": {
        "baseUrl": "https://<サーバー証明書のFQDN>/fileserver/",
    ...
    }
    

    編集が完了したら、ICE Backend APIを再起動します。 bash  $ service ice-backendapi1 restart

  • RabbitMQの設定(MQTTS)

    エディタでRabbitMQの設定ファイルを編集します。 bash  $ vi /opt/nec/pf/ice/config/rabbitmq.config

    • 変更前
    [
      {rabbitmq_mqtt, [{tcp_listeners, [1883]}] }
    ].
    
    • 変更後
    [
      {ssl,           [{versions, ['tlsv1.2', 'tlsv1.1', tlsv1]}]},
      {rabbit,        [
                       {ssl_options, [{cacertfile, "/path/to/cacert.pem"},
                                      {certfile,   "/path/to/server.pem"},
                                      {keyfile,    "/path/to/cert.key"},
                                      {versions,   ['tlsv1.2', 'tlsv1.1', tlsv1]},
                                      {verify,     verify_peer},
                                      {fail_if_no_peer_cert, true}]}
                      ]},
      {rabbitmq_mqtt, [
                      {tcp_listeners,    [1883]},
                      {ssl_listeners,    [8883]}
                     ]}
    ].
    
    項目名 説明
    rabbit.ssl_options.cacertfile CA証明書のファイルパス
    rabbit.ssl_options.certfile サーバ証明書のファイルパス
    rabbit.ssl_options.keyfile サーバ鍵のファイルパス
    rabbit.ssl_options.versions 有効なSSL/TLS通信のバージョン
    rabbit.ssl_options.verify クライアント証明書の妥当性検証をするか (verify_peer, verify_none)
    rabbit.ssl_options.fail_if_no_peer_cert rabbit.ssl_options.verifyverify_peerの場合のみ、クライアント証明書が無い場合に失敗とするか (true, false)
    rabbitmq_mqtt.tcp_listeners MQTT通信のポート番号
    rabbitmq_mqtt.ssl_listeners MQTTS通信のポート番号

    編集が完了したら、RabbitMQを再起動します。 bash  $ service rabbitmq-server restart

  • ファイアウォールの設定

    • HTTPSとMQTTSのポート許可設定

      HTTPS(443)、MQTTS(8883)で通信している場合の設定です。 また、iptables以外のファイアウォールを使用している場合は適宜読み替えてください。 ```bash $ iptables -I INPUT 1 -p tcp –dport 443 -j ACCEPT

      $ iptables -I INPUT 1 -p tcp –dport 8883 -j ACCEPT ```

      httpとmqttでSSL/TLS通信をしない場合は80ポートと1883ポートを塞いでください。

3.1.3. エッジのSSL/TLS設定

3.1.3.1. 設定手順

  • 証明書、秘密鍵を配置

    以下のファイルを${ICE_HOME}/conf/ディレクトリに配置します。

    • クライアント証明書
    • 中間CA証明書
    • クライアント鍵
  • エッジ設定ファイル修正

    ${ICE_HOME}/conf/core_config.jsonの以下の項目をエディタで修正します。

    • MQTT用項目

      • mqtt.url

        MQTTブローカーのURLを指定します。tls設定をする際は、スキームを’mqtts://’に変更してください。

      • mqtt.cert

        MQTT用のクライアント証明書のファイル名を指定します。

      • mqtt.ca

        MQTT用の信頼する中間CA証明書のリストのファイル名を配列で指定します。

      • mqtt.key

        MQTT用のクライアント秘密鍵のファイル名を指定します。

      • mqtt.options.rejectUnauthorized

        MQTT用の信頼する中間CA証明書のリストに自己証明書を使用する場合は false を指定します。

    • HTTPS用項目

      • https.cert

        HTTPS用のクライアント証明書のファイル名を指定します。

      • https.ca

        HTTPS用の信頼する中間CA証明書のリストのファイル名を配列で指定します。

      • https.key

        HTTPS用のクライアント秘密鍵のファイル名を指定します。

      • https.options.rejectUnauthorized

        MQTT用の信頼する中間CA証明書のリストに自己証明書を使用する場合は false を指定します。