Carpe Diem

備忘録。https://github.com/jun06t

ブラウザにルート証明書のインストール

SSLは2通りの役割があります。 ①通信の暗号化 ②サイトの信頼証明(正しい接続先であることを信頼できる) ①は自己証明書(オレオレ証明書)でも利用できます。一方②は自己証明書では役割を果たせていません。 今回はCA証明局を開設し、CA証明書をブラウザにインストールすることで②を実現します。 ◆別に暗号化されてれば良くない? そんなことはないです。以下に問題となる例を示します。 例1:無線を使用している場合) 無料のアクセスポイントを発見 ↓ 実は偽のサイトに繋がるようDNSが改竄されている ↓ 銀行サイトにアクセス(実は偽の銀行サイト) ↓ 個人情報を入力(盗聴されている) となります。もし信頼証明がちゃんとしたサイトなら、「銀行にアクセス」の時点で「偽サイトのサーバ証明書内のCA証明書と、ブラウザ標準のCA証明書が一致しない」=「このサイトは信頼されてない嘘のサイトだよ」と教えてくれます。 例2:DNSサーバがハッカーによって改ざんされた場合) DNSが改竄されているため、偽のサイトに飛ばされる ↓ 銀行サイトにアクセス(実は偽のサイト) ↓ 個人情報入力(盗聴されている) となります。先ほどと同じく、信頼証明がされていればこのような問題は起きません。 ◆ルート証明局の開設 では以下方法。まずはルート証明局の開設 $ cd /usr/lib/ssl/misc $ sudo ./CA.sh –newca CA certificate filename (or enter to create) Making CA certificate ... Generating a 1024 bit RSA private key ......++++++ ...++++++ writing new private key to './demoCA/private/./cakey.pem' Enter PEM pass phrase:yyyy ← 任意。認証局秘密鍵のパスワードになる Verifying - Enter PEM pass phrase:yyyy ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP   # 国 State or Province Name (full name) [Some-State]:Tokyo   # 地域(県) Locality Name (eg, city) :Tokyo   # 都市 Organization Name (eg, company) [Internet Widgits Pty Ltd]:○○   # 組織名 Organizational Unit Name (eg, section) :IT Solution    # 組織の部門 Common Name (eg, YOUR name) :www.○○○.com   # サーバーのFQDN(ホスト名) Email Address :xxx@yahoo.co.jp   # 管理者アドレス Please enter the following 'extra' attributes to be sent with your certificate request Enter pass phrase for ./demoCA/private/./cakey.pem:yyyy ← 認証局秘密鍵のパスワード Check that the request matches the signature Signature ok Certificate Details: ~先ほど入力した内容~ Write out database with 1 new entries Data Base Updated これでルート証明局を開設できました。demoCAフォルダにいくつかのファイルが作成されています。 ◆サーバ側秘密鍵作成 $ cd /etc/ssl/ $ sudo mkdir serverSSL $ cd serverSSL $ sudo openssl genrsa -aes256 -out server.key 2048 秘密鍵からパスフレーズ削除します。 $ sudo openssl rsa -in server.key -out server.key 秘密鍵から証明書要求(中間証明書ともいいます)を作成 $ sudo openssl req -new -days 3650 -key server.key -out server.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP   # 国 State or Province Name (full name) [Some-State]:Tokyo   # 地域(県) Locality Name (eg, city) :Tokyo   # 都市 Organization Name (eg, company) [Internet Widgits Pty Ltd]:○○   # 組織名 Organizational Unit Name (eg, section) :IT Solution    # 組織の部門 Common Name (eg, YOUR name) :www.○○○.com   # サーバーのFQDN(ホスト名) Email Address :xxx@yahoo.co.jp   # 管理者アドレス 次の部分は'extra'なので入力不要です。 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password : An optional company name : ◆CA認証局によって署名し、サーバ証明書を生成 $ cd /usr/lib/ssl/misc $ sudo openssl ca -config /etc/ssl/openssl.cnf -in /etc/ssl/serverSSL/server.csr -keyfile /usr/lib/ssl/misc/demoCA/private/cakey.pem -cert /usr/lib/ssl/misc/demoCA/cacert.pem -out /etc/ssl/serverSSL/server.crt Enter pass phrase for /usr/lib/ssl/misc/demoCA/private/cakey.pem:yyyy ← 認証局秘密鍵のパスワード Check that the request matches the signature Signature ok Certificate Details: ~~~~~~~~~~ Certificate is to be certified until Nov 18 06:13:06 2013 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated もしこのコマンドで failed to update database TXT_DB error number 2 と表示される場合はCAに対する証明書要求を一旦 revoke(失効、無効化)してから、再度、SSL証明書の作成を実行すれば、成功します。 $ sudo openssl ca -revoke /usr/lib/ssl/misc/demoCA/newcerts/xxxx.pem または demoCA/index.txt を削除して空ファイルを作ればOKです。 $ sudo rm demoCA/index.txt $ sudo touch demoCA/index.txt ちゃんと署名されたものか確認します。 $ sudo openssl verify -CAfile demoCA/cacert.pem /etc/ssl/serverSSL/server.crt server.crt: OK ◆CA証明局の証明書をブラウザにインストールできる形式に変換 demoCA/cacert.pem がCA証明局のCA証明書です。これを各ブラウザがインストールできる形式に変換します。 $ sudo openssl x509 -inform PEM -outform DER -in demoCA/cacert.pem -out demoCA/cacert.der できたら公的なリポジトリに公開するか、サイトの公開対象が特定ならその人達に直接配布してください。 ◆ブラウザにインストール Firefoxの場合 ツール→オプション→詳細→暗号化→証明書を表示 認証局証明書タブ→インポート で、自己証明局のCA証明書 cacert.der を選択してOKします。証明書の信頼性の設定ができますが、すべてチェックをいれてOKです。 Chromeの場合 設定→詳細設定を表示 HTTPS/SSLの証明書の管理→信頼されたルート証明機関→インポート .der ファイルが表示されていないので、ファイルの種類を「すべてのファイル」に変更して cacert.der を選択。 インストールしたらブラウザを再起動する必要があります。また履歴が残っているとうまくいかないので削除しておきましよう。 ◆実験 Chromeで試しました。 ①ブラウザにCA証明書をインストールしてない caSSL01.png よくあるオレオレ証明書の画面ですね。たとえ例外で承認しても、アドレスバーには×マークがつきます ②ブラウザにCA証明書をインストール caSSL02.png アドレスの×マークが消えました。 ③ブラウザにインストールした状態で、サーバ証明書を変更してみる(仮想の偽サイト) caSSL03.png 偽サイトと判断されてアクセス不可になります。 ソース: 自己認証局(自己CA)によるサーバ証明書の作成 on Ubuntu 12.04 (64bit) SSL証明書の作成での failed to update database TXT_DB error number2 発生時の対処 opensslコマンド OpenSSLでの自己認証局(CA)と自己証明書の作成