メニュー

Rate this page:

Thanks for rating this page!

We are always striving to improve our documentation quality, and your feedback is valuable to us. How could this documentation serve you better?

セキュリティ

暗号化された通信

TwilioはTwilioとアプリケーション間の暗号化された通信をサポートします。HTTPS URLをお使い頂けます。注意 : Twilio は現在自己署名をハンドリングできません

TLS 暗号化プロトコルをサポートします。SSLv3 は公式に廃止される予定です。

HTTP認証

Twilioで使える認証形式は、BASIC認証とダイジェスト認証です。 これらはWebサーバ上の TwiML を、ユーザとTwilioのみからアクセスできるよう保護することができます。 ユーザ名とパスワードは以下のURL形式で指定できます。

https://username:password@www.myserver.com/my_secure_document

Twilioは 与えられたユーザー名とパスワードを使い認証を行い、通話中にログインしたままにします。HTTP認証を暗号化と組み合わせて使うことを強くお薦めします。より詳しい情報はベーシック認証ダイジェスト認証や現在お使いのウェブサーバーのドキュメントをご覧ください。

パスワードで保護されたURLを指定した場合、Twilioはまず Authorization ヘッダーを含めずリクエストを送信します。 開発者のサーバーが 401 Unauthorized ステータスコード、 WWW-Authenticate ヘッダー、および realm を伴ったレスポンスを返すと、Twilioは同一のリクエストを Authorization ヘッダーを伴って返します。

開発者のサーバーからのレスポンス例:

HTTP/1.1 401 UNAUTHORIZED
WWW-Authenticate: Basic realm="My Realm"
Date: Wed, 21 Jun 2017 01:14:36 GMT
Content-Type: application/xml
Content-Length: 327

Twilioからのバリデーションリクエスト

もしユーザアプリケーションが機密データを扱っていたり、データに伴う変移を行うような場合、受け取るHTTPリクエストが確かにTwilioからのものであり、不審な第三者からのものではないことを確実にしたいかもしれません。 この水準のセイキュリティーを担保したい場合、Twilio はそれらのリクエストに対し暗号化した署名を付与することができます。 このような仕組みです:

  1. TLSをサーバーで有効にし、TwilioアカウントにHTTPSのURLを設定して下さい。
  2. Twilio assembles its request to your application, including the final URL and any POST fields.
    • If your request is a POST, Twilio takes all the POST fields, sorts them alphabetically by their name, and concatenates the parameter name and value to the end of the URL (with no delimiter).
    • If the request is a GET, the final URL includes all of Twilio's request parameters appended in the query string of your original URL using the standard delimiter & between the name/value pairs.
  3. Twilio takes the resulting string (the full URL with query string and any POST parameters) and signs it using HMAC-SHA1 and your AuthToken as the key.
  4. Twilio sends this signature in an HTTP header called X-Twilio-Signature

末端側でもしこのリクエストの正当性を確認したい場合は、上記と全く同じプロセスでデータストリングをリアセンブルします。 もし2つのハッシュが一致すれば、そのリクエストは正当であるとみなします。 こうして、最終URLを含む全てのハッシュ構造のデータはTwilioから送られたものであることが担保されます。 以下は、末端側でどのようにバリデーションを行えばよいかの手順です。

  1. 対象の完全URL、プロトコルから始まり、全クエリーストリングを含むもの (https から始まり、 ? で指定するものを全て含む) を取得します。
  2. もしリクエストがPOSTの場合、全てのPOSTパラメータをUnix形式の大文字小文字を区別するソート方法で、アルファベット順に並び替えます。
  3. ソートしたPOSTパラメータに、URLの最後まで繰り返しパラメータ名と値(区切り文字を使わない)を当て込んでいきます。
  4. Sign the resulting string with HMAC-SHA1 using your AuthToken as the key (remember, your AuthToken's case matters!).
  5. 結果のハッシュ値をBase64でエンコードしてください。
  6. 結果のハッシュ値とTwilio側が署名した X-Twilio-Signatureヘッダを比較します。 これらが一致すれば問題ありません。

以下の例で全体の流れを確認してみましょう。Twilioがユーザ側へ以下をPOSTしたとします。

https://mycompany.com/myapp.php?foo=1&bar=2

そして、Twilioがいくつかの数字をそのURLを送ります。ついでに、通常のPOSTフィールドも埋めておきます。

  • 数字: 1234
  • To: +18005551212
  • From: +14158675310
  • Caller: +14158675310
  • CallSid: CA1234567890ABCDE

  • 全クエリストリングを含む文字列を生成。

    https://mycompany.com/myapp.php?foo=1&bar=2

  • 全てのPOSTパラメータをUnix形式の大文字小文字を区別するソート方法で、アルファベット順に並び替えます。

    • CallSid: CA1234567890ABCDE
    • Caller: +14158675310
    • 数字: 1234
    • From: +14158675310
    • To: +18005551212
  • POSTの各変数、すなわち名前とその値を区切り記号なしの文字列として追加します: > https://mycompany.com/myapp.php?foo=1&bar=2CallSidCA1234567890ABCDECaller+14158675310Digits1234From+14158675310To+18005551212

  • HMAC-SHA1を使用して、AuthToken (プライマリー) をキーとして結果の文字列をハッシュします。 仮にAuthTokenが12345だとしましょう。 下記の関数 (またはお使いの言語で相当するもの) の呼び出しから返されるハッシュ値を取り出します: > hmac_sha1(https://mycompany.com/myapp.php?foo=1&bar=2CallSidCA1234567890ABCDECaller+14158675310Digits1234From+14158675310To+18005551212, 12345)

  • ここでハッシュ値のBase64エンコーディングを取り出します (ASCII文字のみが含まれます): > GvWf1cFY/Q7PnoempGyD5oXAezc==

  • このハッシュを、Twilioから送られたHTTPヘッダの X-Twilio-Signature と比較します。 一致しましたね。

以下は、ヘルプライブラリからの例です。:

        
        
        
        

        私たちは、署名の検証を行うためにヘルパーライブラリを使用することを強くお勧めします。ライブラリがどのように動作しているのか興味がある場合、以下のPHPサンプルを実行してみてください。

        <?php
        
            // Your auth token from twilio.com/user/account
            $authToken = '456bef';
        
            public function computeSignature($url, $data = array()) {
                // sort the array by keys
                ksort($data);
        
                // append the data array to the url string, with no delimiters
                foreach ($data as $key => $value) {
                    $url = $url . $key . $value;
                }
        
                // This function calculates the HMAC hash of the data with the key
                // passed in
                // Note: hash_hmac requires PHP 5 >= 5.1.2 or PECL hash:1.1-1.5
                // Or http://pear.php.net/package/Crypt_HMAC/
                $hmac = hash_hmac("sha1", $url, $authToken, true);
                return base64_encode($hmac);
            }
        

        備考

        • ハッシュを作成する際は、必ず自分のプライマリー AuthToken を鍵として使用します。セカンダリー AuthToken が最近作成されたものである場合、セカンダリー AuthToken がプライマリー AuthToken に昇格するまでは、古い方の AuthToken を使う必要があります。
        • HTTP越しのSMSおよび音声通話のコールバックの場合、Twilioは署名の演算を行う前に (存在する場合は) ユーザー名とパスワードを欠落させます。 HTTPS越しのSMSおよび音声通話のコールバックの場合、Twilioは署名の演算を行う前に (存在する場合は) ユーザー名とパスワード、そしてポートを欠落させます。 この動作仕様は、2008/8/1 ~ 2010/4/1 までのAPIバージョンで作成された既存のコードとの互換性を保つために残してあります。 仕様と一貫性がないことは重々承知しており、ご不自由をお掛けすることをお詫びいたします。
        • The HMAC-SHA1 secure hashing algorithm should be available in all major languages, either in the core or via an extension or package.
        • If your URL uses an "index" page, such as index.php or index.html to handle the request, such as: https://mycompany.com/twilio where the real page is served from https://mycompany.com/twilio/index.php, then Apache or PHP may rewrite that URL so it has a trailing slash, e.g., https://mycompany.com/twilio/. Using the code above, or similar code in another language, you could end up with an incorrect hash, because Twilio built the hash using https://mycompany.com/twilio and you may have built the hash using https://mycompany.com/twilio/.

        A note on HMAC-SHA1

        Concerned about SHA1 security issues? Twilio does not use SHA-1 alone.

        In short, the critical component of HMAC-SHA1 that distinguishes it from SHA-1 alone is the use of your Twilio AuthToken as a complex secret key. While there are possible collision-based attacks on SHA-1, HMACs are not affected by those same attacks - it's the combination of the underlying hashing algorithm (SHA-1) and the strength of the secret key (AuthToken) that protects you in this case.

        ヘルプライブラリを用いた認証

        全ての Twilioヘルプライブラリ は、認証リクエストを簡単に扱うためのユーティリティクラスを実装しています。 ヘルプライブラリ のページからお使いの言語に合わせたライブラリをダウンロードしてください。

        Auth Token

        Auth Token は安全に保管してください。 REST API へのアクセスを可能にするだけではなく、署名のリクエストにも使えるからです。

        ヘルプが必要ですか?

        We all do sometimes; code is hard. Get help now from our support team, or lean on the wisdom of the crowd browsing the Twilio tag on Stack Overflow.