QA@IT
«回答へ戻る

760
 
 cacert.pemに信頼するルートCA証明書の束が入っている場合はOKです。ただしその中に**GeoTrust Global CA**のルートCA証明書(シリアル番号0x23456)があることが前提です。
 
-手動だとうまく行って、cronからだと失敗する理由がいまいちわからないのですが、ちょっと想像してみたのは、.bashrcなどで環境変数SSL_CERT_DIRやSSL_CERT_PATHを指定しているのだろうかとか...
+手動だとうまく行って、cronからだと失敗する理由がいまいちわからないのですが、ちょっと想像してみたのは、.bashrcなどで環境変数SSL_CERT_DIRやSSL_CERT_FILEを指定しているのだろうかとか...
+
+**追記**
+上の最後の文は推測なんですが、一応根拠を書いておくと、Rubyのマニュアル[OpenSSL::X509モジュール](http://docs.ruby-lang.org/ja/2.2.0/class/OpenSSL=3a=3aX509.html)によると、環境変数SSL_CERT_DIRやSSL_CERT_FILEを指定していると、set_default_pathsで読み込まれる証明書ディレクトリや証明書ファイルを変更できるとあるからです。手動のときだけこれらの環境変数が有効になっているとすると、そういうこともありうると考えました。
url = 'https://play.google.com/store/apps/collection/topgrossing'

このURLにブラウザから接続して、証明書パスを見てみると次のようになっていました。

  • GeoTrust Global CA
  • Google Internet Authority G2
  • *.google.com

ですので証明書パスを検証するには、ローカルなトラストストアにGeoTrust Global CAのルートCA証明書(シリアル番号0x23456)が入っている必要があります。

まず下の箇所ではシステム標準のトラストストアを使わせようとしていますが、これが使えないということでしょうか?

http.cert_store.set_default_paths

次に下の箇所でcacert.pemをトラストストアに追加しようとしていますが、これは上の設定が効かないためにやっている、という理解ですが、それでよいでしょうか?

abc = File.dirname(__FILE__) + '/cacert.pem'
http.cert_store.add_file(abc)

ちなみにcacert.pemの中身はどうなっていますか?

cacert.pemはシステムによってはテスト用のCA証明書のことがありますが、それをトラストストアとして指定しても意味はありません。

cacert.pemに信頼するルートCA証明書の束が入っている場合はOKです。ただしその中にGeoTrust Global CAのルートCA証明書(シリアル番号0x23456)があることが前提です。

手動だとうまく行って、cronからだと失敗する理由がいまいちわからないのですが、ちょっと想像してみたのは、.bashrcなどで環境変数SSL_CERT_DIRやSSL_CERT_FILEを指定しているのだろうかとか...

追記
上の最後の文は推測なんですが、一応根拠を書いておくと、RubyのマニュアルOpenSSL::X509モジュールによると、環境変数SSL_CERT_DIRやSSL_CERT_FILEを指定していると、set_default_pathsで読み込まれる証明書ディレクトリや証明書ファイルを変更できるとあるからです。手動のときだけこれらの環境変数が有効になっているとすると、そういうこともありうると考えました。

```ruby
url = 'https://play.google.com/store/apps/collection/topgrossing'
```

このURLにブラウザから接続して、証明書パスを見てみると次のようになっていました。

- GeoTrust Global CA
- Google Internet Authority G2
- *.google.com

ですので証明書パスを検証するには、ローカルなトラストストアに**GeoTrust Global CA**のルートCA証明書(シリアル番号0x23456)が入っている必要があります。

まず下の箇所ではシステム標準のトラストストアを使わせようとしていますが、これが使えないということでしょうか?

```ruby
http.cert_store.set_default_paths
```

次に下の箇所でcacert.pemをトラストストアに追加しようとしていますが、これは上の設定が効かないためにやっている、という理解ですが、それでよいでしょうか?

```ruby
abc = File.dirname(__FILE__) + '/cacert.pem'
http.cert_store.add_file(abc)
```

ちなみにcacert.pemの中身はどうなっていますか?

cacert.pemはシステムによってはテスト用のCA証明書のことがありますが、それをトラストストアとして指定しても意味はありません。

cacert.pemに信頼するルートCA証明書の束が入っている場合はOKです。ただしその中に**GeoTrust Global CA**のルートCA証明書(シリアル番号0x23456)があることが前提です。

手動だとうまく行って、cronからだと失敗する理由がいまいちわからないのですが、ちょっと想像してみたのは、.bashrcなどで環境変数SSL_CERT_DIRやSSL_CERT_FILEを指定しているのだろうかとか...

**追記**
上の最後の文は推測なんですが、一応根拠を書いておくと、Rubyのマニュアル[OpenSSL::X509モジュール](http://docs.ruby-lang.org/ja/2.2.0/class/OpenSSL=3a=3aX509.html)によると、環境変数SSL_CERT_DIRやSSL_CERT_FILEを指定していると、set_default_pathsで読み込まれる証明書ディレクトリや証明書ファイルを変更できるとあるからです。手動のときだけこれらの環境変数が有効になっているとすると、そういうこともありうると考えました。

回答を投稿

url = 'https://play.google.com/store/apps/collection/topgrossing'

このURLにブラウザから接続して、証明書パスを見てみると次のようになっていました。

  • GeoTrust Global CA
  • Google Internet Authority G2
  • *.google.com

ですので証明書パスを検証するには、ローカルなトラストストアにGeoTrust Global CAのルートCA証明書(シリアル番号0x23456)が入っている必要があります。

まず下の箇所ではシステム標準のトラストストアを使わせようとしていますが、これが使えないということでしょうか?

http.cert_store.set_default_paths

次に下の箇所でcacert.pemをトラストストアに追加しようとしていますが、これは上の設定が効かないためにやっている、という理解ですが、それでよいでしょうか?

abc = File.dirname(__FILE__) + '/cacert.pem'
http.cert_store.add_file(abc)

ちなみにcacert.pemの中身はどうなっていますか?

cacert.pemはシステムによってはテスト用のCA証明書のことがありますが、それをトラストストアとして指定しても意味はありません。

cacert.pemに信頼するルートCA証明書の束が入っている場合はOKです。ただしその中にGeoTrust Global CAのルートCA証明書(シリアル番号0x23456)があることが前提です。

手動だとうまく行って、cronからだと失敗する理由がいまいちわからないのですが、ちょっと想像してみたのは、.bashrcなどで環境変数SSL_CERT_DIRやSSL_CERT_PATHを指定しているのだろうかとか...

```ruby
url = 'https://play.google.com/store/apps/collection/topgrossing'
```

このURLにブラウザから接続して、証明書パスを見てみると次のようになっていました。

- GeoTrust Global CA
- Google Internet Authority G2
- *.google.com

ですので証明書パスを検証するには、ローカルなトラストストアに**GeoTrust Global CA**のルートCA証明書(シリアル番号0x23456)が入っている必要があります。

まず下の箇所ではシステム標準のトラストストアを使わせようとしていますが、これが使えないということでしょうか?

```ruby
http.cert_store.set_default_paths
```

次に下の箇所でcacert.pemをトラストストアに追加しようとしていますが、これは上の設定が効かないためにやっている、という理解ですが、それでよいでしょうか?

```ruby
abc = File.dirname(__FILE__) + '/cacert.pem'
http.cert_store.add_file(abc)
```

ちなみにcacert.pemの中身はどうなっていますか?

cacert.pemはシステムによってはテスト用のCA証明書のことがありますが、それをトラストストアとして指定しても意味はありません。

cacert.pemに信頼するルートCA証明書の束が入っている場合はOKです。ただしその中に**GeoTrust Global CA**のルートCA証明書(シリアル番号0x23456)があることが前提です。

手動だとうまく行って、cronからだと失敗する理由がいまいちわからないのですが、ちょっと想像してみたのは、.bashrcなどで環境変数SSL_CERT_DIRやSSL_CERT_PATHを指定しているのだろうかとか...