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
以上です。
コメント
mkohei1122
at_mizo
溝渕です。
"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/
以上です。
access.mihara
三原といいます。
> "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 で確認したダイアログのスクリーンショット |
mkohei1122
森です。
ご返答ありがとうございます。
確かに、証明書の問題のようです。
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の通信は、セキュリティ対策で日々更新されて、脆弱性が放置されているものは、
ともするとサーバー側でブロックされて通信ができなくなってしまう場合もあるので、
長期運用の組込機器の場合は、メンテンナンスに課題がありますね。
以上です。
access.mihara
三原といいます。
解決してよかったです。
ただ、あとから読む方のために一言書かせていただきます。
> 実は、Google以外に、GeoTrust クイックSSL プレミアムを使用している
> サイトに接続したいのですが、その中間証明書(GeoTrust DV SSL CA)等を
> 証明書ファイルに追記してみましたが、うまくいきませんでした。
中間証明書はルート証明書リストに追加しても効果を持たないんです。
・中間証明書は SSL/TLS 通信を行う度に Web サーバから送信される(送信されなければ Web サーバの設定ミス)
・中間証明書は自己証明でないため、自身では信頼の鎖の起点となれない
通常、数少ないルート証明書から多数の中間証明書が発行されます。このとき、機器にルート証明書をインストールしておけば、そこから発行された中間証明書は全て有効になります。
ルート証明書リストに中間証明書を入れないのが、管理を安全・確実に行うコツです。
mkohei1122
at_mizo
2016年8月10日 15時42分
溝渕です。
動作確認していないので動くかどうかわかりませんが、
> リンクの作成
> ln -s /etc/config/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
の後に、
を実行し、curlコマンドを実行してみていただけますか?
以上、宜しくお願いします。