環境構築
認証局を構築する
Hashicorp社のVaultを使用します
設定ファイルの作成
config.hclstorage "raft" {
path = "/vault/file"
node_id = "node1"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = "true"
}
disable_mlock = true
api_addr = "http://127.0.0.1:8200"
cluster_addr = "https://127.0.0.1:8201"
ui = true起動
docker run --rm -p 8200:8200 \
-v `pwd`/vault/file:/vault/file \
-v `pwd`/vault/logs:/vault/logs \
-v `pwd`/config.hcl:/config.hcl \
vault server -config=/config.hclブラウザで
127.0.0.1:8200
にアクセス
Create a new Raft cluster
を選択
key shares
を5、Key threshold
を3に指定。(詳細は公式ドキュメントを参照ください。)画面遷移後、少し待つとキーが発行されます。
Download keys
でキーを一括ダウンロードしContinue to Unseal
をクリックします。ダウンロードしたファイルのkeysから、3回別々のkey入力します。
右上のStatusが緑色に変わりました。ダウンロードしたファイルのroot_tokenを使ってログインします。
ログインできました。
認証局の作成
Enable new Engine
をクリックします。
PKI Certificatesを選択し、Nextをクリックします。
Method Optionsを開き、Max Lease TTLを3650daysに設定します。Enable Engineをクリックします。
ConfigurationタブのConfigureボタンをクリック、Configure CAをクリックします。
項目を入力し、Saveボタンをクリックします。
項目 | 値 |
---|---|
Common name | My Private Certificate Authority |
Options -> TTL | 3650days |
Certificateが生成されるのでファイルに保存します。名前はprivate_root_CA.pemとしておきます。
URLsタブを選択し、Issuing certificates
にhttp://127.0.0.1:8200/v1/pki/ca
、CRL Distribution Points
にhttp://127.0.0.1:8200/v1/pki/crl
と入力し、Saveボタンをクリックします。
パンくずリストのpkiから画面を戻り、RolesタブのCreate roleボタンをクリックします。
以下の項目を入力し、Create roleボタンをクリックします。
項目 | 値 |
---|---|
Role name | MyPrivateCertificateAuthority |
Options -> Allow any name | チェックを付ける |
Options -> Enforce hostnames | チェックを外す |
ここまでで認証局の作成は完了です。
デバイス証明書を作成
デバイス証明書を作成して登録しましょう。
Vaultの画面でMyPrivateCertificateAuthorityロールのメニューからGenerate certificateをクリックします。(ロール名のクリックでもOKです)
Common nameを入力し、Generateボタンをクリックします。
Certificate、Private keyを保存しておきます。(それぞれcertificate.pem、private.keyとします。) 画面下部のCopy credentialsからJSON形式で一括取得が可能です。
クラウドに接続
AWS IoT
IoT Coreの管理画面でCA証明書まで遷移し、CA証明書を登録ボタンをクリックします。
ページ中程に説明のある検証証明書を作成する必要があります。登録コードはこの後必要なのでコピーしておきます。
OpenSSLで以下のコマンドを実行します。
openssl genrsa -out verification_cert_key_filename.key 2048
ファイルが作成されます。続いてこちらのコマンド。
openssl req -new -key verification_cert_key_filename.key -out verification_cert_csr_filename.csr
入力が求められるので、Common Name以外は未入力でエンター、Common Nameは先程の登録コードを入力します。
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: <===== ここに検証コード
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Vaultの画面に戻り、Rolesに作成したMyPrivateCertificateAuthorityの右側メニューから、Sign certificateを選択します。
以下の項目を入力し、Generateをクリックします。
項目 | 値 |
---|---|
Certificate Signing Request (CSR) | OpenSSLで生成したCSRファイルの内容 |
Common name | 検証コード |
Options -> Exclude Common Name from Subject Alternative Names (SANs) | チェックを付ける |
証明書が作成されるので、ファイルに保存します。(verification_cert_filename.pemとします)
AWSの管理画面に戻ります。 CA 証明書にprivate_root_CA.pem、検証証明書にverification_cert_filename.pemを指定し、登録ボタンをクリックします。
CA証明書が登録されました。
証明書画面の証明書を登録ボタンをクリックします。
CA が AWS IoT に登録されていますを選択した状態でCA証明書を選択、作成済みのデバイス証明書をアップロードします。有効化もこのタイミングで実施しておくと良いでしょう。登録ボタンをクリックします。
IoTポリシーを作成します。ポリシーの画面でポリシーを作成ボタンをクリックします。
お試しなので、フル権限で作成します。ポリシーアクションとポリシーリソースはいずれも*です。作成をクリックします。
証明書の画面に戻り、先程登録したデバイス証明書にポリシーをアタッチします。
準備完了です。
接続します。
MQTTクライアントで以下の内容を入力し、接続します。
項目 | 値 |
---|---|
プロトコル | mqtts |
ホスト名 | AWS IoTの設定画面で表示されるエンドポイント |
ポート番号 | 8883 |
クライアントID | 任意の文字 |
ユーザー名 | 未指定 |
パスワード | 未指定 |
CAファイル | Amazon Root CA 1を保存したファイル |
クライアント証明書 | デバイス証明書(certificate.pem) |
プライベートキー | プライベートキー(private.key) |
- Subscribeトピック名
任意(一部AWS予約トピックあり)
- Publishトピック名
任意(一部AWS予約トピックあり)
GCP
Google Cloud IoT Coreのサービスは2023年8月16日に廃止されるようです。(https://cloud.google.com/iot-core?hl=ja)
GCPのIoT Core管理画面を開き、レジストリを登録ボタンをクリックします。
レジストリID、リージョン、Cloud Pub/Subトピックを入力、CA証明書欄private_root_CA.pemの値を貼り付け、作成ボタンをクリックします。
次はデバイスを登録します。左メニューのデバイスを選択し、デバイスを作成ボタンをクリックします。
デバイスID(device1)を入力し、認証欄にcertificate.pemの内容を貼り付けます。公開鍵の種類はRS256_X509を選択します。作成ボタンをクリックします。
接続します。
MQTTクライアントで以下の内容を入力し、接続します。
項目 | 値 |
---|---|
プロトコル | mqtts |
ホスト名 | mqtt.googleapis.com |
ポート番号 | 8883 |
クライアントID | projects/{GCPのプロジェクトID}/locations/{リージョン}/registries/{レジストリ名}/devices/{デバイス名} |
ユーザー名 | unused |
パスワード | こちらの方法で生成したJWT |
CAファイル | Google ルート CA 認証パッケージを保存したファイル |
クライアント証明書 | デバイス証明書(certificate.pem) |
プライベートキー | プライベートキー(private.key) |
- Subscribeトピック名
/devices/{デバイス名}/commands/#
/devices/{デバイス名}/config
GCPの管理画面から構成を編集ボタン、コマンドを送信ボタンでテスト送信が可能です。
- Publishトピック名
/devices/{デバイス名}/events
Azure
IoT Hubを作成します。
IoT Hub名を入力し、確認及び作成ボタンをクリック、作成ボタンをクリックします。
ルート証明書を登録します。左の証明書メニューを選択し、追加ボタンをクリックします。
証明署名を入力、private_root_CA.pemを選択、アップロード時に証明書の状態を確認済みに設定するにチェックを入れ、保存ボタンをクリックします。
次にデバイスを登録します。左のデバイスメニューを選択し、デバイスの追加ボタンをクリックします。
デバイスIDを入力しますが、ここで指定するデバイス名はデバイス証明書作成時に指定したCommon nameと同一である必要があります。認証の種類をX.509 CA 署名済みとし、保存ボタンをクリックします。
接続
接続します。
MQTTクライアントで以下の内容を入力し、接続します。
項目 | 値 |
---|---|
プロトコル | mqtts |
ホスト名 | {IoT Hub名}.azure-devices.net |
ポート番号 | 8883 |
クライアントID | {デバイスID} |
ユーザー名 | {IoT Hub名}.azure-devices.net/{デバイスID} |
パスワード | 未指定 |
CAファイル | Baltimore CyberTrust Rootを保存したファイル |
クライアント証明書 | デバイス証明書(certificate.pem) |
プライベートキー | プライベートキー(private.key) |
- Subscribeトピック名
devices/{デバイスID}/messages/devicebound/#
Azureの管理画面からデバイスへのメッセージボタンでテスト送信が可能です。
- Publishトピック名
/devices/{デバイスID}/messages/events/