php製のslackのslash commandsで突然 failed to open stream: HTTP request failed! HTTP/1.1 426 Upgrade Required
状況
2021年10月上旬ごろから急にslackのスラッシュコマンドが反応しなくなった。
プログラムは既に4年が経過していて、php製
↓停止したスラッシュコマンド
研究室のslackにscrapboxへテンプレートを自動で作成してくれるコマンド作った
— 又 (@matatsuna) 2017年5月16日
名前とアイコンをそれっぽくしたら公式っぽくなったww(非公式) pic.twitter.com/XK6oF4WlEI
原因
slackがTLS1.0/TLS1.1の通信のサポートを廃止したから 多分
Slack での Transport Layer Security (TLS) の変更 セキュリティとデータ整合性に関する業界のベストプラクティスに従い、Slack は、TLS バージョン 1.0 および 1.1 へのサポートを 2020 年 2 月 19 日付で終了します。この日以降、TLS 1.2 へのアップグレードが未完了のサービスから Slack に送信されるリクエストはすべて到達しなくなります。
file_get_contents がデフォルトだとHTTP/1.0を使うらしい
PHP 8.0.0 以降では、デフォルトは 1.1 です。 それより前のバージョンでは、デフォルトは 1.0 でした。
TLSのサポートされるのがHTTP/1.1かららしい
HTTP/1.0 でhttps接続するとTLS1.0かTLS1.1を使っていたのかもしれない
解決策
file_get_contentsからcurlに書き換えてHTTP/2にあげる
スラッシュコマンドの response_url
を使って $json をPOSTするようにしてます
$response_url = "https://hooks.slack.com/commands/hoge/fuga"; $opts = [ CURLOPT_VERBOSE => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POSTFIELDS => json_encode($json) ]; $ch = curl_init($response_url); curl_setopt_array($ch, $opts); curl_exec($ch); curl_close($ch);
file_get_contents をHTTP/1.1にする方法もある qiita.com
ちなみに:file_get_contents を使ってHTTP/2を使う方法が見つからなかった
動作環境
docker php:7.2-apache
参考
curl エクステンションで HTTP/2 リクエストを送信する - Qiita