php製のslackのslash commandsで突然 failed to open stream: HTTP request failed! HTTP/1.1 426 Upgrade Required

状況

2021年10月上旬ごろから急にslackのスラッシュコマンドが反応しなくなった。

プログラムは既に4年が経過していて、php

↓停止したスラッシュコマンド

原因

slackがTLS1.0/TLS1.1の通信のサポートを廃止したから 多分

Slack での Transport Layer Security (TLS) の変更 セキュリティとデータ整合性に関する業界のベストプラクティスに従い、Slack は、TLS バージョン 1.0 および 1.1 へのサポートを 2020 年 2 月 19 日付で終了します。この日以降、TLS 1.2 へのアップグレードが未完了のサービスから Slack に送信されるリクエストはすべて到達しなくなります。

slack.com

file_get_contents がデフォルトだとHTTP/1.0を使うらしい

PHP 8.0.0 以降では、デフォルトは 1.1 です。 それより前のバージョンでは、デフォルトは 1.0 でした。

www.php.net

TLSのサポートされるのがHTTP/1.1かららしい

qiita.com

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

参考

PHPのcurlでPOST - Qiita

curl エクステンションで HTTP/2 リクエストを送信する - Qiita

PHPのcURLがTLS1.2に対応しているか確認する - Qiita

PHP: curl_setopt - Manual

HTTPとHTTPSを探る - 自由帳