本日はLinuxの備忘録記事です。
ちょっとトラブったので忘れないように備忘録として残しておきます。
まあ、おんなじトラブルが発生しても備忘録したことすら忘れてまたあたふたするんですけどね
経緯
弊社で動作しているバッチサーバにて、なぜかいきなりエラーが出力されるようになりました。
調査を進めると、どうやらhttps通信に失敗している模様。
試しにcurlで検証してみると、以下のようなエラーメッセージが出力されました。
$ curl -I https://hogehoge.sample.com curl: (60) Peer certificate cannot be authenticated with known CA certificates 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.
なんかCA証明書の認証ができない?とか言われている模様。
調べてみると、「root証明書が古いと出るよ」とか「日付がサーバとクライアントでずれてるときに出るよ」とか、「opensslのバージョンが古いと出るよ」とか書いてあったのですが、後半2つは違ったので、root証明書が古いんでは?とあたりをつけて解決方法を模索しました。
環境
$ cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.0 (Santiago)
古すぎ問題
まあ、こういうサーバって中々更改できるもんじゃないよなあ・・・
解決手順
最新のroot証明書をダウンロードする
$ wget http://curl.haxx.se/ca/cacert.pem
適当なところに保存しておきましょう。
証明書を置き換え
置き換える前に現在の証明書をバックアップしておきます。
切り戻し手段を用意しておくことは重要。
# cp /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-bundle.crt_bk
RHEL系のサーバは /etc/pki/tls/certs にroot証明書が配置されております。
ので、ここの証明書ファイルを入れ替えてあげればOKです。
# cp -p cacert.pem /etc/pki/tls/certs/ca-bundle.crt
これで完了。
確認
$ curl -I https://hogehoge.sample.com HTTP/1.1 302 Found
無事通信できるようになりました。
まとめ
- CA証明書エラーが出たらroot証明書を疑う
- 違ったらサーバとクライアントの日付をチェック
- それでも直らなければopensslをupdateする
たぶんCentOS系でも同じ手段で解決できるはずです。
証明書の保存ディレクトリとかは違うと思いますが・・・
コメント