独自CA(認証局)を構築する ~ OpenSSL
先ず、クライアント認証に対応したサーバーのSSL化に必要な証明書を作成する必要があるため、認証局を自前で構築します。使用OSは CentOS 6.5、作成時の OpenSSL のバージョンは openssl 0.9.8e で Heartbleed の影響はありません。
	
	
 独自CA(認証局)の立ち上げ
 CentOS6 の場合は /etc/pki ディレクトリにCAディレクトリが作成された状態にありますが、CA作成スクリプト CA.pl をつかって CAを作成します。
	- /etc/pki/
 
	-  ./CA
 
	-  ./certs
 
	-  ./crl
 
	-  ./newcerts
 
	-  ./private
 
openssl-perl は,難解な証明書の作成手順を簡素化するスクリプトです。本稿では、独自CAを作成する場合にだけ使用します。
 # yum install openssl-perl
	/etc/pki/tls/misc に CA.pl がインストールされます。
	CA.pl スクリプトのパラメータを必要に応じて修正します。
# cp -a /etc/pki/tls/misc/CA.pl /etc/pki/tls/misc/CA.pl.ori
# vi /etc/pki/tls/misc/CA.pl
以下、修正した箇所です。
/etc/pki/tls/misc/CA.pl
	$SSLEAY_CONFIG=$ENV{"SSLEAY_CONFIG"};
$DAYS="-days 365";      # 1 year
$CADAYS="-days 1095";   # 3 years
$REQ="$openssl req $SSLEAY_CONFIG";
$CA="$openssl ca $SSLEAY_CONFIG";
$VERIFY="$openssl verify";
$X509="$openssl x509";
$PKCS12="$openssl pkcs12";
 
DAYS:サーバー証明書の有効期間はデフォルトで1年
	CADAYS:CA認証局の有効期間はデフォルトで3年
openssl.cnf の編集 
  ここではCA管理者の立場で openssl を操作します。独自CAの立ち上げにあたって、openssl.cnf を修正する必要があります。
# cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.ori
	
	# vi /etc/pki/tls/openssl.cnf
basicConstraints の部分を以下の2箇所を次のように変更します。
/etc/pki/tls/openssl.cnf
	[ usr_cert ]
basicConstraints=CA:TRUE
	[ v3_ca ]
		nsCertType = sslCA, emailCA
 
CA(認証局)作成スクリプトの実行
 上記、準備が整ったら CA.pl を実行します。
 # /etc/pki/tls/misc/CA.pl -newca
	CA certificate filename (or enter to create)
Making CA certificate ...
	Generating a 2048 bit RSA private key
	.............................................................................................+++
	...........+++
	writing new private key to '/etc/pki/CA/private/cakey.pem'
	Enter PEM pass phrase: ← CAのパスフレーズ
	Verifying - Enter PEM pass phrase: パスフレーズの確認
	-----
	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) [XX]:JP
	State or Province Name (full name) []:Tokyo
	Locality Name (eg, city) [Default City]:Tokyo
	Organization Name (eg, company) [Default Company Ltd]:Hoge Hoge Honpo ← 組織名
	Organizational Unit Name (eg, section) []:design ←部署名
	Common Name (eg, your name or your server's hostname) []:hogehoge.net ← サーバーのホストネーム
	Email Address []: ← そのままEnter
Please enter the following 'extra' attributes
	to be sent with your certificate request
	A challenge password []: ← そのままEnter
	An optional company name []: ← そのままEnter
	Using configuration from /etc/pki/tls/openssl.cnf
	Enter pass phrase for /etc/pki/CA/private/cakey.pem: ←先程設定したCAのパスフレーズを入力
	Check that the request matches the signature
	Signature ok
	Certificate Details:
	Serial Number: xxxxxxxxxxxxxx (xxxxxxxxxxxxxx)
	Validity
	Not Before: Aug  1 10:57:11 2014 GMT
	Not After : Jul 29 10:57:11 2024 GMT
	Subject:
	countryName               = JP
	stateOrProvinceName       = Tokyo
	organizationName          = Hoge Hoge Honpo
	organizationalUnitName    = design
	commonName                = hogehoge.net
	X509v3 extensions:
	X509v3 Subject Key Identifier: 
	xxxxxxxxxxxxxxxxxxxxxxxxxxxx
	X509v3 Authority Key Identifier: 
	keyid:xxxxxxxxxxxxxxxxxxxxxxxxxxxx
 X509v3 Basic Constraints: 
	CA:TRUE ← これポイント。
	Netscape Cert Type: 
	SSL CA, S/MIME CA ← これポイント。
	Certificate is to be certified until Jul 29 10:57:11 2024 GMT (365 days)
Write out database with 1 new entries
	Data Base Updated
	##################
最後に証明書の内容がコンソールに出力されますので確認して下さい。後々の署名作業など証明書の発行手続きの度に、CAのパスフレーズが求められますので、忘れないようにして下さい。
以下のファイルが生成されるので、644のパーミッションを600に変更します。
	- /etc/pki/CA/private/cakey.pem  … CA秘密鍵
 
	-  /etc/pki/CA/cacert.pem … CA自己署名証明書
 
	-  /etc/pki/CA/careq.pem … CSR(署名要求書)
 
	- /etc/pki/CA/newcerts/xxxxxxxxxxxx.pem
 
# chmod 600 /etc/pki/CA/private/cakey.pem
	# chmod 600 /etc/pki/CA/cacert.pem
	# chmod 600 /etc/pki/CA/careq.pem
	# chmod 600 /etc/pki/CA/newcerts/*.pem
CA で管理している証明書の確認とCA秘密鍵の扱い
	
以上でCA(認証局)は構築できました。署名手続きや発行停止手続きなど証明書の作業履歴も兼ねた管理ファイルは以下になります。
/etc/pki/CA/index.txt
> 証明書の内容を表示します
# openssl x509 -in /etc/pki/CA/cacert.pem -text
> 秘密鍵の内容を表示します(パスフレーズが求められます)
# openssl rsa -in /etc/pki/CA/private/cakey.pem -text
> CSRの内容を表示します
# openssl req -in /etc/pki/CA/careq.pem -text
	もし、/etc/pki/CA/private/cakey.pem が第三者の手に渡れば、全く同じCAが他人によって運用される事になります。
これは暗号化通信が意味を成さなくなるだけでなく、なりすまし等のリスクについてのブラウザが警告を出す機能が意味を成さなくなってしまいます。
インターネットと接した WEBサーバーなどCAが同一のサーバーである場合は、必要な証明書の作業が終れば /etc/pki/CA/private/cakey.pem は、USBメモリなどの外部デバイスに退避させて、同一のCAが外部で立ち上げられるリスクを下げるなどの対策をしたほうが良いと思います。
クライアント用CA証明書の作成
必須の作業ではありませんが、クライアントにこのCAは信頼の置けるCAだと信頼してもらうために、配布する証明書をここで作成しておきます。
クライアント側でこの証明書で事前に信頼できる認証局として登録しておけばブラウザは警告を出しませんが、ブラウザによっては警告を出さない例外の認証局として登録が出来る物もあります。その場合。このファイルは必要はありません。
メーラーなどのクライアントではその様に出来ないクライアントもありますので、これらは必要に応じて作成して提供します。
ブラウザに信頼のおけるCAということでブラウザに登録してもらうことにより、ブラウザは警告を出さなくなります。以前、これをネットで配布している人を見かけましたが、不特定多数に提供する目的で利用すべきではありません。
# cd /etc/pki/CA
	# openssl x509 -in cacert.pem -out cacert.crt
 der形式の証明書を生成します
# openssl x509 -inform pem -in cacert.pem -outform der -out ca.der
作成された ca.der は、ここで作成した CA を信頼の置ける認証局であると登録してもらうための証明書になります。
最近のメールクライアントやブラウザは、これらの証明書が無くても、例外的に信頼できる認証局として明示的に受け入れる、つまり、今後、警告を出さないようにするか確認が求められるので、基本的にここで作成した ca.der は不要です。そのように出来ない場合に利用します。
先に話したように、ベリサインなど公的の信頼される認証機関は、既にこの様な証明書がブラウザに事前に登録されているため、公の機関から取得したサーバー証明書を用いてSSL通信を行っているサイトに対しては、ブラウザはなりすまし等の警告を出すことがない、という認識で良いと思います。
 	
		
目次 2 / 6