スポンサーリンク

このドキュメントの内容は、以下の通りです。

はじめに


インターネットでウェブサイトを閲覧するときに、ウェブブラウザを利用して、ウェブサーバと通信して、ウェブサーバから情報を取得して、ウェブブラウザで情報を表示しています。
このウェブブラウザとウェブサーバの通信では、HTTPプロトコルという約束ごとで通信が行われます。プライバシーや安全性の目的で、暗号化されたHTTPSが利用されています。HTTPSを利用することで、通信が暗号化され、通信経路において、通信の内容を誰かに見られたりすることがなくなるということです。

HTTPSの通信では、TLS で経路を暗号化し、その暗号化されたトンネルの中で HTTPプロトコルの通信が行われます。 TLS では、SSL証明書と呼ばれる電子証明書が利用され、サーバの真正性や暗号化の処理が行われます。

OpenSSL は、TLS や暗号化でよく利用されるライブラリやコマンドのソフトウェアです。OpenSSL は、世界中の Linux などの Unix で利用されています。今回の記事では、 OpenSSL コマンドのエラーについて紹介します。

TLSで何が行われるのか?


HTTPSの通信を行うときに、ウェブブラウザは、ウェブサーバとの間に、TLSのネゴシエーションを行います。そのときに、ウェブブラウザが動いているOSやウェブブラウザ自信が管理しているルート証明書のリストが利用されます。HTTPSに対応しているウェブサーバは、認証局によって発行された証明書を持っています。ウェブブラウザは、サーバからSSL証明書を受け取って、ルート証明書のリストを利用して、SSL証明書の検証を行います。サーバ証明書を発行した認証局の情報がルート証明書のリストにないときに、検証が失敗することになります。

OpenSSLコマンドのエラーについて


OpenSSLコマンドには、さまざまなオプションがあり、TLS通信のクライアントとして利用したり、ファイルの暗号化や復号化などを行うことができます。OpenSSLはウェブブラウザではありませんが、HTTPSに対応しているウェブサーバ(TLSサーバ)に接続して、リクエストを送信し、レスポンスを受け取ることができます。

ウェブサーバのTLSについて確認を行いたいときに、OpenSSL コマンドを利用して、ウェブサーバのTLSに関する情報を取得するといった使い方をすることがあります。

さて、今回の例では、OpenSSLコマンドでSSL証明書を取得するときに以下のエラーが出ました。
% openssl s_client -connect login.yahoo.co.jp:443 -showcerts >/tmp/login
depth=1 /C=JP/O=Betrusted Japan Co., Ltd./CN=Cybertrust Japan Public CA
verify error:num=20:unable to get local issuer certificate
verify return:0
read:errno=0


証明書を発行した認証局(CA)のルート証明書が、 OpenSSL コマンドが参照しているルート証明書のリストに存在してないから、上記のエラーが出たと考えられます。
場合によっては、中間認証局の証明書がなくて、エラーになるケースも考えられます。

証明書を発行する場合、中間認証局から発行されていたり、複数の中間認証局が使われていることもありますが、中間認証局の証明書は、ウェブサーバ側から配信することで、クライアント側に中間認証局の証明書がなくても、エラーにならずに通信できます。

エラーの対処方法


このエラーの対処方法は、以下の方法があると考えられます。

  • ルート証明書のファイルをOpenSSLコマンドに指示する
  • 認証局の証明書をルート証明書のリストに追加する
ウェブサーバ側の場合では、もし中間認証局の証明書を設定することで解決するケースもあるかもしれません。

FreeBSD の場合は、 [2011-01-27-1] の ca_root_nss でインストールされるルート証明書を指定することで、エラーは発生しなくなります。

OpenSSLコマンドにルート証明書のリストを指定する方法


openssl コマンドにルート証明書のリストを指定して実行する場合には、 -CAfile オプションを利用します。

コマンドラインは以下の通りです。 /path/to/root-ca.crt は、任意のパスに変更してください。
openssl s_client -CAfile /path/to/root-ca.crt -connect fqdn:443 -showcerts

ルート証明書のリストは、OSによってファイルのパスが異なります。
ここでは、 FreeBSDLinuxの Ubuntu や CentOS を例に挙げます。

Ubuntu の場合は、 ca-certificates のパッケージをインストールした状態で、 /etc/ssl/certs/ca-certificates.crt を利用すればよいでしょう。

/etc/ssl/certs/ca-certificates.crt


CentOS の場合は ca-certificates のパッケージをインストールします。
以下の crt を利用すればよいでしょう。

/etc/pki/tls/certs/ca-bundle.crt


下記は FreeBSD の場合の例になります。
FreeBSD には、 ca_root_nss というパッケージが提供されています。このパッケージをインストールすることで、 ルート証明書のリストがインストールされます。

% openssl s_client -CAfile /usr/local/share/certs/ca-root-nss.crt -connect login.yahoo.co.jp:443 -showcerts > /tmp/login
depth=2 /C=US/O=GTE Corporation/OU=GTE CyberTrust Solutions, Inc./CN=GTE CyberTrust Global Root
verify return:1
depth=1 /C=JP/O=Cybertrust Japan Co., Ltd./CN=Cybertrust Japan Public CA G1
verify return:1
depth=0 /C=JP/ST=Tokyo/L=Minato-ku/O=Yahoo Japan Corporation/OU=l07.login.kks.2010/CN=login.yahoo.co.jp
verify return:1
read:errno=0


参考


ca_root_nss については、 [2007-12-18-2] をご参照ください。
参照しているページ (サイト内): [2011-01-27-1]

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー