search
LoginSignup
2

More than 1 year has passed since last update.

とあるサイトでのみ%HTTPoison.Error{id: nil, reason: :closed}が発生 解決編 (Elixir)

はじめに

  • Elixir楽しんでいますか:bangbang::bangbang::bangbang:
  • 以前、「とあるサイトでのみ%HTTPoison.Error{id: nil, reason: :closed}が発生 (Elixir)」という記事を書きました
  • ようやくHTTP Getに成功できましたので記事にしておきます
    • あくまでも私がHTTP Getしたかったとあるサイトでの実装例です
    • サイトごとにパラメータ調整が必要になるとおもいますが、その際には私がやったことを参考にすればきっと正解にたどり着けるとおもいます
  • この記事は2021/09/04(土) 00:00〜2021/09/06(月) 23:59開催の純粋なもくもく会「autoracex #44」の成果物です

とあるサイトでHTTP Getに成功したコード

HTTPoison.get "https://to-aru-site.jp", [], [ssl: [{:ciphers, ['AES256-SHA256']}]]
  • to-aru-site.jpは架空のドメインです
  • to-aru-site.jpサイトは他人様のもので、私がどうのこうのすること(接続暗号スイートを更新するなど)はできません

この問題に出くわしたときにやるべきこと

  • 今回の例を踏まえて、また同じような問題に出くわしたときの対処方法を示しておきます
  • 他のサイトではどうか => 問題がない場合、次へ
    • さらにもう一つくらいみんながよくつかっている有名なサイトで試してみて、それでもやっぱり駄目なら自分を疑ったほうがいいでしょう
    • エラーがでるのが本当ならそこそこ界隈では大騒ぎになっているはずだから自分の実装を疑ったほうがいいでしょう
  • 問題がないほかのサイトとくらべて通信内容に差異がないかを調べる
    • 例: curl -v https://to-aru-site.jp --head
      • 残念ながら私はcurlコマンドの結果ではなにがなにやらさっぱりわかりませんでした
    • CMAN 株式会社シーマン様が提供されているSSLチェック【証明書・プロトコル・暗号スイート確認】でチェックしてみる
      • こちらにより、接続暗号スイートなるものに差異があることがわかりました
      • その上で、curlの結果をみると確かにSSL connection using TLSv1.2 / XXXXに差異がありました
  • ここまでわかればあとはなんとかなります
    • でてきた単語でググったり、httpcsslを読んだり、先人のブログを読んだり
    • カンでプログラムを書いてとりあえず試してみたり
  • https://erlang.org/doc/apps/ssl/using_ssl.html#customizing-cipher-suites に以下の記述がありましてこのへんが関係しているようです

In OTP 20 it is desirable to remove all cipher suites that uses rsa kexchange (removed from default in 21)

  • OTP 20でrsa keyexchangeを使うすべてのcipher suitesを取り除くことが強くもとめられた
  • それでOTP 21ではデフォルトで取り除いた
  • そうそう、たしかにこのとあるサイトにおいても、OTP 20では通信ができていました
$ docker run -it --rm erlang:20.3.8.26
Erlang/OTP 20 [erts-9.3.3.15] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.3.3.15  (abort with ^G)
1> inets:start(),
1> ssl:start(),
1> httpc:request("https://to-aru-site.jp/")   .
{ok,{{"HTTP/1.1",200,"OK"},
     [{"cache-control","max-age=30"},
      {"connection","Keep-Alive"},
      {"date","Sat, 04 Sep 2021 00:51:05 GMT"},
      {"server","Apache"},
      {"vary","Accept-Encoding"},
      {"content-length","58989"},
      {"content-type","text/html; charset=UTF-8"},
      {"expires","Sat, 04 Sep 2021 00:51:35 GMT"},
      {"x-frame-options","SAMEORIGIN"},
      {"keep-alive","timeout=1, max=100"}],
     [60,33,68,79,67,84,89,80,69,32,104,116,109,108,62,10,60,104,
      116,109,108,32,108,97|...]}}

但し書き

  • https をちゃ〜んと理解していることが一番いいのだとおもいます
  • ちゃんとした理解があれば、「とあるサイトでのみ%HTTPoison.Error{id: nil, reason: :closed}が発生 (Elixir)」という記事を書いたあと10ヶ月くらい放置せずに済んだでしょう
  • 私みたいに、のあれね1くらいのノリで雰囲気httpsを使っている人にはヒントになるかもしれません
    • これで良いと言っているわけではなくて、やっぱりちゃんとhttps をちゃ〜んと理解していることが一番いいのだとおもいます
    • 繰り返しておきます

Wrapping Up :lgtm::lgtm::lgtm::lgtm::lgtm:

  • Enjoy Elixir :bangbang::bangbang::bangbang:
  • ようやくElixirでとあるサイトと会話できるようになってうれしいです :rocket::rocket::rocket:
  • autoracex #44開催中 :tada::tada::tada:

  1. 最近は、じゃないかもしれません 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2