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クライアント
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
新規に発行した証明書保管用。証明書のファイル名は「
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/
この証明書がサーバ証明書なら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を適宜設定する。
設定内容については以下を参照のこと。
関連資料・記事