UNIXな生活
更新:2004/10/7  
Linuxな生活  FreeBSDな生活
 Solarisな生活
 JAVAな生活
 Practical use
 掲示版
OpenSSLでの自己認証局(CA)と自己証明書の作成

OpenSSLを利用した、自己認証局(CA)の構築と、サーバ証明書の作成手順とApache+mod_SSLでの設定方法についてもご紹介します。

Section.1では、通常のhttps通信を可能とするため、以下の手順を行います。
1.自己認証局(CA)の構築
2.サーバの証明書の作成
3.自己認証局によるサーバ証明書への署名
4.Apache+mod_sslの設定例

Section.2では、Section.1に加えてクライアント認証に利用する証明書の発行方法とApacheの設定例を示します。
1.クライアント認証用証明書の作成
2.Apache+mod_sslでの設定例

 Section.1
 自己認証局(CA)の構築
最初に、自己認証局(以下CA)の構築を行います。なお、CAの構築は/usr/local/CAに行います。
CAを作成するには、OpenSSL付属のCA.shを利用します。
(CA.shは、OpenSSLが/usr/local/opensslにインストールされている場合、/usr/local/openssl/misc/以下にあると思います。)

CA.shをCA作成場所に複製し編集します。
cp CA.sh /usr/local/CA
CA.shは以下の行を修正しておきます。
CATOP=/usr/local/CA  <-----CAの構築場所を指定
CAKEY=/usr/local/CA/private/cakey.pem  <-----CAの秘密鍵の作成場所
CACERT=/usr/local/CA/cacert.pem  <-----CAの証明書の作成場所を指定
default_days=3650  <-----有効機関

次にOpenSSLの設定ファイル(/etc/ssl/openssl.cnf)も同様に修正します。
CATOP=/usr/local/CA
CAKEY=/usr/local/CA/private/cakey.pem
CACERT=/usr/local/CA/cacert.pem
default_days=3650

準備が出来ましたので、CAの構築を行います。
CA.sh -newca
以下の入力情報に適時答えてください。
------------------------------------------------------------------------------
CA cretificate filename (or enter tocreate)  <---上位CAがあれば指定

Enter PEM pass phrase:  <---証明書のパスフレーズを入力
Verifying - Enter PEM pass phrase:  <---証明書のパスフレーズの確認
Country Name (2 letter code) [AU]:  <---国名、通常は'JP'
State or Province Name (full name) [Some-State]:  <---都道府県名を指定
Location Name(eg,city) []:  <---組織の本拠地の市区町村名を指定
Orgnaization Name(eg,company)[Internet Widgits Pty Ltd]:  <---組織名(法人名)を指定
Orgnaization Unit Name(eg,section)[]:  <---部署名を指定
Common Name (eg,YOUR name)[]:  <---サーバのホスト名(FQDN)を指定
Email Address []:  <---連絡先E-Mailアドレスを指定
------------------------------------------------------------------------------
*こんな感じで。
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:AICHI
Location Name(eg,city) []:NAGOYA
Orgnaization Name(eg,company)[Internet Widgits Pty Ltd]:Example Ltd
Orgnaization Unit Name(eg,section)[]:System
Common Name (eg,YOUR name)[]:sv1.example.jp
Email Address []:master@example.jp
これで/usr/local/CA/以下に必要なファイルが作成されCAの作成は終了です。
cacert.pem      =認証機関の証明書
private/cakey.pem  =認証機関の秘密鍵

作成した証明書は以下のコマンドで内容の確認ができます。
openssl x509 -in cacert.pem -text

今作ったのが、PEMフォーマットで、バイナリDERフォーマットにするには以下のようにします。
openssl x509 -in cacert.pem -outform DER -out cacert.der

 サーバの秘密鍵と署名要求書の作成
サーバの作業は/usr/local/SERVERで行いますので、まずは場所の準備から。
mkdir /usr/local/SERVER
chmod 600 /usr/local/SERVER

サーバの秘密鍵を作成します。
openssl genrsa -des3 -out server.key 1024
パスフレーズを聞かれますので、適時設定してください。
ここで作成した、server.keyかサーバの秘密鍵になります。
このままApacheで利用すると、起動時にパスワードの要求がされますので、パスフレーズを解除しておきます。
openssl rsa -in server.key -out servernopass.key

次に、認証機関(CA)への署名要求書(csr)を作成します。
openssl req -new -days 365 -key server.key -out csr.pem
*同一ホストの自己認証局を利用する場合、以下の情報はCA構築時とまったく同じ内容で作成してください。
Country Name (2 letter code) [AU]:  <---国名、通常は'JP'
State or Province Name (full name) [Some-State]:  <---都道府県名を指定
Location Name(eg,city) []:  <---組織の本拠地の市区町村名を指定
Orgnaization Name(eg,company)[Internet Widgits Pty Ltd]:  <---組織名(法人名)を指定
Orgnaization Unit Name(eg,section)[]:  <---部署名を指定
Common Name (eg,YOUR name)[]:  <---サーバのホスト名(FQDN)を指定
Email Address []:  <---連絡先E-Mailアドレスを指定
ここで作成した署名要求書(csr.pem)をCAに送り署名してもらいます。

 CAでのサーバ証明書の作成
先ほど作成したサーバの署名要求書にCAが署名し、サーバの証明書を作成します。
openssl.cnfを元にServer署名用の設定ファイルopenssl-server.cnfを作成します。(これはNetscapeへの対応のためです)
cp openssl.cnf openssl-server.cnf
以下の行のコメントを外し有効にしてください。
[usr_cert]
nsCertType = server
作成した設定ファイルを利用し署名作業をします。
cd /usr/local/CA
openssl ca -config /etc/ssl/openssl-server.cnf -in /usr/local/SERVER/csr.pem -keyfile private/cakey.pem -cert cacert.pem -out cert.pem
-in       サーバの署名要求書ファイル
-keyfile 認証機関の秘密鍵ファイル
-cert    認証機関の証明書ファイル
-out     作成する証明書ファイル

これでCAに署名されたサーバ証明書のcert.pemが作成されます。

 ApacheでのSSL設定
Apache-2系は、configureオプションでSSLを有効にしてください。Apache-1.3系を利用する場合は、mod_sslを別途入手しインストールします。
今回は、Apache-1.3.27を使用しますので、mod_sslは、2.8.14-1.3.27を使用します。
tar zxvf mod_ssl-2.8.14-1.3.27.tar.gz -C /usr/local/src/
tar zxvf apache_1.3.27.tar.gz -C /usr/local/src/
cd /usr/local/src/mod_ssl-2.8.14-1.3.27
./configure --with-apache=../apache_1.3.27 --with-ssl=/usr/local/ssl \
        --enable-rule=SHARED_CORE --with-layout=Apache \
        --enable-module=so \
        --enable-module=status --enable-module=info \
        --enable-module=rewrite --enable-module=usertrack
cd ../apache_1.3.27
make
make install
Apacheのインストールが終了したら、httpd.confを編集しSSLを有効にします。
httpd.confの以下の行に、サーバの秘密鍵とCAで署名してもらったサーバ証明書を指定します。
事前に必要なファイルをApacheのSSLディレクトリに用意しておいてください。
SSLEngine on  <---SSLを有効にします
SSLCertificateFile  <---CAで署名済みのサーバ証明書(cert.pem)
SSLCertificateKeyFile  <---サーバの秘密鍵(servernopass.key)
あとは、SSLを有効にしてApahceを起動します。
/usr/local/bin/apachectl startssl

これで、httpsで接続すればOKです。ただし、自己認証局を利用して署名したサーバ証明書を利用しているため、WEBブラウザでアクセスすると警告が表示されます。
この警告は、ブラウザに登録していない認証局が署名したサーバ証明書を利用している場合に出されます。
これを回避するためには、先ほど作成したCA(自己認証局)の証明書をブラウザに登録します。
ブラウザにはderフォーマット(cacert.der)を配布して登録してください。
ブラウザに信用して良い認証局として登録すれば、次回の接続から警告は出なくなります。

 Section2
クライアント証明は、限られた人のみアクセスを限定したいサイトなどを構築する場合に有用です。
限られた人にアクセスを限定する場合、一般的にはSSLで暗号化通信をしたのち、ユーザIDとパスワードを入力してもらい認証しています。
しかし、パスワード認証は決してセキュアな物ではなく、ユーザIDとパスワードが推測、または洩れてしまえば簡単にアクセスされてしまいます。
そこで、接続を許すユーザにクライアント証明書を発行し、この証明書を持っている人のみアクセス出来るように、セキュリティーを向上することが可能になります。
ここでは、このクライアント証明書の作成とApacheでの設定例を御紹介します。

 クライアント署名要求書の作成
まずは、サーバの証明書同様、CAに署名してもらうクライアント署名要求書を作成します。作業は/usr/local/CLIENTで行います。
mkdir /usr/local/CLIENT
chmod 600 /usr/local/CLIENT

場所準備が出来たら、クライアント用の秘密鍵を作成します。
cd /usr/local/CLIENT
openssl genrsa -des3 -out client.key 1024

次に、クライアント署名要求書を作成します。
openssl req -new -days 365 -key client.key -out clcsr.pem
Country Name (2 letter code) [AU]:  <---国名、通常は'JP'
State or Province Name (full name) [Some-State]:  <---都道府県名を指定
Location Name(eg,city) []:  <---組織の本拠地の市区町村名を指定
Orgnaization Name(eg,company)[Internet Widgits Pty Ltd]:  <---組織名(法人名)を指定
Orgnaization Unit Name(eg,section)[]:  <---部署名を指定
Common Name (eg,YOUR name)[]:  <---サーバのホスト名(FQDN)を指定
Email Address []:  <---連絡先E-Mailアドレスを指定
ここで作成した署名要求書(clcsr.pem)をCAに送り署名してもらいます。

 CAでのクライアント署名書の作成
先ほど作成したクライアント署名要求書(clcsr.pem)にCAで署名しクライアント証明書を作成します。
openssl.cnfを元にClient署名用の設定ファイルopenssl-client.cnfを作成します。(これはNetscapeへの対応のためです)
cp openssl.cnf openssl-client.cnf
以下の行のコメントを外し有効にしてください。
[usr_cert]
nsCertType = client,email
作成した設定ファイルを利用し署名作業をします。
cd /usr/local/CLIENT openssl ca -config /etc/ssl/openssl-client.cnf -in clcsr.pem -out clcert.pem
これで、クライアント証明書のclcert.pemの作成は終了ですが、クライアントではPKCS12形式しか利用できませんのでclcert.pemをこの形式に変換します。

 PKCS12形式への変換
変換には、CAの証明書(公開鍵)を含めた形で作業します。
openssl pkcs12 -export -in clcert.pem -inkey client.key -certfile cacert.pem -out clcert.p12
パスフレーズの設定をします
Enter PEM pass phrase:  <---client.keyのパスフレーズ
Enter Export Password:  <---ユーザが証明書を取り込む時のパスフレーズを設定
Verifying password - Enter Export Password:  <---上記の確認
これで、クライアント証明書の作成は終了です。次にApacheの設定をします。

 クライアント証明を利用したApacheの設定
ApacheのSSLディレクトリに、CAの証明書(cacert.pem)とクライアント証明の秘密鍵(client.key)、クライアント証明書(clcert.pem)を用意してください。
httpd.confの設定は以下の箇所です。
SSLEngine on  <---SSLを有効にします
SSLCertificateFile  <---CAで署名済みのサーバ証明書(cert.pem)
SSLCertificateKeyFile  <---サーバの秘密鍵(servernopass.key)
SSLCertificateChainFile  <---CAの証明書(cacert.pem)
SSLCACertificatePath  <---CA証明書があるパス
SSLCACertificateFile  <---CAの証明書(cacert.pem)
SSLCARevocationPath  <---クライアント証明書があるパス
SSLCARevocationFile  <---クライアント証明書(clcert.pem)
SSLVerifyClient require  <---クライアントの認証要求
SSLVerifyClient 1  <---クライアント認証方式の指定
この設定でApacheを起動したばあい、Apacheはクライアントのセッション要求時にクライアント証明書の提出を要求し、クライアント証明書を持っていないユーザはhttpsセッションを確立できません。

ユーザに発行するクライアント証明書は、PKCS12形式に変換したclcert.p12を利用してください。
なお、このclcert.p12をユーザがブラウザなどに登録する場合には、変換時に設定したパスフレーズが必要になりますので、合わせてパスフレーズもユーザに知らせておく必要があります。


Producted by Tomoya Sakurai