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証明書をインストールしてない

よくある
オレオレ証明書の画面ですね。たとえ例外で承認しても、アドレスバーには×マークがつきます
②ブラウザにCA証明書をインストール

アドレスの×マークが消えました。
③ブラウザにインストールした状態で、
サーバ証明書を変更してみる(仮想の偽サイト)

偽サイトと判断されてアクセス不可になります。
ソース:
自己認証局(自己CA)によるサーバ証明書の作成 on Ubuntu 12.04 (64bit)
SSL証明書の作成での failed to update database TXT_DB error number2 発生時の対処
opensslコマンド
OpenSSLでの自己認証局(CA)と自己証明書の作成