OpenSSLの1.0.1~1.0.1f、1.0.2-beta~1.0.2-beta1について脆弱性が確認されています。~
対象となるバージョンを利用されている場合には、早急にアップデートもしくはHearbeatオプションを除外してリコンパイルしましょう。~
鍵ファイル、パスワードは再発行しましょう。~
[[JPCERT>https://www.jpcert.or.jp/at/2014/at140013.html]]
----
#contents

* 目的 [#bee53ac7]
OpenSSLを利用してPKI環境を構築する。~
Linuxはubuntu14.04.01を利用。本稿記述時点でのバージョンは1.0.1f
 [ubuntu@pki]$  openssl
 OpenSSL> version
 OpenSSL 1.0.1f 6 Jan 2014
 OpenSSL>

* PKIの基本 [#p58be964]

** PKI(Public Key Infrastructure)公開鍵基盤 [#r9bb1767]
公開鍵の方式を利用して、アクセス対象の真正性を保証し、通信を行う仕組み。らしい。~
厳密な定義はよくわかりません。
[[IPAの記事:http://www.ipa.go.jp/security/pki/index.html]]などを
読んでおかなきゃとおもいつつ、読めてません。

* 導入方法 [#m9b4712e]

** インストール [#v40f492b]
#これだけ!
 [ubuntu@pki ~]$ sudo apt-get update
 [ubuntu@pki ~]$ sudo apt-get install openssl

** コマンドの基本的な使い方 [#m548bf14]

*** 通常利用するコマンド [#g0fa71ee]
秘密鍵を作成する。
 openssl genrsa -out key.pem [暗号化方式] [ビット長]
 暗号化方式は -des -des3 -aes128 -aes192 -aes256 など

秘密鍵に対応した署名要求を作成する。
 openssl req [-config conffile] -new -key key.pem -out req.pem

CSRにサインして、証明書を作成する。
 openssl ca  [-config conffile] -in req.pem -out crt.pem

秘密鍵とCSRを同時に作成することも可能
 openssl req -new -newkey rsa:1024 -keyout key.pem -out req.pem

証明書要求を確認する。
 openssl req -text -noout -in req.pem

証明書を確認する。
 openssl x509 -text -noout -in crt.pem


*** 簡易的に利用する場合 [#x909e038]
既存の秘密鍵を利用し、CSRを作成せずに自己署名証明書を生成する。
 openssl req -new                  -key    key.pem -x509 -days 365 -out crt.pem

新規の秘密鍵を生成し、CSRを作成せずに自己署名証明書を生成する。
 openssl req -new -newkey rsa:1024 -keyout key.pem -x509 -days 365 -out crt.pem

*** そのほかよく使うコマンド例 [#j954d33a]
秘密鍵からパスフレーズを削除する場合
 openssl rsa -in serverkey.pem -out serverkey.pem

再度署名しようとしても、エラーでできない場合は、一旦無効化する必要がある。
 grep XXX RootCA/newcerts/*
 openssl ca -revoke ./newcerts/01.pem -keyfile private/RootCA_key.pem -cert RootCA_crt.pem

証明書から不要な情報(Certificate:~~)を除去
 openssl x509 -in crt.pem -out crt.pem

証明書からバイナリ形式作成
 openssl x509 -inform pem -in crt.pem -outform der -out crt.der

秘密鍵は秘密のフォルダに移動し、誰にも見られないようにする。
 mkdir private
 mv key.pem private
 chmod 400 key.pem

コマンド実行時に unable to write 'random state'と表示され、署名できない、などの場合
 rm $HOME/.rnd


* PKIの構築 [#lb6e6e3b]

** 構築する内容 [#l70e3cd0]
-ルート認証局
-中間認証局
-サーバ証明書(ルート認証局から発行)
-端末証明書(中間認証局から発行)

- CA.shスクリプトの利用
ubuntuの場合、/usr/lib/ssl/misc/CA.sh にCAを簡単に構築できるスクリプトがある。~
これを利用することも可能だが、上記のコマンドの一連を自動的に実施しているのみである。~
その場合、コンフィグファイルの指定や有効期限などはCA.shを編集する必要がある。


** OpenSSLコンフィグファイル [#ff2d72cb]
- 前準備
 それぞれの用途に合わせてファイルを作成しておく
 [ubuntu@pki ~/ca]$ mkdir configs
 [ubuntu@pki ~/ca]$ cd configs

- 署名要求用ファイル
 [ubuntu@pki ~/ca/configs]$ vi openssl_req.cnf
 [ req ]
 distinguished_name      = req_distinguished_name
 
 [ req_distinguished_name ]
 countryName                     = Country Name (2 letter code)
 countryName_default             = JP
 
 stateOrProvinceName             = State or Province Name (full name)
 stateOrProvinceName_default     = Tokyo
 
 0.organizationName              = Organization Name (eg, company)
 0.organizationName_default      = Prosper2
 
 organizationalUnitName          = Organizational Unit Name (eg, section)
 organizationalUnitName_default  =
 
 commonName                      = Common Name (e.g. server FQDN or YOUR name)
 commonName_max                  = 64
 commonName_default              =


- 署名用ファイル
 [ubuntu@pki ~/ca/configs]$ vi openssl_sign.cnf
 [ ca ]
 default_ca      = CA_default
 
 [ CA_default ]
 dir             = ./              
 certs           = $dir/certs            
 crl_dir         = $dir/crl              
 database        = $dir/index.txt        
 new_certs_dir   = $dir/newcerts         
 serial          = $dir/serial           
 crlnumber       = $dir/crlnumber        
 crl             = $dir/crl.pem          
 RANDFILE        = $dir/private/.rand    
 
 name_opt        = ca_default            
 cert_opt        = ca_default            
 
 default_days    = 365                   
 default_crl_days= 30                    
 default_bits    = 2048               
 default_md      = sha256               
 preserve        = no                    
 policy          = policy_match
 
 [ policy_match ]
 countryName             = match
 stateOrProvinceName     = match
 organizationName        = match
 organizationalUnitName  = optional
 commonName              = supplied
 emailAddress            = optional
 
 [ v3_ca ]
 subjectKeyIdentifier=hash
 authorityKeyIdentifier=keyid:always,issuer
 basicConstraints=CA:true
 keyUsage = cRLSign,keyCertSign
 
 [ v3_server ]
 subjectKeyIdentifier=hash
 authorityKeyIdentifier=keyid,issuer
 basicConstraints = CA:FALSE
 keyUsage = nonRepudiation, digitalSignature, keyEncipherment
 extendedKeyUsage = serverAuth
 
 [ v3_client ]
 subjectKeyIdentifier=hash
 authorityKeyIdentifier=keyid,issuer
 basicConstraints = CA:FALSE
 keyUsage = nonRepudiation, digitalSignature, keyEncipherment
 extendedKeyUsage = clientAuth

** プライベート認証局(ルート認証局)の作成 [#a9a24e27]
-~~/ca/RootCAに作成するものとする。
 [ubuntu@pki ~ca]$ mkdir ~/ca/RootCA
 [ubuntu@pki ~ca]$ cd ~/ca/RootCA

- CAとして運用に必要なファイルとフォルダを作成しておく
 [ubuntu@pki ~/ca/RootCA]$ mkdir newcerts
 [ubuntu@pki ~/ca/RootCA]$ mkdir private
 [ubuntu@pki ~/ca/RootCA]$ echo "01" > serial
 [ubuntu@pki ~/ca/RootCA]$ echo "00" > crlnumber
 [ubuntu@pki ~/ca/RootCA]$ touch index.txt

- 秘密鍵の作成
 [ubuntu@pki ~/ca/RootCA]$ openssl genrsa -out private/RootCA_key.pem -aes256 2048
 Generating RSA private key, 2048 bit long modulus
 .......................................+++
 ......................+++
 e is 65537 (0x10001)
 Enter pass phrase for private/RootCA_key.pem:
 Verifying - Enter pass phrase for private/RootCA_key.pem:
 [ubuntu@pki ~/ca/RootCA]$

- 秘密鍵をつかって署名要求を作成
 [ubuntu@pki ~/ca/RootCA]$ openssl req -config ../configs/openssl_req.cnf -new -key private/RootCA_key.pem -out RootCA_csr.pem
 
 Enter pass phrase for private/RootCA_key.pem:
 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) [JP]:JP
 State or Province Name (full name) []:Tokyo
 Organization Name (eg, company) []:Prosper2
 Organizational Unit Name (eg, section) []:RootCA
 Common Name (e.g. server FQDN or YOUR name) []:Prosper2 RootCA
 [ubuntu@pki ~/ca/RootCA]$

>単純にCSRを作成するだけで、「CAの」CSRといっているわけではない。次の手順でCA用にサインしているだけだ。

- 秘密鍵と署名要求をつかって証明書を作成(証明書へのサインは自己署名)
 [ubuntu@pki ~/ca/RootCA]$ openssl ca  -config ../configs/openssl_sign.cnf -keyfile private/RootCA_key.pem -batch -days 30 -selfsign -extensions v3_ca -in RootCA_csr.pem -out RootCA_crt.pem 
 Using configuration from ../configs/openssl_sign.cnf
 Enter pass phrase for private/RootCA_key.pem:
 Check that the request matches the signature
 Signature ok
 Certificate Details:
         Serial Number: 1 (0x1)
         Validity
             Not Before: Mar 16 14:48:26 2015 GMT
             Not After : Apr 15 14:48:26 2015 GMT
         Subject:
             countryName               = JP
             stateOrProvinceName       = Tokyo
             organizationName          = Prosper2
             organizationalUnitName    = RootCA
             commonName                = Prosper2 RootCA
         X509v3 extensions:
             X509v3 Subject Key Identifier:
                 05:9B:24:34:C7:40:96:B5:D8:BC:00:F7:53:D1:23:FE:91:D6:41:F4
             X509v3 Authority Key Identifier:
                 keyid:05:9B:24:34:C7:40:96:B5:D8:BC:00:F7:53:D1:23:FE:91:D6:41:F4
 
             X509v3 Basic Constraints:
                 CA:TRUE
             X509v3 Key Usage:
                 Certificate Sign, CRL Sign
 Certificate is to be certified until Apr 15 14:48:26 2015 GMT (30 days)
 
 Write out database with 1 new entries
 Data Base Updated
 [ubuntu@pki ~/ca/RootCA]$ 


** プライベート認証局(中間認証局)の作成 [#wb660c8e]
-~~/ca/InterCAに作成するものとする。
 [ubuntu@pki ~ca]$ mkdir ~/ca/InterCA
 [ubuntu@pki ~ca]$ cd ~/ca/InterCA

- CAとして運用に必要なファイルとフォルダを作成しておく
 [ubuntu@pki ~/ca/InterCA]$ mkdir newcerts
 [ubuntu@pki ~/ca/InterCA]$ mkdir private
 [ubuntu@pki ~/ca/InterCA]$ echo "01" > serial
 [ubuntu@pki ~/ca/InterCA]$ echo "00" > crlnumber
 [ubuntu@pki ~/ca/InterCA]$ touch index.txt

- 秘密鍵の作成
 [ubuntu@pki ~/ca/InterCA]$ openssl genrsa -out private/InterCA_key.pem -aes256 2048
 Generating RSA private key, 2048 bit long modulus
 ............................................+++
 ........+++
 e is 65537 (0x10001)
 Enter pass phrase for private/InterCA_key.pem:
 Verifying - Enter pass phrase for private/InterCA_key.pem:
 [ubuntu@pki ~/ca/InterCA]$

- 秘密鍵をつかって署名要求を作成
 [ubuntu@pki ~/ca/InterCA]$  openssl req -config ../configs/openssl_req.cnf -new -key private/InterCA_key.pem -out InterCA_csr.pem
 Enter pass phrase for private/InterCA_key.pem:
 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) [JP]:JP
 State or Province Name (full name) []:Tokyo
 Organization Name (eg, company) []:Prosper2
 Organizational Unit Name (eg, section) []:InterCA
 Common Name (e.g. server FQDN or YOUR name) []:Prosper2 InterCA
 [ubuntu@pki ~/ca/InterCA]$

- 署名要求をルートCAへ送付
同一ホストの別ディレクトリで構築しているだけなので、単純にファイルコピーでOK。
遠隔ホストであれば、scpやテキストをコピペでもOK
 [ubuntu@pki ~/ca/InterCA]$ mkdir ../RootCA/certs
 [ubuntu@pki ~/ca/InterCA]$ cp InterCA_csr.pem ../RootCA/certs

- ルートCAで署名要求にサイン
 [ubuntu@pki ~/ca/InterCA]$ cd ../RootCA
 [ubuntu@pki ~/ca/RootCA]$ openssl ca -config ../configs/openssl_sign.cnf  -keyfile private/RootCA_key.pem -batch -days 30 -cert RootCA_crt.pem -extensions v3_ca -in certs/InterCA_csr.pem -out certs/InterCA_crt.pem 
 Using configuration from ../configs/openssl_sign.cnf
 Enter pass phrase for private/RootCA_key.pem:
 Check that the request matches the signature
 Signature ok
 Certificate Details:
         Serial Number: 2 (0x2)
         Validity
             Not Before: Mar 16 14:58:06 2015 GMT
             Not After : Apr 15 14:58:06 2015 GMT
         Subject:
             countryName               = JP
             stateOrProvinceName       = Japan
             organizationName          = Prosper2
             organizationalUnitName    = InterCA
             commonName                = Prosper2 InterCA
         X509v3 extensions:
             X509v3 Subject Key Identifier:
                 B3:59:A6:2E:6B:A3:4F:D8:4C:08:BC:CB:97:9D:F9:14:D3:64:1F:DC
             X509v3 Authority Key Identifier:
                 keyid:05:9B:24:34:C7:40:96:B5:D8:BC:00:F7:53:D1:23:FE:91:D6:41:F4
 
             X509v3 Basic Constraints:
                 CA:TRUE
             X509v3 Key Usage:
                 Certificate Sign, CRL Sign
 Certificate is to be certified until Apr 15 14:58:06 2015 GMT (30 days)
 
 Write out database with 1 new entries
 Data Base Updated
 [ubuntu@pki ~/ca/RootCA]$ cp certs/InterCA_crt.pem ../InterCA
 [ubuntu@pki ~/ca/RootCA]$ cd ../InterCA


** 証明書チェーンの作成 [#rfe83e24]
-~~/ca/以下に中間証明書からルートへたどれる様にチェーン化しておく
 openssl x509 -in ~/ca/InterCA/InterCA_crt.pem -out ~/ca/InterCA_crt_tmp.pem
 openssl x509 -in ~/ca/RootCA/RootCA_crt.pem -out ~/ca/RootCA_crt_tmp.pem
 cat ~/ca/InterCA_crt_tmp.pem ~/ca/RootCA_crt_tmp.pem > ~/ca/chainCA_crt.pem
 rm ~/ca/InterCA_crt_tmp.pem ~/ca/RootCA_crt_tmp.pem -f



以降はサーバ証明書によるサーバ正当性確認、クライアント証明書による接続クライアントの正当性確認。
または、[[FreeRADIUSとCisco機器を利用した802.1X認証#n526cb69]]を参照のこと。
~
~
~
#counter



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS