Login

オンライン中

We have 17 guests and no members online

eagle1jp

自己認証局によるサーバ認証

自己認証局によるサーバ署名要求への署名

サーバ証明書を入手するには、インターネット上への公開を目的とするサーバの場合にはベリサインなどの商用認証局によって承認された証明書を入手する必要があります。 しかし、社内のWeb掲示板や社内メールサーバの場合、利用者が組織内の人間に限られる利用者の環境に自己CAの証明書をインポートするなどの工夫をすることで、有償のCAを使うことなくサーバ証明書を使って行う暗号化などが利用できることです。
以下ではOpenSSLを使った自己認証局の建て方と、サーバ署名要求(CSR)への署名のおこないかたを説明します。

 

1.openssl.cnf を認証局用に作成する

署名要求書(CSR)の作成の際にも編集した openssl.cnf ですが、これを認証局用に編集します。 オリジナルは残しておいた方が良いので、openssl_server.cnf というファイルで作成します。

 (Debian, Ubuntuの場合)
$ sudo cp /etc/ssl/openssl.cnf /etc/ssl/openssl_server.cnf 

(Redhat, CentOSの場合)
# cp /etc/ssl/openssl.cnf /etc/ssl/openssl_server.cnf 

作成した openssl_server.cnf を以下のような条件で自己認証局(CA)用に編集していきます。

設定内容設定値
 認証局(CA)の証明書の有効期限7300日(約20年) 
証明書の有効期限
3650日(約10年) 
CA関連のデータディレクトリ
/etc/ssl/CA 
CA用のプライベートキーファイル
cakey.pem 
CA証明書のファイル
cacert.pem
CAのプライベートキーのパスフェーズ
******
カントリー名 
JP
県(州)名
Tokyo
地域名
oote-machi 1,Chiyodaku-ku
組織名
Hogehoge corp.
所属名
-

 ※証明書の有効期限について利用している環境によって注意が必要です。 伝統的なUnixのTime関数では、1970/1/1を起点にlong int型にて日付の計算を行っていますが、その限界が2028年にきてしまいます。
このため、証明書の期間で2028年を越えるような日付を指定してしまうと、その証明書がいきなり無効になってしまう結果になります。 有効期限は取りあえず2028年にならない程度にすることをお勧めします。
 

/etc/ssl/openssl_server.cnf

   ;;
####################################################################
[ ca ]
default_ca      = CA_default            # The default ca section


####################################################################
[ CA_default ]


# dir          = ./demoCA
dir           = /etc/ssl/CA
         # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#unique_subject = no                    # Set to 'no' to allow creation of
   ;;
   ;;
default_days=3650                     # several ctificates with same subject.
   ;;
   ;;
# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = optional
organizationName        = match
     ::
[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = JP
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Tokyo

localityName                    = oote-machi 1,Chiyodaku-ku

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Hogehoge corp.
     
organizationalUnitName          = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
   ;;
   ;;
emailAddress                    = Email Address
emailAddress_max                = 64     ::
   ;;
[ usr_cert ]
basicConstraints=CA:FALSE
nsCertType      = server
   ;;
 

openssl.cnfの「basicConstraints」「nsCertType」と違うことに注意してください。 

 

2.CA作成スクリプトとの実行

続いて、CA作成用のスクリプトを実行しCAを構成します。 OpenSSLでは一般的にCA.shおよびCA.plというCA作成用のスクリプトが用意されている筈で、どちらを使ってもCAが作成できますが、CA.plはPerlの環境が無いと動かないため、本資料ではCA.shを使った例を説明します。(Redhat、CentOSではCA.shではなく /etc/pki/tls/misc/CA というファイルになっています。)

/usr/lib/ssl/misc/CA.sh (/etc/pki/tls/misc/CA) を変更
   ;;
# DAYS="-days 365"      # 1 year
# CADAYS="-days 1095"   # 3 years
DAYS="-days 3650"    # 10 year
CADAYS="-days 7300"  #  20 years
REQ="$OPENSSL req $SSLEAY_CONFIG"
CA="$OPENSSL ca $SSLEAY_CONFIG"
VERIFY="$OPENSSL verify"
X509="$OPENSSL x509"

# CATOP=./demoCA
CATOP=/etc/ssl/CA
CAKEY=./cakey.pem
CAREQ=./careq.pem
CACERT=./cacert.pem

    ;;

編集が出来たならスクリプトを実行します。

(Debian,Ubuntuの場合)
$ sudo mkdir /etc/ssl/CA
$ sudo /usr/lib/misc/CA.sh -newca

(Redhat,CentOSの場合)
# mkdir /etc/ssl/CA
# /etc/pki/tls/misc/CA -newca

以下のような画面が表示されるので、質問に答えていきます。

CA certificate filename (or enter to create)   <---- 上位のCAの証明書が有る場合に指定する。今回は何もないので[Enter]
Making CA certificate ...
Generating a 1024 bit RSA private key
...++++++
................++++++
writing new private key to '/etc/ssl/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) [JP]: <--- JPのままで良いので[Enter]
State or Province Name (full name) [Tokyo]: <--- Tokyoで良いのでそのまま[Enter]
oote-machi 1,Chiyodaku-ku  []: <--- oote-machi 1,Chiyodaku-ku のままで良いので[Enter]
Organization Name (eg, company) [Hogehoge corp. ]: <--- Hogehoge corp. で良いので[Enter]
Organizational Unit Name (eg, section) []: [Enter]
Common Name (eg, YOUR name) []: ca.example.jp     <--- CAサーバのDNS上の正式名
Email Address []: This email address is being protected from spambots. You need JavaScript enabled to view it.
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 /usr/lib/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/CA/private/./cakey.pem: <---先程設定したパスフェーズを入力
Check that the request matches the signature
Signature ok
  ;;
  ;;
Write out database with 1 new entries
Data Base Updated
#

 Common Name(ここでは"ca.example.jp")は、必ずDNSに登録されている名前を指定してください。

作成したCAの証明書の内容は以下のコマンドで確認できます。

(Debian,Ubuntuの場合)
$ sudo openssl x509 -in /etc/ssl/CA/cacert.pem -text

(Redhat,CentOSの場合)
# openssl x509 -in /etc/ssl/CA/cacert.pem -text

以上で認証局の準備は完了です。(簡単ですね!)
後は、各サーバの署名要求書(CSR)がメールやUSBやFDなどで送られてくるのを待つだけです。
なお、ここで作成したCA(自己認証局)は当たり前ですが、インターネット上の商用CA(Verisign等)のように信用されたCAとして認識されていません。 そのため、このCAにて署名されたサーバ証明書を使ったサイトへアクセスすると「信頼されていない認証局の証明書」である旨の警告を常に告げられます。
これを避けるには、Windowsがクライアントの場合には自己認証局を信頼できる認証局であると登録すれば、それ以後は警告が表示されないようになります。
Windowsに信頼できる認証局として登録させるには、まず認証局の証明書をWindows用(DER形式の証明書)に作成します。

■Windows用のCAの証明書の作成方法

(Debian,Ubuntuの場合)
$ sudo openssl x509 -inform pem -in /etc/ssl/CA/cacert.pem -outform der -out /etc/ssl/CA/cacert.cer

(Redhat,CentOSの場合)
# openssl x509 -inform pem -in /etc/ssl/CA/cacert.pem -outform der -out /etc/ssl/CA/cacert.cer

これで作成された"cacert.cer"ファイルをWindows側でルート証明書としてインポートすれば、以後はこの自己認証局で証明されたサーバ証明書は、信頼された認証局のものとして扱われます。
インポートは、[コントロールパネル]-[インターネットオプション]-[コンテン ツ]-[証明書]-[信頼されたルート証明書]タブを開き、[インポート]ボタンを選択します。インポートするファイルとして cacert.cer を指定します。証明書を配置する場所を確認してくるので、「証明書をすべて次のストアに配置する」を選択して「信頼されたルート証明機関」を選びます

 


 なお、WebブラウザにFirefoxを利用する場合、ルート証明書の管理はFirefox自体で行っているので、Firefoxの[ツール]ー[オプション]ー[詳細]で[暗号化]ー[証明書を表示]を選択して、同じようにルート証明書としてインポートを実行してください。

3.署名要求書に署名する手続き

各サーバからの署名要求書(CSR)への署名は以下の手順でおこないます。

(Debian, Ubuntuの場合)
$ sudo openssl ca -config /etc/ssl/openssl_server.cnf -in csrファイル名 -keyfile /etc/ssl/CA/private/cakey.pem -cert /etc/ssl/CA/cacert.pem -out server.pem

(Redhat, CentOSの場合)
openssl ca -config /etc/ssl/openssl_server.cnf -in csrファイル名 -keyfile /etc/ssl/CA/private/cakey.pem -cert /etc/ssl/CA/cacert.pem -out server.pem

この結果、CSRファイルに対するCAの署名付きのサーバ証明書ファイル「server.pem」が作成されます。 作成されたファイルを、CSRの送りもとに返却すれば証明書への署名手続きは完了です。
CSRの送りもとは、server.pemを適当なファイル名にして、利用するサーバソフトで証明書として指定すればSSL(TSL)を使った通信ができるようになります。

 

 

 


 

OpenSSLによる電子証明書の入手

Webブラウザを使ったeショッピングサイトを利用すると「保護されたページ」として鍵マークが表示されたページが現れるのを見たことがあると思います。 このようなページから入力されたデータはSSLという方法によって暗号化されたデータでサーバとの間でデータのやり取りが行われます。 この暗号化の為に利用されるのがOpenSSLで、OpenSSLはSSLまたはTLSによる暗号化セッションを実現させます。 ApacheやPostfix 、dovecotといったサーバソフトでは、OpenSSLを利用することで、クライアントとサーバ間のデータの暗号化が可能になります。
OpenSSLによる暗号化のためには、サーバソフトを動かすマシン上でそのマシンの電子証明書をCA(認証局)より取得する必要があります。 電子証明書の取得は次の手順で行います。

1.プライベートキー(秘密鍵)の作成

電子証明書を入手するには最初に電子証明書を使いたいマシン上に暗号化の生成の基になるプライベートキーを用意する必要があります。 プライベートキーは次の方法で作成できます。(ランダムデータ生成用として/var/log/messageを使いましたが、内容がユニークになるファイルであれば何を指定しても構いません)

(Debian, Ubuntuの場合)
$ sudo openssl genrsa -aes256 -rand /var/log/messages -out /etc/ssl/private/server.key 1024   ---(暗号方法をDES3にしたい場合は"-aes256"の代わりに"-des3"を指定してください。またキー長は1024以外でも指定できます。(通常は1024で問題ないです))

(Redhat, CentOSの場合)
# openssl genrsa -aes256 -rand /var/log/messages -out /etc/ssl/private/server.key 1024

以下のように表示されるので、パスフェーズ(パスワード)を入力します。

Generating RSA private key, 1024 bit long modulus
......++++++
..........................++++++
e is 65537 (0x10001)
Enter pass phrase for /etc/ssl/private/server.key: パスフェーズを入力
Verifying - Enter pass phrase for /etc/ssl/private/server.key: 確認の為もう一度パスフェーズ入力  

 

 

作成するプライベートキーのファイル名は(ここでは"server.key"としてますが)どんな名前でも構いません。ただし、重要なファイルなのでアクセス権が制限されたディレクトリに保存するようにしてください。
これで、プライベートキーの作成は完了です。 ただし、このキーは暗号化された状態で、このキーをサーバでそのまま利用するとサーバの起動時にパスフレーズを求めてきてしまいますので、暗号化を解除したキーも作成しておきます。

(Debian, Ubuntuの場合)
$ sudo openssl rsa -in /etc/ssl/private/server.key -out /etc/ssl/private/nopass_server.key

(Redhat, CentOSの場合)
# openssl rsa -in /etc/ssl/private/server.key -out /etc/ssl/private/nopass_server.key


以下のように表示されるので、パスフェーズ(パスワード)を入力します。

Enter pass phrase for /etc/ssl/private/server.key: パスフェーズを入力
writing RSA key
#

 

 

(トピック)
OpenSSLによるプライベートキー作成の際に、暗号化の方式として、「des」「des3」「aes128」「aes192」「aes256」の中から選択できます。 方式としては現在のところ「aes256」が最強と云われています。

 

2.署名要求書(CSR)の作成

(1).openssl.cnfの編集

最初にOpenSSL用の設定ファイルを自身の環境に合わせて編集しておきましょう。

/etc/ssl/openssl.cnf

   ;;
####################################################################
[ ca ]
default_ca      = CA_default            # The default ca section


####################################################################
[ CA_default ]


# dir          = ./demoCA
dir           = /etc/ssl/CA
         # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#unique_subject = no                    # Set to 'no' to allow creation of
   ;;
   ;;
default_days=3650                     # several ctificates with same subject.
   ;;
   ;;
# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = optional
organizationName        = match
     ::
[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = JP
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Tokyo

localityName                    = oote-machi 1,Chiyodaku-ku

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Hogehoge corp.
     
organizationalUnitName          = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
   ;;
   ;;
emailAddress                    = Email Address
emailAddress_max                = 64     ::
   ;;
[ usr_cert ]
# basicConstraints=CA:FALSE
basicConstraints=CA:TRUE
   ;;
 

openssl.cnfを編集しなくても署名要求書を作成することはできます。 ただ、要求書を作成の度に同じ内容を打ち込むのはばからしいので、最初にopenssl.cntを編集しておくことをお勧めします。

(2).署名要求書(CSR)ファイルの作成

プライベートキーを基に、認証機関(CA:ベリサイン、自己認証局等)に認証して貰うための署名要求書(CSR)ファイルを作成します。  以下のコマンドを実行してCSRを作成します。(期間を10年分で要求します)

(Debian, Ubuntuの場合)
$ sudo openssl req -new -days 3650 -key /etc/ssl/private/server.key -out /etc/ssl/www_csr.pem

(Redhat, CentOSの場合)
# openssl req -new -days 3650 -key /etc/ssl/private/server.key -out /etc/ssl/www_csr.pem

以下のような画面が表示されるので、必要な箇所で入力を行います。

nter pass phrase for /etc/ssl/private/server.key : 先ほどのパスフェーズを入力
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]: [Enter]
State or Province Name (full name) [Tokyo]: [Enter]
oote-machi 1,Chiyodaku-ku []: [Enter]
Organization Name (eg, company) [Hogehoge corp.]: [Enter]
Organizational Unit Name (eg, section) []: [Enter]
Common Name (eg, YOUR name) []: www.example.jp
Email Address []: This email address is being protected from spambots. You need JavaScript enabled to view it.

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: [Enter]
An optional company name []: [Enter]
#


作成する署名要求書のファイル名は(ここでは"www_csr.key"としてますが)どんな名前でも構いません。ただし、CSRを作成する際に聞かれる"Common Name"にはDNSに登録されている名前と同じものを使う必要があるので、何を指定したかが判るようにファイル名を付けると良いと思います。 

作成された 署名要求書(www_csr.pem)を認証局(CA)に送って電子証明書をつくってもらいます。 社内だけの利用で証明書を自己CAにて認証を行いたい場合には「自己認証局によるサーバ署名要求への署名」の方法を参考にしてください。 なお、(ベリサイン等)正式なCAの認証を受ける場合には、CSRと一緒に会社の登記簿や社長印なども併せて必要になる事があります。 どんな書類が必要かは依頼するCAのホームページなどで確認してください。

 

セキュリティ情報

JVN サイト新着ならびに更新情報

広告