署名ヘッダと事前共有鍵を使って送信元を検証する
Beam が付与する署名ヘッダと事前共有鍵を使用して送信元を検証できます。たとえばサーバー側で署名ヘッダを検証することで SORACOM からのアクセスだけを許可できます。
Air for Cellular で HTTP/TCP/UDP to HTTPS または Web サイト エントリポイントをご利用の場合
署名は下記のような文字列を用いて計算され、x-soracom-signature
としてリクエストに付与されます。
SHA256(${事前共有鍵}x-soracom-imei=${IMEI}x-soracom-imsi=${IMSI}x-soracom-msisdn=${MSISDN}x-soracom-sim-id=${SIM_ID}x-soracom-timestamp=${TIMESTAMP})
IMEI, IMSI, MSISDN, SIM ID はそれぞれグループコンフィグで有効にしたものだけが付与されます。
接続中のキャリアが対応していないなどの理由で IMEI が取得できなかった場合、該当部分 (x-soracom-imei=${IMEI}
) は省略されます。
たとえば下記のような前提条件の場合
IMSI: 440101111111111
IMEI: 1111122222333333
SIM ID: 555556666677777
MSISDN: 8901234567890
TIMESTAMP: 1445587157992
SIM IDヘッダ付与、IMEI ヘッダ付与、署名ヘッダ付与
事前共有鍵: topsecret を入力した認証キーを指定
具体的には以下のように計算されます。
SHA256('topsecret'+'x-soracom-imei=1111122222333333x-soracom-imsi=440101111111111x-soracom-timestamp=1445587157992')
IMEI を含めない場合は、以下のように計算されます。
SHA256('topsecret'+'x-soracom-imsi=440101111111111x-soracom-timestamp=1445587157992')
検証方法
Beam の HTTP エントリポイントを https://beamtest.soracom.io:443/ に設定したうえで署名ヘッダを付与してリクエストを行うと実際の動作の様子が下記のように確認できます。
https://beamtest.soracom.io/ では、事前共有鍵を topsecret
に固定しています。
$ curl beam.soracom.io:8888
Hello SORACOM Beam Client 4401031******** !
== HTTP Headers ==
HTTP_X_SORACOM_IMEI = 3545660********
HTTP_X_SORACOM_IMSI = 4401031********
HTTP_X_SORACOM_SIGNATURE = ccc2594804064311344a46e880465b27992750a6a3fdf19463fefa584becf5b1
HTTP_X_SORACOM_SIGNATURE_VERSION = 20151001
HTTP_X_SORACOM_TIMESTAMP = 1482303563385
= Signature Verification =
Pre shared key = topsecret
stringToSign:
x-soracom-imei=3545660********x-soracom-imsi=4401031********x-soracom-timestamp=1482303563385
calculated_signature:
SHA256('topsecret'+stringToSign) = ccc2594804064311344a46e880465b27992750a6a3fdf19463fefa584becf5b1
provided_signature:
ccc2594804064311344a46e880465b27992750a6a3fdf19463fefa584becf5b1
signature:
Match!
Air for Cellular で TCP to TCPS Beam をご利用の場合
署名は下記のような文字列を用いて計算されます。
SIGNATURE = SHA256(${事前共有鍵}imei=${IMEI} imsi=${IMSI} msisdn=${MSISDN} simId=${SIM_ID} timestamp=${TIMESTAMP})
IMEI, IMSI, MSISDN, SIM ID はそれぞれグループコンフィグで有効にしたものだけが付与されます。
接続中のキャリアが対応していないなどの理由で IMEI が取得できなかった場合、該当部分は (imei=undefined
) として処理されます。
たとえば下記のような前提条件の場合
IMSI: 440101111111111
IMEI: 取得できず
SIM ID: 555556666677777
MSISDN: 8901234567890
TIMESTAMP: 1445587157992
SIM IDヘッダ付与、IMEI ヘッダ付与、署名ヘッダ付与
事前共有鍵: topsecret を入力した認証キーを指定
署名は以下のように計算されます。
SIGNATURE = SHA256('topsecret'+'imei=undefined simId=44010555556666677777 timestamp=1445587157992')
署名は他の情報とともに、TCP 接続確立時に転送先サーバーに以下のフォーマットで送信されます。
imei=${IMEI} imsi=${IMSI} msisdn=${MSISDN} simId=${SIM_ID} timestamp=${TIMESTAMP};signature=${SIGNATURE} version=20151001\r\n
検証方法
Beam の TCP to TCPS エントリポイントを以下のように設定したうえで接続を行うと、実際の動作の様子が下記のように確認できます。
https://beamtest.soracom.io/ では、事前共有鍵を topsecret
に固定しています。
エントリーポイント: TCP to TCPS
プロトコル: TCPS
ホスト名: beamtest.soracom.io
ポート番号: 1234
ヘッダ: 任意のヘッダを付与
署名ヘッダ付与: ON
事前共有鍵: topsecret を入力した認証キーを指定
$ nc beam.soracom.io 8023
--- SIGNATURE VERIFICATION
imsi=44010*** timestamp=****;signature=**** version=20151001
string_to_sign: imsi=44010*** timestamp=****
calculated_signature: sha256(string_to_sign) = ****
provided_signature: ****
---
Hello Authorized Soracom Beam Client! :imsi=44010*** timestamp=****
Air for LoRaWAN で通信している場合
LoRaWAN で通信している場合も同様に署名は下記のように計算されます。署名は x-soracom-signature としてリクエストに付与されます。
SHA256(${事前共有鍵文字列}x-soracom-lora-device-id=${LoRa device id}x-soracom-timestamp=${timestamp})
たとえば下記のような前提条件の場合
事前共有鍵: topsecret
LoRa device id: 000b78fffe000001
timestamp: 1492414740191
具体的には以下のように計算されます。
SHA256('topsecret'+'x-soracom-lora-device-id=000b78fffe000001x-soracom-timestamp=1492414740191')
Air for Sigfox で通信している場合
Sigfox で通信している場合も同様に署名は下記のように計算されます。署名は x-soracom-signature としてリクエストに付与されます。
SHA256(${事前共有鍵文字列}x-soracom-sigfox-device-id=${Sigfox device id}x-soracom-timestamp=${timestamp})
たとえば下記のような前提条件の場合
事前共有鍵: topsecret
Sigfox device id: 000b78fffe000001
timestamp: 1492414740191
具体的には以下のように計算されます。
SHA256('topsecret'+'x-soracom-sigfox-device-id=000b78fffe000001x-soracom-timestamp=1492414740191')