メニュー

Expand
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 supports HTTP Basic and Digest Authentication. This allows you to password protect the TwiML URLs on your web server so that only you and Twilio can access them. You may provide a username and password via the following URL format.

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

Be careful to not include any special characters, such as &,:, etc., in your username or password.

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 scheme, port, 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

And let's say Twilio posted some digits from a Gather to that URL, in addition to all the usual POST fields:

  • Digits: 1234
  • To: +18005551212
  • From: +14158675310
  • Caller: +14158675310
  • CallSid: CA1234567890ABCDE

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

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

Then, sort the list of POST variables by the parameter name (using Unix-style case-sensitive sorting order):

  • CallSid: CA1234567890ABCDE
  • Caller: +14158675310
  • Digits: 1234
  • From: +14158675310
  • To: +18005551212

Next, append each POST variable, name and value, to the string with no delimiters:

https://mycompany.com/myapp.php?foo=1&bar=2CallSidCA1234567890ABCDECaller+14158675310Digits1234From+14158675310To+18005551212

Hash the resulting string using HMAC-SHA1, using your AuthToken Primary as the key.

Let's suppose your AuthToken is 12345. Then take the hash value returned from the following function call (or its equivalent in your language of choice):

hmac_sha1(https://mycompany.com/myapp.php?foo=1&bar=2CallSidCA1234567890ABCDECaller+14158675310Digits1234From+14158675310To+18005551212, 12345)

ハッシュ値(ASCII文字のみで構成されているはず) を Base64 でエンコードします。

GvWf1cFY/Q7PnoempGyD5oXAezc==

Finally, compare that to the hash Twilio sent in the X-Twilio-Signature HTTP header. Match them up!

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

        
        
        
        

        私たちは、署名の検証を行うためにヘルパーライブラリを使用することを強くお勧めします。ライブラリがどのように動作しているのか興味がある場合、以下の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 を使う必要があります。
        • 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/.
        • For SMS and voice callbacks over HTTP:
          • Twilio will drop the username and password (if any) from the URL before computing the signature.
          • Twilio will keep the port (if any) in the URL when computing the signature.
        • For SMS callbacks over HTTPS:
          • Twilio will drop the username and password (if any) from the URL before computing the signature.
          • Twilio will keep the port (if any) in the URL when computing the signature.
        • For voice callbacks over HTTPS:
          • Twilio will drop the username and password (if any) from the URL before computing the signature.
          • Twilio will also drop the port (if any) from the URL before computing the signature.

        この動作仕様は、2008/8/1 ~ 2010/4/1 までのAPIバージョンで作成された既存のコードとの互換性を保つために残してあります。 仕様と一貫性がないことは重々承知しており、ご不自由をお掛けすることをお詫びいたします。

        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.

        It's a great idea to test your webhooks and ensure that their signatures are secure. The following sample code can test your unique endpoint against both valid and invalid signatures.

        To make this test work for you, you'll need to:

        1. Set your Auth Token as an environment variable
        2. Set the URL to the endpoint you want to test
        3. If testing BasicAuth, change HTTPDigestAuth to HTTPBasicAuth
              
              
              
              

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

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

              Auth Token

              Please keep your AuthToken secure. It not only enables access to the REST API, but also to request signatures. Learn how to secure this token using environment variables.

              Rate this page:

              ヘルプが必要ですか?

              誰しもが一度は考える「コーディングって難しい」。そんな時は、お問い合わせフォームから質問してください。 または、Stack Overflow でTwilioタグのついた情報から欲しいものを探してみましょう。