今日は、仕事でちょいとはまった話。WebAPIをデスクトップアプリから呼び出しているんですが、WebAPIのエンドポイントにアクセスしても拒否られてアクセスできない壁にぶち当たりました。
ことの発端・・・WebAPIにアクセスできない。
仕事、というよりも、プライベートで作ったアプリですが、今流行りのWebAPIでAIや機械学習の恩恵が受けられる「アレ」です。
このWebAPIの中にCustom Vision Serviceというのがあり、そちらのAPIを呼び出していました。
で、最初はリージョンに東南アジアを指定して実行していました。が、やっぱり画像の保存場所とかちゃんと考えたほうがいいのかなぁと・・・。
最近になって提供された東日本リージョンのエンドポイントに変更したんです。
そしたら今まで東南アジアのエンドポイントでは動いていたアプリが、
動かなくなりました。はい。
「リモートホストに強制的に切断されました。」だって。
アクセス拒否っぽい。
どーして?
ちなみに開発環境はVisualStudio2019。
原因究明を行ってみた
わたくしビビりなものでして「東南アジアのリージョン使えばいいや」っていうわけにもいかないのでなぜダメかいろいろ試してみました。
まぁ一番最初にやったことは「エンドポイントが本当に正しいか?」ですね。これはAzureのポータルやらリファレンスからエンドポイントのURLをコピペしてるので絶対大丈夫。APIに該当するサブスクリプションキーがヘッダーに埋め込まれてるか確認するも問題なし。
ちなみに、Azureのポータルにはブラウザ上からAPIの振る舞いを確認できるAPIテストコンソールっていうのがあるのですが、そこから東日本リージョンの該当APIを呼び出してやるとうまくいくんです。なぜ???
ってことで、よくわからんのでAzureのサポートに問い合わせてみることに・・・
・・・テクニカルサポート有償っぽい・・・→終了w
だめだぁ。原因不明。
こんどは会社の環境(VisualStudio2015)で同じように東日本リージョンのエンドポイントにアクセスしたら、なんかエラーメッセージが違う。
「リモート パーティがトランスポート ストリームを終了したため、認証に失敗しました。」
なんだこのエラーメッセージ?
結果
ってことで早速Google先生に相談。
するとありました。どうやらWebAPIのサーバー側のTLSバージョンが原因のようです。
ってことは、東日本リージョンのサーバーはTLS1.2以外受付てくれないのか?逆に、東南アジアリージョンのサーバーはTLS1.2以外でも有効なのか?
ってことで、以下のサイトで確認してみました。
本当だ。東日本はTLS2.0の受け口しか有効じゃぁないじゃぁぁぁないか・・・。
TLSとか詳しいことはよくわかりませんが、とてもお勉強になりました。こういったところもちゃんと理解していかないとなぁと痛感・・・。
アプリケーション側での対策
前述のQiita記事にある内容そのままコード追加してあげれば今まで通りWebAPIへのアクセスがうまくいくようになりました。
1 2 |
' TLS1.2にも対応する System.Net.ServicePointManager.SecurityProtocol = System.Net.ServicePointManager.SecurityProtocol Or System.Net.SecurityProtocolType.Tls12 |
昨今のSSL3.0、TLS1.0、TLS1.1の脆弱性から、TLS1.2に対応させることは必須の要件になっているようです。
ひとまず動いたので、めでたしめでたしです。
コメント