🌐

【C#】9月からLINE APIはTLS1.2以降のみ対応になっていた

2021/09/15に公開

はじめに

今回はLINE APIの仕様変更をすっかり見落としていた件を紹介します。
もしかしたら自分のようにハマる方もいるのかなと思い記事にしました。

前提として

C#LINE APIを使っているコードがあります。
何も特別なことはしておらずSystem.Net.Httpを使ってLINE公式アカウントから友達登録しているアカウント全てにブロードキャストメッセージを送るものです。

ブロードキャストメッセージについて詳しく知りたい方は公式の以下のページを参照してください。
https://developers.line.biz/ja/reference/messaging-api/#send-broadcast-message

コードは以下のような感じです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Collections;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace Hoge
{
  public class Send
  {
    HttpResponseMessage response = null;
    string uri = "https://api.line.me/v2/bot/message/broadcast";
    string text = "ほげほげ";

    using (HttpClient client = new HttpClient())
    {
      // リクエスト作成
      client.DefaultRequestHeaders.Add("Authorization", "Bearer " + "【アクセストークン】");
      Body requestBody = new Body();
      requestBody.Messages.Add(new Message(text));

      // JSONに変換
      string json = JsonConvert.SerializeObject(requestBody);
      var content = new StringContent(json, Encoding.UTF8, "application/json");

      // リクエスト
      response = await client.PostAsync(uri, content);

      // responseの解析処理が続く・・・
    }
  }
}

2021年9月から送信エラーになっている?

この処理でそこそこ長い期間動作してくれていましたが、2021年9月より以下のExceptionを吐くようになりました。
※以下はException.Messageの中身

この要求の送信中にエラーが発生しました。

最初はLINE公式アカウントの送信制限に引っかかったのかなと思いましたが、他のアカウントで同様の処理を走らせても結果は同じ。
なので、「LINE API側の仕様変更かな?」と思ったところビンゴでした。

TLS1.2以降を使おう

以下がLINE公式からのアナウンス記事になります。

https://developers.line.biz/ja/news/2021/09/01/supported-tls-protocol-versions/

記事にある通り、LINE APIにリクエストを投げる際にTLS1.0もしくはTLS1.1はサポートしなくなるとのことで、時期的にもぴったり当てはまりました。

C#というか.NET FrameworkのバージョンによってはデフォルトがTLS1.2になっていないものがあり、今回の環境がまさにそれでした。

対処

先ほどのコードに以下(System.Net.ServicePointManager.SecurityProtocol)を指定するだけです。
※要は明示的にTLS1.2を使うことを記載する。

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

System.Net.ServicePointManager.SecurityProtocolの詳細については公式に記載があります。

https://docs.microsoft.com/ja-jp/dotnet/api/system.net.servicepointmanager.securityprotocol?view=net-5.0

反省・まとめ

今回はLINE APIが2021年9月以降TLS1.1以下をサポートしなくなった件でハマった内容をまとめました。
公式のアナウンスをすっかり見落としてしまった経緯としては「長い期間安定稼働していたこと」や「当該機能の担当が変わり、このあたりの仕様の理解や公式アナウンスチェックの重要性が引き継がれていなかったこと」があります。

LINEに限らず、特定のタイミングからTLS1.1以下のサポートを切るサービスは近年多く見られるので、外部のサービスと連携しているアプリケーションにおいては、「公式アナウンスを自動的に収集する」ような仕組み構築が重要かなと思います。
※収集した情報は自動でSlackなどに通知できるようにすると尚良いですが、大概はサービスの開発者として登録しているメールにお知らせが届いているはずなので、そちらを参照するだけでもよいかと思います。

今回の内容が役立てば幸いです。

Discussion