Armadilloフォーラム

curlによるhttps通信

mkohei1122

2016年8月10日 14時42分

機種:Armadillo-IoTG2
Linuxカーネル:Linux 3.14.36-at7
ユーザーランド:atmark-dist v1.49.0 v20160527
ATDE:ATDE v20160225

Armadillo-IoT G2に組みこまれているcurlコマンドで、
https通信を行いたいのですが、動作することができませんでした。
どなたかご指導いただければ幸いです。

下記を試しましたが60番のエラーとなります。-k オプションをつけて、
証明書の真偽確認を無視すれば、通信することはできますが、
このオプションなしで行いたいと考えて
おります。

0.証明書がない場合。
  デフォルトでは証明書なしでエラー

# curl https://www.google.co.jp
curl: (77) error setting certificate verify locations:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none

ちなみに証明書の真偽確認を無視すれば、エラーなし

# curl -k https://www.google.co.jp

 

1.証明書の追加
https://armadillo.atmark-techno.com/forum/armadillo/1175
を参考に、/etc/configの下に展開

-k オプションで、最初は証明書の真偽を無視し、-o で指定のファイル名にリネーム

curl -k https://curl.haxx.se/ca/cacert.pem -o /etc/config/ca-certificates.crt

 

/etc/ssl/certsディレクトリの作成
# mkdir /etc/ssl
# mkdir /etc/ssl/certs

リンクの作成

ln -s /etc/config/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt

2.https通信の実行
エラー番号60(証明書のエラー)で終了。

# curl https://www.google.co.jp
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html
 
curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

なお、curlのバージョンは下記になっておりました。

 
# curl -V
curl 7.26.0 (arm-unknown-linux-gnueabi) libcurl/7.26.0 OpenSSL/1.0.1e zlib/1.1.4
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP

以上です。

コメント

溝渕です。

動作確認していないので動くかどうかわかりませんが、

> リンクの作成
> ln -s /etc/config/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt

の後に、

export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

を実行し、curlコマンドを実行してみていただけますか?

以上、宜しくお願いします。

森です。

返答ありがとうございます。

下記のコマンドを試してみましたが、同じくエラー番号60番がでてだめでした。

なお、ポート開放を疑い、iptablesを下記のように、
一時的に開放してみましたが、同じ60番のエラーでした。

#iptables -A INPUT -i umts0 -j ACCEPT
#iptables -A OUTPUT -o umts0 -j ACCEPT

以上です。

溝渕です。

"https://www.google.co.jp"にアクセスするには、Googleが発行した証明書で
ある必要があったりしませんかね?

ちなみに、Linux PCで使っている証明書を使うとArmadilloでも
"https://www.google.co.jp"にアクセス可能でした。

Google以外であれば、https通信可能でした。手順は次の通りです。

[aiot ~]# ntpclient -s -h ntp1.tohoku.ac.jp
[aiot ~]# curl https://users.atmark-techno.com/
curl: (77) error setting certificate verify locations:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none
[aiot ~]# wget http://curl.haxx.se/ca/cacert.pem
[aiot ~]# export CURL_CA_BUNDLE=/root/cacert.pem
[aiot ~]# curl https://users.atmark-techno.com/

以上です。

三原といいます。

> "https://www.google.co.jp"にアクセスするには、Googleが発行した証明書で
> ある必要があったりしませんかね?

*.google.co.jp の証明書は、Google が中間認証局ですが、ルート認証局は GeoTrust Global CA (serial number: 02:34:56) です。Firefox で証明書を確認したダイアログのスクリーンショットを添付します。

GeoTrust Global CA のルート証明書を保持していれば証明書を検証できるはずです。

Armadillo-IoT G2 を購入していないのでユーザランドをダウンロードできませんでしたが、/etc/ssl/certs/ca-certificates.crt に GeoTrust Global CA (serial number: 02:34:56) は含まれているのでしょうか?

ファイル ファイルの説明
google_tls_cert.png https://www.google.co.jp/ の電子証明書を Firefox で確認したダイアログのスクリーンショット

森です。

ご返答ありがとうございます。
確かに、証明書の問題のようです。

https://curl.haxx.se/ca/cacert.pemに、GeoTrust Global CAは
含まれているようですが、うまくいっていないようです。

実は、Google以外に、GeoTrust クイックSSL プレミアムを使用している
サイトに接続したいのですが、その中間証明書(GeoTrust DV SSL CA)等を
証明書ファイルに追記してみましたが、うまくいきませんでした。
もしかすると、GeoTrust系がうまくいっていないのかもしません。

そこで、下記のGoogleのQ&Aに記載されいる、root証明書をいれてみましたところ、
うまくいきました。

https://pki.google.com/faq.html
-What roots should we trust for connecting to Google?
のところに記載されおり、root証明書は、直リンクすると下記です。
https://pki.google.com/roots.pem

Googleのroot証明書の置き場のアドレスが今後変更される可能性がありますが、
下記で、Google, GeoTrust クイックSSL プレミアムを使用しているサイト、
https://users.atmark-techno.com/に接続することができました

# curl -k https://pki.google.com/roots.pem -o /etc/config/ca-certificates.crt
# mkdir /etc/ssl
# mkdir /etc/ssl/certs
# ln -s /etc/config/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt

SSLの通信は、セキュリティ対策で日々更新されて、脆弱性が放置されているものは、
ともするとサーバー側でブロックされて通信ができなくなってしまう場合もあるので、
長期運用の組込機器の場合は、メンテンナンスに課題がありますね。

以上です。

三原といいます。

解決してよかったです。
ただ、あとから読む方のために一言書かせていただきます。

> 実は、Google以外に、GeoTrust クイックSSL プレミアムを使用している
> サイトに接続したいのですが、その中間証明書(GeoTrust DV SSL CA)等を
> 証明書ファイルに追記してみましたが、うまくいきませんでした。

中間証明書はルート証明書リストに追加しても効果を持たないんです。

・中間証明書は SSL/TLS 通信を行う度に Web サーバから送信される(送信されなければ Web サーバの設定ミス)
・中間証明書は自己証明でないため、自身では信頼の鎖の起点となれない

通常、数少ないルート証明書から多数の中間証明書が発行されます。このとき、機器にルート証明書をインストールしておけば、そこから発行された中間証明書は全て有効になります。

ルート証明書リストに中間証明書を入れないのが、管理を安全・確実に行うコツです。

森です。

ご返答ありがとうございます。
組みこみ機器の場合は、特に重要ですね。
参考にさせていただきます。