cfssl を使って Chrome ブラウザが出す「保護されていない通信」という警告を消す


このドキュメントについて

Virtual URL を使って HTTPS の通信をする場合、Chrome が「保護されていない通信」と警告をしてきます。

暗号化自体はされていますが、信頼されたルート証明機関によるサーバー証明書をつけないと警告を消すことはできません。

このページでは cfssl というツールを使って自己サインの証明書を用意する手番をご紹介します。

本手順書は以下の環境で動作確認しています。

  • 証明書の作成、Front Agent の起動: Ubuntu 18.04
  • Front Agent へのアクセス: Windows 10, Google Chrome 88.0

サーバー証明書とは

HTTPS 通信時にサーバーにつける必要があるサーバー証明書とは「アクセスしている URL が本当に意図した URL なのかどうか」を証明するための暗号化ファイルです。一般には、「信頼されたルート証明機関」である企業(DigiSign, GlobalSign など)から証明書を購入し設置することになります。

ただし、証明書を設置するサーバーがインターネットからアクセスできない、もしくはインターネットの DNS から見つけられない場合は相応の手順が必要となり(メールで責任者確認など)、費用が発生します。

自己サインとは

自己サインというのは、自分自身が「信頼されたルート証明機関」なってサーバー証明書を用意する手法です。

今回は OSS の CFSSL というツールで実施してみます。

補足事項:
Chrome で「信頼できないサイト」という表示がされる場合、以下の場合があるので注意してください。

  • サーバー証明書の期間が長い(約一年以上だと警告)

  • SAN ではなく CN にドメイン名を設定する (CN はみない)

  • Chrome の起動オプションで –host-rules="MAP *t…. として名前解決している場合は、ホスト名が認識されず警告される

    ⇒この警告があっても、通信できていれば暗号化は行われています。

全体的な流れ

ブラウザを使ってアクセスするのは Front Agent です。 Front Agent に「その URL を持つサーバーである」ことを証明する証明書を持たせることで、Chrome は認証します。

multiple endpoints

1. 準備

Ubuntu 環境に以下の手順で、cfssl と cfssljson をインストールします。

cd <作業ディレクトリ>

wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64
sudo cp ./cfssl_1.5.0_linux_amd64 /usr/local/bin/cfssl
sudo chmod +x /usr/local/bin/cfssl

wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64
sudo cp cfssljson_1.5.0_linux_amd64 /usr/local/bin/cfssljson
sudo chmod +x /usr/local/bin/cfssljson

2. ルート証明書の作成

Ubuntu 環境の任意の場所に作業用ディレクトリを作成し、そこに以下の内容を記載した ca-config.json というファイルを作成します。

{
  "signing": {
    "default": {
      "expiry": "168h"
    },
    "profiles": {
      "server": {
        "expiry": "8760h",
        "usages": [
          "signing",
          "key encipherment",
          "server auth"
        ]
      },
      "client": {
        "expiry": "8760h",
        "usages": [
          "signing",
          "key encipherment",
          "client auth"
        ]
      },
      "peer": {
        "expiry": "8760h",
        "usages": [
          "signing",
          "key encipherment",
          "server auth",
          "client auth"
        ]
      }
    }
  }
}

同様に ca-csr.json というファイルを作成して 、以下の内容を記載します。

{
  "CN": "my_rootCA",
  "hosts": [
    "my_rootCA"
  ],
  "key": {
      "algo": "ecdsa",
      "size": 256
  },
  "names": [
    {
      "C": "JP",
      "L": "Shiodome",
      "O": "FUJITSU LTD.",
      "ST": "Tokyo",
      "OU": "Tunaclo"
    }
  ]
}

次のコマンドを実行してルート証明書を生成します。

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

実行後、以下のファイルが作成されていることを確認します。

  • ca-key.pem
  • ca.csr
  • ca.pem

ca.pem が後の手順でクライアントマシンにインポートするルート証明書になります。

3. サーバー証明書の作成

Ubuntu 環境上の作業用ディレクトリに server.json というファイルを作成して 、以下の内容を記載します。
なお、"CN"(証明書の Common Name に該当)と "hosts"(証明書の Subject Alternative Name(SAN) に該当)には、お使いになる Virtual URL のホスト名を指定してください。

(例) Virtual URL が https://portal.somewhere.local:8080 であれば、portal.somewhere.local または *.somewhere.local を指定します。

{
  "CN": "*.tunaclo.local",
  "hosts": [
    "*.tunaclo.local"
  ],
  "key": {
    "algo": "ecdsa",
    "size": 256
  },
  "names": [
    {
      "C": "JP",
      "L": "Shiodome",
      "O": "FUJITSU LTD.",
      "ST": "Tokyo",
      "OU": "Tunaclo"
    }
  ]
}

次のコマンドを実行してサーバー証明書とキーを生成します。

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server

以下のファイルが作成されていることを確認します。

  • server-key.pem
  • server.csr
  • server.pem

server.pemserver-key.pem がそれぞれ Front Agent に渡す証明書とキーのファイルになります。

4. 証明書のインポート

先に生成したルート証明書 ca.pem をクライアントとなる Windows 環境の [信頼されたルート証明機関] にインポートします。

  1. Ubuntu 環境上で作成したルート証明書ファイル(ca.pem)を Windows マシン転送
  2. Windows 環境上で、Internet Exproler の [インターネットオプション] -> [コンテンツ] -> [証明書] -> [信頼されたルート証明機関] を開く
  3. [インポート] ボタンを押す。
    • ウィザードが起動するので、インポートするファイルとして ca.pem を指定

5. Front Agent の起動

5.1 Dokcer 版を使う場合

※ 予め docker-compose をインストールしておいてください。

Ubuntu 環境にて、server.pemserver-key.pem が置いてある作業用ディレクトリに以下の内容の docker-compose.yaml を作成します。

version: '3'

services:
  tunaclo:
    image: tunacloac/frontagent
    container_name: myfrontagent
    restart: always
    environment:
    - HTTP_PROXY=${http_proxy}
    - HTTPS_PROXY=${http_proxy}
    volumes:
      - ./:/opt:ro
    ports:
    - 443:443
    command: "front_agent -controller https://api.kuroshio.tunaclo.net -projectID ${PROJECTID} -agentID ${AGENTID} -agentKey ${AGENTKEY}  --httpsserver 0.0.0.0:443 --certfile /opt/server.pem --keyfile /opt/server-key.pem"
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

以下のコマンドを実行して Front Agent を起動します。

export PROJECTID=<お使いの ProjectID>
export AGENTID=<お使いの AgentID>
export AGENTKEY=<お使いの AgentKey>

docker-compose up -d

5.2 Windows 版 Tunaclo Connect Client を使う場合

Ubuntu 環境上で作成した server.pemserver-key.pem を Windows 環境に転送します。

次に、Tunaclo Connect Client の設定ファイル(ポータルからダウンロードした YAML ファイル)を更新します。 certfile のエントリに server.pem のパスを、keyfile のエントリに server-key.pem のパスを記載してください。

例:

certfile: C:\Users\myuser\certs\server.pem
keyfile: C:\Users\myuser\certs\server-key.pem

その後、Tunaclo Connect Client を起動します。

Tunaclo Connect Client の詳細は「 Tunaclo Connect Client 」を参照してください。

以上の操作で、Chrome ブラウザが出す「保護されていない通信」という警告が消えているはずです。もし、うまくいかない場合は、各 json ファイルの設定値を見直してみてください。

前へ
次へ