17981


SORACOM BeamのHTTPエントリーポイントに設定するヘッダ付与の署名ヘッダ(`X-Soracom-
Signature`)の検証仕様・アルゴリズムを教えてください。

アプリケーションサーバにて、リクエストの正当性検証のためにIMSIの突き合わせとセットで利用したい次第です。


CC BY-SA 3.0
2015-10-23T07:30:27.190
17976
2015-10-23T08:23:58.113
12845
question
soracom
Beamの署名ヘッダ検証の仕様について


ドキュメントに記載ができておらず、失礼いたしました。追記したいと思います。

### 仕様

現状のシグネチャ仕様としましては、下記のようになっております。

事前共有鍵: topsecret  
IMSI: 440101111111111  
TIMESTAMP: 1445587157992

であった場合、

[code]

    SHA256('topsecret'+'x-soracom-imsi=440101111111111x-soracom-timestamp=1445587157992')
    
[/code]

のように計算されます。

### 計算実行例

[code]

    irb(main):001:0> require 'digest/sha2'
    => true
    irb(main):002:0> Digest::SHA256.hexdigest 'topsecret'+'x-soracom-imsi=440101111111111x-soracom-timestamp=1445587157992'
    => "abb87746040d112848d5b331ccfbc70a9d663173d7e9f928ddab19d4626140d9"
    
[/code]

### 検証用サンプルコード(Ruby の Rack環境を想定)

[code]

    def verify_signature(secret = 'topsecret')
      string_to_sign = request.env
        .select{|k,v| k=~/HTTP_X_SORACOM/ && !(k=~/HTTP_X_SORACOM_SIGNATURE/)}
        .map{|k,v| "#{k.sub(/HTTP_/,'').gsub(/_/,'-').downcase()}=#{v}"}
        .sort().join()
      calculated_signature = Digest::SHA256.hexdigest secret + string_to_sign
      result = (calculated_signature == env['HTTP_X_SORACOM_SIGNATURE'])
    
[/code]

### 検証方法

Beamの設定で <https://beamtest.soracom.io> に対して
IMSIヘッダと署名ヘッダを付けて頂いて、<http://beam.soracom.io:8888> にアクセスしますと、署名検証の過程がご確認頂けます。  
(beamtest.soracom.io は、事前共有鍵が topsecret である事を期待して動作します)


CC BY-SA 3.0
2015-10-23T08:23:58.113
17981
2015-10-23T08:23:58.113
12626
17976
answer