OpenSSL使用例 

OpenSSL(読み方:オープン エスエスエル)とは、各種暗号化アルゴリズムをサポートするオープンソースで、 これで、認証局の開設や、サーバー証明書の作成などさまざま実装で使われます。
多くのLinuxやBSDディストリビューションにおいては、オペレーティングシステムの一部をなしているような使われ方をしています。Windowsでもこれ(http://www.openssl.org/related/binaries.html)をインストールすることで使えます。
このページ内の操作説明の概要
まず、本当の認証局(CA)の代わりに使うダミー認証局の公開鍵方式の秘密鍵を作ります。 これで、各種の署名を行うためです。
次に、そのダミー認証局の秘密鍵のペアである公開鍵用のx509証明書発行要求を作ります。
次に、それからx509証明書を作ります。本来なら正当なCAに依頼するところですが、お金がかかるので ダミーの自己署名として作ります。
後は、メール暗号に使う「クライアント証明書」と 「クライアント秘密鍵とクライアント証明書をペアにした「PKCS#12の自己証明書」をで作成します。 これはメーラーの署名や復号に使われます。

ステップ1 OpenSSL使用例 ダミー認証局構築

ダミー認証局の秘密鍵生成と、管理

後で、この秘密鍵を使って署名をします。その時、openssl.cnfのファイル内容にしたがって行われます。 このopenssl.cnfでは、いくつかのディレクトリの設定を必要とします。それを次のように作成します。
本来は、suまたはキー管理者が、行う操作ですが、一般ユーザーでも実験できるように、~/etc の下で作業します。

$ mkdir ~/etc/CA
$ cp /etc/ssl/openssl.cnf ~/etc/CA
$ mkdir ~/etc/CA/private
$ mkdir ~/etc/CA/newcerts
$ touch ~/etc/CA/index.txt
$ echo "01" > ~/etc/CA/serial

そしてコピーしたopenssl.cnfを上記の設定にあわせるように編集します。 この実験で使ったopenssl.cnfは、このリンクで確認できます。
この変更はdir = ~/etc/CA # Where everything is kept の箇所だけですが、上記の設定と合わない部分は追加変更してください。
また、実際に作る場合は、~/etc/CAの箇所でホームディレクトリに~を使う表現ではなく、 上記にあわせた絶対パス(例:/home/tarou/etc/CA)の表現を指定してください。そうしないとステップ3の署名で失敗するようです。

そして次の操作で、ダミー認証局の秘密鍵を、 ~/etc/CA/private/cakey.pem のパスで生成します。
(-rand ./serialは好ましくない! -rand /var/log/boot.logのように乱数になりえる素材を指定すべきであるが、su以外でも実験できるように ./serialを指定している。)

$cd ~/etc/CA
~/etc/CA$ openssl genrsa -rand ./serial -out ~/etc/CA/private/cakey.pem 1024
0 semi-random bytes loaded
Generating RSA private key, 1024 bit long modulus
............++++++
...++++++
e is 65537 (0x10001)
~/etc/CA$ 

上記は大事な秘密鍵なので、本来であればアクセス権限などのセキュリティ対策が必要です。

ダミーCAの証明書作成とその署名(自己署名のCA証明書ファイルを作る)

さて次は、このcakey.pemからCA証明書発行要求(CSR:Certificate Signing Request)のca.csrを新規で作成します。次のコマンドです。

~/etc/CA$ openssl req -new -key ~/etc/CA/private/cakey.pem -out ./ca.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) []:Shinjuku-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:dummyCA
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:test
Email Address []:test@dummy.ne.jp

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
yuu@valax:~/etc/CA$ 

~/etc/CA$ 

以上で、ca.csrができました。これを上位層となるCAに依頼して証明書を発行してもらうことで、本来の認証局になりえるのですが、 ダミー認証局なので、ルート認証局と同じように自己の秘密鍵で署名します。
この操作で、本来は/etc/ssl/openssl.cfgを利用するのでしょうが、ここでは上記でコピー編集した~/etc/CA/openssl.cnfを 指定します。これで署名に、これに書かれる秘密鍵が利用されます。 以下で、x509形式でca.csrをcakey.pemを使って署名し、cacert.pemという自己署名のCA証明書ファイル作る 証明書ファイルの拡張子では、cacert.crtの名前が一般的であるが、/etc/ssl/openssl.cnf内のcertificate=の指定に合わせて/etc/CA/cacert.pemを指定した。

~/etc/CA$ openssl x509 -req -in ~/etc/CA/ca.csr -signkey ~/etc/CA/private/cakey.pem -out ~/etc/CA/cacert.pem -days 730
Signature ok
subject=/C=JP/ST=Tokyo/L=Shinjuku-ku/O=dummyCA/CN=test/emailAddress=test@dummy.ne.jp
Getting Private key
~/etc/CA$

以上で作成された認証局証明書ファイル(cacert.pem)は、 このダミー認証局で署名したファイルの検証用として公開するものとなります。
そして、このルート認証局であるダミー認証局で署名した、様々な証明書を利用する場合、 この認証局証明書ファイル(cacert.pem)をあらかじめOSやアプリケーションにインポートしてから利用する形態になります。

ステップ2 ダミーCAの証明書作ファイル(cacert.pem)をメールソフト Thunderbirdにインポートする。

「認証局A」が署名した証明書を使う場合、「認証局A」が中間認証局で、その上位証明局がすでにアプリケーションなどにインポート済みであれば、 その証明書がすぐに利用できます。しかし、未インストールであれば、ルート認証局からインポートしなければないませんし、 それを信用するか十分に精査しなければなりません。 以下で、上記で作成したダミーCAの証明書作ファイル(cacert.pem)をメールソフト Thunderbirdにインポートする例を示します。 Thunderbirdはここよりダウンロードして使った例です。これをインストールしたフォルダに、 認証局証明書ファイル(cacert.pem)をダウンロードしておきます。


これが、Thadarbird起動画面で、メール相手に示す自分の名前と、メールアドレスと、POPサーバー接続に使うパスワードを入力して、 「続ける」のボタンをクリックした後の画面です。 場合によって、「間違いがある指摘」がでることもあります。
その際は「手動設定」のボタンをクリックして設定します。



サーバーを検索して正しいユーザが見つかればサーバー名やユーザ名を表示して 「続ける」のボタンが「アカウント作成」のボタンに変ります。
それをクリックすると、暗号化されていないサーバであれば、その旨の警告が出現します。 その中の「接続する上での危険性を理解しました」のチェックを入れて、再び「アカウント作成」ボタンクリックします。 場合によって「セキュリティ例外の追加」ダイアログ出現で「セキュリティ例外を有効にする」のチェックを入れ、 「セキュリティ例外を認証」のボタンをクリックする必要があるようです。
以下は、アカウント設定ダイアログ(「ツール」メニューから「アカウント設定」を選択して出すこともできます。)内の 「セキュリティ」をクリックした状態です。

この画面で「証明書」の「証明書の表示」ボタンをクリックで現れるダイアログが下の画面です。
そして、「認証局証明書」のタグ内にあるインポートボタンで、 上記で作成した認証局証明書ファイル(cacert.pem)を指定します。

ここでは、メールユーザの認証用にチェックをつけています。「証明書の表示」ボタンで、上記で作成した情報が、次のように確認できるでしょう。


リストの中に、dummyCAの証明書名と、証明者名testが確認できるでしょう。 以上で、この認証局で署名した個人証明書がThunderbirdで使えるようになります。

ステップ3 太郎さんへの暗号メールで使う個人証明書(クライアント証明書)と、
自分用の証明書(PKCS#12)を作成する。

秘密鍵と、x509証明書発行要求(CSRのtarou.csrを作成を

まず、自分(太郎さん)が使うキーのディレクトリ(以下の例では、mykeystore)を作成します。 そこに自分(太郎さん)が使う秘密鍵をのtarou.key生成します。

$ mkdir ~/etc/mykeystore
$ cd ~/etc/mykeystore
~/etc/mykeystore$ openssl genrsa -out ./tarou.key 1024
Generating RSA private key, 1024 bit long modulus
......++++++
....++++++
e is 65537 (0x10001)
~/etc/mykeystore$ 

続けて、この秘密キーとペアになる公開鍵のx509証明書発行要求(CSR:Certificate Signing Request)のtarou.csrを作成します。
(赤の部分は、認証局の証明書にあわせます。青は、実際に自分が使うメールアドレスです)

~/etc/mykeystore$ openssl req -new -key  ./tarou.key -out ./tarou.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) []:Suginami-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:dummyCA
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:tarou
Email Address []:tarou@exapmle.me.jp

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
~/etc/mykeystore$ 

x509証明書発行要求(CSR)のtarou.csrを認証局に送って、署名により個人証明書(クライアント証明書)を発行してもらう。

本来は認証局に依頼するところですが、ここでは次のように上記で作ったダミー認証局の秘密鍵で署名します。

~/etc/mykeystore$ openssl ca -config ~/etc/CA/openssl.cnf -out ./tarou-ca.crt -infiles ./tarou.csr
Using configuration from /home/yuu/etc/CA/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Oct  8 14:51:05 2011 GMT
            Not After : Oct  7 14:51:05 2012 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = dummyCA
            commonName                = tarou
            emailAddress              = tarou@exapmle.me.jp
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                4A:83:7D:53:E7:53:2C:95:16:B8:98:BB:FB:81:5B:4C:D1:37:7C:BA
            X509v3 Authority Key Identifier: 
                DirName:/C=JP/ST=Tokyo/L=Shinjuku-ku/O=dummyCA/CN=test/emailAddress=test@dummy.ne.jp
                serial:B7:29:5A:3C:E2:41:5F:5B

Certificate is to be certified until Oct  7 14:51:05 2012 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
~/etc/mykeystore$ 

以上で個人証明書(クライアント証明書)のtarou-ca.crtのファイルができました。 ここからダウンロードできます。 このファイルは公開するなどして、相手に送ります。そして自分(太郎)だけに送る秘密メールの時に使ってもらう形態になります。

ステップ4 太郎さんへの暗号メールを復号する時に使う秘密鍵入りの証明書(PKCS#12)を作成する。

PKCS#12(PKCS#12 の旧称は PFX)は、太郎さん自身の秘密鍵も入っている証明書で、自分のメールソフトにインポートして、復号や署名に使うものです。
次のコマンドで、pkcs12の方法で太郎さんの秘密鍵(tarou.key)と上記で署名した証明書(tarou-ca.crt)を,安全にまとめてexportすることで tarou.p12を作ります。

yuu@valax:~/etc/mykeystore$ openssl pkcs12 -export -out ./tarou.p12 -inkey ./tarou.key -in ./tarou-ca.crt
Enter Export Password:abc123←見えない
Verifying - Enter Export Password:abc123←見えない
~/etc/mykeystore$ 

PKCS#12は鍵と証明書を安全にまとめてexportします。この時、一般にパスワードにより保護,暗号化され、 アプリケーションへ インポートする時にこのパスワードを入力します。
例えば、自分が使うThunderbirdでは、 アカウント設定ダイアログ内のセキュリティをクリックし、その画面で「証明書」の「証明書の表示」ボタンをクリックして 現れるダイアログが下の画面です。そこで「あなたの証明書」のタグ選んでいる状態です。

そして、「インポート」ボタンで、復号や署名に使う上記で作った証明書の を指定します。
  この時のパスワードは「abc123」です。
なお、PKCS#12のファイルフォーマットは、複数の組み込みオブジェクト(例えば複数の証明書を)格納できるコンテナフォーマットで、 Javaの鍵ストアのフォーマットとして利用できるようです。意味はありませんが、JDKのkeytoolコマンドで次のように行うと、 ここでインポートできるものを生成できるようです。
keytool -genkeypair -alias hanako@exapmle.me.jp -keyalg RSA -keysize 1024 -keystore hanako.p12 -storepass abc123 -dname "CN=hanako,OU=school,O=hanaCA,L=denshi,ST=tokyo,C=jp" -validity 365 -storetype pkcs12
さて、以上のX.509証明書で使われるフォーマットは PKCS#12以外にもなまざまあり、以下で拡張子と共に紹介します。

拡張子説明
.crl .p7b .p7c 被署名データのない PKCS#7 のSignedData構造で、証明書 (群) やCRL (群) がある
.cer CER で符号化された証明書、ときによっては証明書群の列
.der DER で符号化された証明書
.pem Base64 で符号化された証明書で、「-----BEGIN CERTIFICATE-----」と「-----END CERTIFICATE-----」で囲まれている
.pfc .p12 公開鍵や、パスワードで保護された 私有鍵を含む PKCS#12 PKCS12

ステップ5 花子さんが、太郎さんへ暗号メールを送る

太郎さんへ暗号メールを出すためには、太郎さんの公開鍵が入っている個人証明書(クライアント証明書)のtarou-ca.crtを インポートする必要があります。正規の個人証明書(クライアント証明書)であれば、太郎さんへの暗号通信がこれだけで可能となります。
しかしこの例ではダミー認証局による個人証明書なので、これをインポートして使うためには、 その正当性を証明する認証局の証明書(ステップ1の認証局証明書ファイル(cacert.pem))もインストールされていなければなりません。 この方法は上記ステップ2に記した方法でインポートします。

個人証明書(クライアント証明書)のインポートの似ています。

「ツール」メニューから「アカウント設定」を選択して出る [アカウント設定ダイアログ]内の 「セキュリティ」をクリックした状態が右の画面ですが、
そこで証明書の「証明書の表示」ボタンをクリックで現れるダイアログで、 「個人証明書」のタグ内を選択した状態が下の画面です。 ここで、「インポート」ボタンにより 太郎さんの個人証明書(クライアント証明書)のtarou-ca.crtを指定します。

以下が、インポート直後で、証明書を確認している状態です。

なお、Thunderbirdの場合は、これだけで暗号送信できません。ステップ4で行ったように、 花子さん自身の秘密鍵入りの証明書(PKCS#12)を「あなたの証明書」としてインポートしていなければなりません。
それがインポート済みであれば、 [アカウント設定ダイアログ]内の「セキュリティ」ダイアログ表示で、次のようにデジタル署名や、暗号の選択ボタンで 花子さん自身の証明書を選択して、署名や暗号するのチェックを入れます。


以上で、太郎さんへの暗号通信ができて、花子さんの署名ができることになります。
これで太郎さんは、花子さんから暗号を復号できるようになります。 但し、太郎さんが署名の検証をするためには、花子さんの「個人証明書(クライアント証明書)がインポートされてなければできません。

さて同様に、鈴木さんの「個人証明書(クライアント証明書)」があるとして彼に暗号メールを行いたいとします。
上記と同じダミー認証局で署名した「個人証明書(クライアント証明書)」は、ここからダウンロードできて、 インポートして使えるはずです。
ですが、こちらの個人証明書をダウンロードしてインポートボタンを押したとします。 この時、次のダイアログがでるでしょう。(過去にインポートしていればでません)

警告のとおりで、この場合は証明書を署名しているCAが未登録の場合でしょう。 このCA証明書をダウンロードしてダウンロードしてインポートすれば、使える可能性が高いのですが、 このようなルート認証局の証明書は安易にインストールすべきではありません。
情報を表示して実在して連絡が取れるかなど、十分に調査すべきです。 場合によって、危険なものがインストールできるようになる可能性があるからです。 なお一般には テキストファイルなので、Windowsであればコマンドプロンプトの type で確認できます。