OpenSSL

2007/10/23更新

対応バージョン: 0.9.8g

CSRに含まれているCNと同じCNを持った証明書が認証局内に既に存在する。

CNを変えたCSRを新たに作成するか、該当CNの証明書が不要ならその証明書を破棄してから再度Self Signを行う。

2007/10/23更新

対応バージョン: 0.9.8g

ハッシュ値の計算にはmd5等のハッシュ計算コマンドが使われるが、OpenSSLでも同様のことができる。

OpenSSLでは以下のハッシュアルゴリズムが使用できる。

MD2
MD4
MD5
MDC2
RMD160(RIPEMD160)
SHA
SHA1

例えばSHA1でファイルのハッシュ値を求めるには以下のようにする。

% openssl sha1 orginal.txt
SHA1(orginal.txt)= 12ce4f10fadac151f5d00e42bf75a9078d71923a

2007/10/23更新

対応バージョン: 0.9.8g

opensslコマンドを使用する。

OpenSSLがサポートする暗号化方式は以下のようにopensslコマンドに未定義のサブコマンドを与えることで確認できる。

% openssl help
openssl:Error: 'help' is an invalid command.

Standard commands
asn1parse    ca           ciphers      crl          crl2pkcs7      
dgst         dh           dhparam      dsa          dsaparam       
ec           ecparam      enc          engine       errstr         
gendh        gendsa       genrsa       nseq         ocsp           
passwd       pkcs12       pkcs7        pkcs8        prime          
rand         req          rsa          rsautl       s_client       
s_server     s_time       sess_id      smime        speed          
spkac        verify       version      x509           

Message Digest commands (see the `dgst' command for more details)
md2          md4          md5          rmd160       sha            
sha1           

Cipher commands (see the `enc' command for more details)
aes-128-cbc  aes-128-ecb  aes-192-cbc  aes-192-ecb  aes-256-cbc    
aes-256-ecb  base64       bf           bf-cbc       bf-cfb         
bf-ecb       bf-ofb       cast         cast-cbc     cast5-cbc      
cast5-cfb    cast5-ecb    cast5-ofb    des          des-cbc        
des-cfb      des-ecb      des-ede      des-ede-cbc  des-ede-cfb    
des-ede-ofb  des-ede3     des-ede3-cbc des-ede3-cfb des-ede3-ofb   
des-ofb      des3         desx         idea         idea-cbc       
idea-cfb     idea-ecb     idea-ofb     rc2          rc2-40-cbc     
rc2-64-cbc   rc2-cbc      rc2-cfb      rc2-ecb      rc2-ofb        
rc4          rc4-40         

例えばAES256 CBCモードで暗号化する場合は以下のようにする。

% openssl aes-256-cbc -e -in original.txt -out encrypt.txt
enter aes-256-cbc encryption password: ***** ← パスワード
Verifying - enter aes-256-cbc encryption password: ***** ← パスワード

同様に、このファイルを復号化するには以下のように-dオプションを指定する。

% openssl aes-256-cbc -d -in encrypt.txt -out decrypt.txt
enter aes-256-cbc decryption password: ***** ← パスワード

2007/10/23更新

対応バージョン: 0.9.8g

/dev/randomが存在しないのが原因なので、パッチ#112438-03を適用して/dev/randomを導入する。

(*) あらかじめパッチを/var/spool/patchに展開しておくこと。

# cd /var/spool/patch/112438-03
# patchadd /var/spool/patch/112438-03
# ln -s /kernel/drv/sparcv9/random /dev/random

2007/10/23更新

対応バージョン: 0.9.8g

openssl.cnfは階層分けされた構造になっている。

何に関する設定かは`[]'で囲まれた名前で示され、その下に具体的な設定が記述される形式になっている。

openssl.cnfは基本的にデフォルトのままでよいが、いくつか変更する可能性のある項目があるのでその部分を中心に説明する。

caセクション

このセクションではデフォルトCAの設定を指定する。

ここではさらにCA_defaultというサブセクションが指定されており、そこに実際の設定を記述する。

31  [ ca ]
32  default_ca      = CA_default            # The default ca section

複数の設定を使い分けたい場合は別のサブセクション(例:CA_alternative)を作り、その下に設定を記述しておいて、必要に応じてcaセクションのdefault_caの値を変えればよい。

CA_defaultサブセクション

このセクションではdirでCAの情報が格納されているディレクトリを指定する。

デフォルトは「./demoCA」となっている。

ここではこの設定をFedora Coreのデフォルトディレクトリである/etc/pki/CAに変更するものとして説明する。

35 [ CA_default ]
36
37 dir             = ./demoCA              # Where everything is kept
 :

尚,この値を変更した場合、misc/CA.shの以下の設定も同様に変更しておく。

42 CATOP=./demoCA

このセクションの最後はCAのポリシーに関する設定である。

76 policy          = policy_match

ポリシーはpolicyで指定されるサブセクションの内容(デフォルトはpolicy_match)が反映される。

policy_matchサブセクション

このセクションではCAが発行する証明書のポリシーを記述する。

79 [ policy_match ]
80 countryName             = match
81 stateOrProvinceName     = match
82 organizationName        = match
83 organizationalUnitName  = optional
84 commonName              = supplied
85 emailAddress            = optional

それぞれの項目はmatch、supplied、optionalのいずれかの値をとる。値の説明については後述する。

ここでCAのポリシーについて説明する。

CAは依頼者からCSR(証明書要求)を受け取って証明書を発行するわけだが、全てのCSRに対して証明書を発行するべきではない。

全く知らない人から来たCSRを本人の身元を確認もせずに発行された証明書は信用度があまりないからである。

そこで、CAではどのようなCSR(証明書要求)に対して証明書を発行するかを決めた「ポリシー」を設定する。

CSRのSubjectの部分がどのような場合に証明書を発行するかについて以下のようにポリシーを設定できる。

match

CAの内容と一致しなければならない

optional

無くてもよい

supplied

なければならない

policy_matchではcountryName,stateOrProvinceName,organizationNameがCAと同一(match)でなければならず、commonNameは必ず記述されていなければならない(supplied)。

またorganizationalUnitNameとemailAddressは有無を問わないのでoptionalとなる。

policy_anythingサブセクション

このセクションはpolicy_matchより緩いポリシーを設定する。

90 [ policy_anything ]
91 countryName             = optional
92 stateOrProvinceName     = optional
93 localityName            = optional
94 organizationName        = optional
95 organizationalUnitName  = optional
96 commonName              = supplied
97 emailAddress            = optional

もしポリシーとしてこちらのほうが好ましい場合は、前述のCA_defaultサブセクションのpolicyの項目を「policy = policy_anything」に変更すればよいことになる。

reqセクション

このセクションはCAへの証明書発行要求に関する設定である。

100 [ req ]
101 default_bits            = 1024
102 default_keyfile         = privkey.pem
103 distinguished_name      = req_distinguished_name
104 attributes              = req_attributes
105 x509_extensions = v3_ca # The extentions to add to the self signed cert

distiguished_name,attributesはそれぞれ証明書の識別子(Distinguished Name:DN)とそのほかの属性に関する設定が記述されているサブセクション名を値とする。

ここではreq_distinguished_nameとreq_attributesがそれぞれのサブセクション名である。

req_distinguished_nameサブセクション

このセクションはそれぞれの要素が取り得るデフォルト値を記述する。この値を変更することにより実際に証明書リクエストを作成する際のデフォルト値を変更することができる。

123  [ req_distinguished_name ]
124  countryName                     = Country Name (2 letter code)
125  countryName_default             = AU ← 国名のデフォルト値(例:JP)
126  countryName_min                 = 2
127  countryName_max                 = 2
128
129  stateOrProvinceName             = State or Province Name (full name)
130  stateOrProvinceName_default     = Some-State ← 都道府県名の
                                                     デフォルト値(例:Chiba)
132  localityName                    = Locality Name (eg, city) ← 区市町村
133
134  0.organizationName              = Organization Name (eg, company)
135  0.organizationName_default      = Internet Widgits Pty Ltd
                                       ← 組織名のデフォルト値(例:Private)

137  # we can do this but it is not needed normally :-)
138  #1.organizationName             = Second Organization Name
139  #1.organizationName_default     = World Wide Web Pty Ltd
140
141  organizationalUnitName          = Organizational Unit Name
142  #organizationalUnitName_default =
143
144  commonName                      = Common Name (eg, YOUR name)
145  commonName_max                  = 64
146
147  emailAddress                    = Email Address
148  emailAddress_max                = 64

usr_certセクション

このセクションはX.509を拡張するためのX.509v3 Extensionの設定である。

159  [ usr_cert ]
  :
166  basicConstraints=CA:FALSE

basicConstraintsは発行する証明書がCAの証明書かどうかを識別する設定である。

Webクライアントやサーバに対して証明書を発行する場合にはこの値はFalseにしておく必要がある。

この設定はX.509v3の標準ExtensionとしてRFC2459で定義されている。

172  # nsCertType                    = server

nsCertTypeは証明書を発行する際にどのような目的で発行するかを定めたもので以下のような値をとる。値は「,」で区切って複数指定可能である。

server

SSLサーバ

client

SSLクライアント

email

S/MIME

objsign

Object Sign

sslCA

SSL CA

emailCA

S/MIME CA

objCA

Object Sign CA

証明書発行の際はこの値を間違えないことが必要である。

その他のパラメータについては割愛する。詳細についてはRFC2459を参照のこと。

2007/10/23更新

対応バージョン: 0.9.8g

Webブラウザにクライアント証明書を組み込む場合、証明書をPKCS#12(*)という形式で読み込むため、pem形式の証明書をPKCS#12形式に変換する必要がある。

(*) PKCS : Public-Key Cryptography Standards (RSA Laboratoriesによる公開鍵暗号関連の規格)

このとき証明書がクライアントで正しく検証できるようCAの証明書もPKCS#12ファイルに組み込む。

% openssl pkcs12 -export -inkey privatekey.pem -in 01.pem \
-certfile cacert.pem -out newcert.pkcs12 

Enter PEM pass phrase: ← クライアント証明書秘密鍵のパスフレーズ
Enter Export Password: ← PKCS#12ファイルのexportパスフレーズ
Verifying password - Enter Export Password: ← 上記パスフレーズの再入力

ここでprivatekey.pemはクライアント証明書の秘密鍵、01.pemはクライアント証明書、cacert.pemはCAの証明書、newcert.pkcs12は出力されたPKCS#12形式のファイルになる。

パスフレーズを聞かれるので公開鍵の持ち主の立場でパスフレーズの入力を行ない、次いでエクスポートのためのパスワードを設定する)。

ここで作った各種ファイルは新しいリクエストを作成すると上書きされてしまうので別の名前に変更して保存するとよいだろう。

尚、newreq.pemとnewcert.pkcs12にはエンティティの秘密鍵が含まれており、所有者やパーミッションの設定を注意して第三者に見られないようにする必要もある。

こうしてできあがったPKCS#12ファイルをクライアントにコピーし、必要なブラウザに証明書をインポートする。

2007/10/23更新

対応バージョン: 0.9.8g

証明書発行の考え方

通常、正式なサーバ証明書は日本ベリサイン等の公の認証局(以下CA)で発行してもらうが、ここではプライベートなCAを作ってサーバ証明書を発行する手順を示す。

まず、CAを構築する際に意識しなければならないことがある。

それは「自分が現在誰の立場で作業を行っているか」である。

例えばCAを構築する際にはCAが自分自身の公開鍵証明書に署名するのだが、この場合には公開鍵の持ち主と公開鍵証明書に署名するCAは同じエンティティ(認証の対象となる主体)ということになる。

従ってリクエストを作成するときや署名する際にも同じパスフレーズ(CAのパスフレーズ)を入力する。

CAの構築 → 証明書リクエスト → 証明書の発行という一連の作業を1人で行なう場合には「自分が今CAなのか、公開鍵の持ち主なのか」という立場を常に意識しておく必要がある。

一般的に「CAの鍵ペアの生成」「CAの公開鍵証明書の発行」「ユーザへの公開鍵証明書の発行」はCA管理者の立場で行ない、「ユーザの鍵ペアの生成」はユーザ自身の立場で行なうと考えればいいだろう。

しかし実際にはユーザーの鍵ペアの生成もCA管理者が代理として行なう場合もある。

CAの鍵ペアの作成

立場

CA管理者

必要なパスフレーズ

CAの秘密鍵パスフレーズ

CAの公開鍵証明書の発行

立場

CA管理者

必要なパスフレーズ

CAの秘密鍵パスフレーズ

ユーザの鍵ペアの作成

立場

ユーザ(CA管理者が代行する場合もある)

必要なパスフレーズ

ユーザの秘密鍵パスフレーズ

ユーザの公開鍵証明書の発行

立場

CA管理者

必要なパスフレーズ

CAの秘密鍵パスフレーズ

CAの構築

まずopenssl.cnfのusr_certセクションにあるnsCertTypeの値を「sslCA」に変更する。

次に実際のCAの証明書の作成であるが、OpenSSLではCAの構築と運用のためのUIとしてCA.shとCA.plというスクリプトが用意されている(/usr/local/ssl/miscに格納)。

どちらも同じUIを提供しているがここではCA.shを使うことにする。

尚、CA.shは内部でopensslコマンドを呼び出すので同コマンド格納ディレクトリ(/usr/local/ssl/bin)にパスを通しておく。

# /usr/local/ssl/misc/CA.sh -newca

CA certificate filename (or enter to create)
← CAの証明書のファイル名を入力するが、ここでは新規作成なのでリターンを押す。

Making CA certificate ...
Generating a 1024 bit RSA private key
........................................++++++
.....................................................................++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase: *** ← CA秘密鍵のパスフレーズ入力
Verifying - Enter PEM pass phrase: *** ← パスフレーズ再入力
:
Country Name (2 letter code) [JP]: ← 国名(例:JP) (*) 必須
State or Province Name (full name) []: ← 都道府県名(例:Tokyo)
Locality Name (eg, city) []: ← 区市町村名(例:Chiyoda)
Organization Name (eg, company) [Private]: ← 組織名/会社名
Organizational Unit Name (eg, section) []: ← 部署名
Common Name (eg, YOUR name) []: ← 組織の通称 (例:PrivateCA) (*) 必須
Email Address []: ← メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ← リターン
An optional company name []: ← リターン
Using configuration from /usr/local/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/./cakey.pem: ← パスフレーズ再入力
Signature ok
Certificate Details:
:
(証明書情報)
:

これでCAを構成するファイル一式が/usr/local/ssl/demoCA配下に作成される。

尚、今回入力したパスフレーズはCAの秘密鍵のパスフレーズで、今後証明書リクエストに対して署名を行なう際に必要となる。

できあがったCAを見るといくつかのファイルとディレクトリが作成されているが、それぞれの内容は以下のとおりである。

ファイル

cacert.pem

CAの自己署名型の公開鍵証明書

同じ内容のファイルがnewcerts/00.pemとしても作成される。

careq.pem

CAが別CAから署名を受けるための要求書

private/cakey.pem

CAの公開鍵証明書(上記cacert.pem)に対応する秘密鍵

index.txt

newcertsディレクトリ内に保管される証明書の通番(nn)と識別名DN(Distinguished Name)との対応表

index.txt.attr

index.txtにて管理する通番に重複を許すかどうかの設定。

・unique_subject = yes : 重複を許さない(デフォルト)

・unique_subject = no : 重複を許す

serial

次に発行する証明書の通番(nn)

ディレクトリ

certs

証明書保管用

crl

失効リスト(Certificate Revocation List)保管用

newcerts

新規に発行した証明書保管用。証明書のファイル名は「.pem」(nnは通番)

private

CAの秘密鍵保管用

サーバ/クライアント証明書リクエストの発行

CAが正しく構築できたら次にどのような目的で証明書を発行するかによって、まずopenssl.cnfのusr_certセクションにあるnsCertTypeの値を変更する。

次に証明書リクエスト(公開鍵/秘密鍵のペア)を作成し、CAに対してその公開鍵証明書に署名してもらう。

したがってこのリクエストの発行は公開鍵の持ち主の立場で行なう。

% /usr/local/ssl/misc/CA.sh -newreq

を実行すると証明書発行のためのリクエストファイルが生成される。

この際、鍵ペアが生成されパスフレーズとDNなど公開鍵証明書に含める情報を聞かれるのでそれらを入力する。

入力が終わるとカレントディレクトリにnewreq.pem(証明書リクエスト)とnewkey.pem(秘密鍵)のペアが作成される。

newreq.pemの内容は以下のコマンドで確認することができる。

% openssl req -in newreq.pem -text 

このファイルをCAに送って認証してもらう。

CAによる署名

上記で作成した証明書に対してCAによる署名を行なう。

このときの立場は再びCA管理者の立場に戻っている。

つまり証明書リクエストを受け取ったCAがこの内容をチェックして証明書の発行を行なうという状況である。

どのディレクトリで行なうかはopenssl.cnfのCA_defaultサブセクションでdirの値をどのように設定しているかによって変わる。

先ほど作成したnewreq.pemをカレントディレクトリに置き、「CA.sh -sign」コマンドを実行するとパスフレーズを聞かれるので、CAの秘密鍵のパスフレーズを入力する。

するとリクエストファイルの内容を表示して署名をしていいかを確認してくるのでここで「y」と答えるとCAは署名を行ない公開鍵証明書を発行する。

# /usr/local/ssl/misc/CA.sh -sign
Using configuration from /usr/local/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem: *** ← CAの秘密鍵のパスフレーズ
Check that the request matches the signature
Signature ok
Certificate Details:
:
(証明書リクエストの内容)
:
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
:
(署名済証明書の内容)
:

(*) 証明書の有効期間はデフォルトで1年(365日)なので、この期間を延ばしたい場合はCA.shの中で実行しているopensslコマンドを手動で実行し、-daysオプションに証明書の有効期間(日)を指定する。

# openssl ca -policy policy_anything -days 3650 -out newcert.pem -infiles newreq.pem

できあがった公開鍵証明書はnewcert.pemという名前で作成され、証明書の内容は以下のコマンドで確認することができる。

% openssl x509 -in newcert.pem -text 

また、同じ内容が./demoCA/newcerts/.pemとしても保存され、認証サマリが./demoCA/index.txtに格納される。

この証明書がサーバ証明書ならHTTPサーバに、クライアント証明書ならWebブラウザに組み込んでおけばよい。

尚、ファイル中の---BEGIN CERTIFICATE---から---END CERTIFICATE---までが実際の証明書で、その他は人間が読むためのものなので証明書の部分だけ切り分けてcert.pem等として保存しておいてもよい。

2008/1/31更新

対応バージョン: 0.9.8g

公式サイト

準備

導入に必要なもの

openssl-0.9.8g.tar.gz

導入OS

Fedora 8

デフォルトでインストールされている関連ファイルは不要なので削除してよい。

/etc/pki/CAディレクトリ配下
/etc/pki/tlsディレクトリ配下
/usr/bin/openssl
/usr/lib/openssl/engines/*
/usr/share/doc/openssl-0.9.8b/*

(*) ただし以下のファイルは他のパッケージが依存しているので削除しないほうがよい。

/lib/libcrypto.so.*

/lib/libssl.so.*

インストール

配布ファイル展開

% tar zxvf openssl-0.9.8g.tar.gz
% cd openssl-0.9.8g

make,インストール

% ./config shared
% make
% make test
: (数分かかる)
`test' is up to date.

% su
# make install

インストール物 (man,infoは除く)

設定ファイル
/usr/local/ssl/openssl.cnf
OpenSSL本体
/usr/local/ssl/bin/c_rehash
/usr/local/ssl/bin/openssl

/usr/local/ssl/lib/engines/*
/usr/local/ssl/lib/libcrypto.*
/usr/local/ssl/lib/libssl.*
/usr/local/ssl/lib/pkgconfig/*

/usr/local/ssl/include/openssl/*
ツール
/usr/local/ssl/misc/CA.pl
/usr/local/ssl/misc/CA.sh
/usr/local/ssl/misc/c_hash
/usr/local/ssl/misc/c_info
/usr/local/ssl/misc/c_issuer
/usr/local/ssl/misc/c_name
認証情報格納ディレクトリ
/usr/local/ssl/certs
/usr/local/ssl/private

各種設定

ldconfigの設定ファイルにOpenSSLのライブラリディレクトリを追加する。

# vi /etc/ld.so.conf.d/openssl.conf
/usr/local/ssl/lib

# /sbin/ldconfig

# /sbin/ldconfig -p | grep /usr/local/ssl
        libssl.so.0.9.8 (libc6) => /usr/local/ssl/lib/libssl.so.0.9.8
        libssl.so (libc6) => /usr/local/ssl/lib/libssl.so
        libcrypto.so.0.9.8 (libc6) => /usr/local/ssl/lib/libcrypto.so.0.9.8
        libcrypto.so (libc6) => /usr/local/ssl/lib/libcrypto.so

openssl.cnfを適宜設定する。

設定内容については以下を参照のこと。

関連資料・記事