まめ畑

ゆるゆると書いていきます

RubyでSSLはややっこしい

所用にて、RubyHTTPSの通信を行う必要があったので書いてみました。
mechanize使わなくても、HTTPと同じような感じでいけるかと思ったら、そうはいかなかったのでメモ。
ちなみに、所用の件については後日書きます。


先ずはコードをば

require 'net/https'

https = Net::HTTP.new('ドメイン',443)
https.use_ssl = true   #SSLを有効に
https.ca_file = './syoumeisyo.cer'   #証明書をセット
https.verify_mode = OpenSSL::SSL::VERIFY_PEER   #認証モードをセット
https.verify_depth = 5   #証明書チェーンの深さをセット

https.start { |access|
   respons = access.post('アクセスパス','パラメータなどなど')
  色々処理
}


こんな感じです。
ここで問題なのが、証明書を用意しないといけない事ですね。
アクセスしたいサイトの証明書を用意する必要があります。

基本的にはルート証明書を用意すればいい気がします。
そうすれば、同じルート証明書の発行機関なら使い回しがきくので。
同じファイルに複数の証明書が入れられるとの事ですが、試していないのでわかりません。
証明書チェーンの深さは、サイトから渡される証明書からどの位さかのぼるかという事です。
ルート証明書を用意した場合、この値があまり少ないと認証失敗します。


この証明書の取得方法は簡単で、アクセスしたいサイトをIEで表示して、鍵マークをクリックし証明書の表示をクリックします。
次に、証明書のパスのタブを開き、ツリーの一番上に表示されているアイコンをクリックし、証明書の表示をクリックします。
開いたウインドウの詳細の中のファイルにコピーをクリックしウイザードに従います。
エクスポート形式は、Base64 encoded X.509(.CER)を選択してエクスポートした物を使います。


そういえば、最初にHTTPを扱った時にドメインじゃなくて、FQDN入れて困ったのを思い出した日でした。