【Linux】CAサーバーを作成してオレオレ証明書認証のSSLサーバーを構築する!【shellscript】
自分で作ったCA(認証局)サーバーを作って、SSLサーバーを構築する手順。
こんな感じの環境を作ったので、勉強用メモ。
使うソフトウェアはこれら
OS:Ubuntu 16.04 LTS x64(JP)
http://cdimage.ubuntulinux.jp/releases/16.04/ubuntu-ja-16.04-desktop-amd64.iso
・Apache2
・OpenSSL
ちなみに、CAサーバーも、Webサーバーも1台のWindowsPC上のWMwareで動作させてます。
エコだね!!
構築手順はこんな感じ。
↑これ全部スクリプトで一発で出来ると次回環境構築時に楽だよね!
とか思って作ったけど、0と4はまだちゃんと動かないです。
0.環境に必要ソフトをインストール
この作業はWebサーバー/CAサーバー共通。
全コマンドをまとめてスクリプトにしたらインストール失敗したので、一発ずつコマンドした方がいい。
①opensslのインストール
apt-get install openssl
②apache2のインストール
sudo apt-get install apache2
apt-get update
③apacheのSSL設定を有効化
a2enmod ssl
a2ensite default-ssl
/etc/init.d/apache2 restart
apt-get投げた時に、
archive.ubuntu.com' が一時的に解決できません
ってエラーが出てインストールできな状態にはまりました。
原因は、VMwareでIP固定してたのに、DNSの設定がうまく読み込めてなかったみたいです。
/etc/resolvconf/resolv.conf.d/base
の中身を
nameserver (DNSのIP)
に書き換えて解決。
1.CA(認証局)作成
"piyoCA"なる認証局を作成!
使いたい放題のオレオレ証明書だよ!!
スクリプトと全コマンドは以下。
①認証局として必要なファイル、ディレクトリを作成
mkdir /etc/ssl/piyoCA
mkdir -p /etc/ssl/piyoCA/certs
mkdir -p /etc/ssl/piyoCA/private
mkdir -p /etc/ssl/piyoCA/crl
mkdir -p /etc/ssl/piyoCA/newcerts
chmod 700 /etc/ssl/piyoCA/private
色々格納に必須なディレクトリを作成して、
echo 01>/etc/ssl/piyoCA/serial
touch /etc/ssl/piyoCA/index.txt
今後作っていく証明書をラベリングしたりするのに使うファイルを初期化。
②opensslの設定ファイルを作成CAに合わせて修正
/etc/ssl/openssl.cnfの以下の部分を修正
dir = /etc/ssl/piyoCA
[ CA_default ]のdirを前手順で作成した認証局フォルダに設定
organizationName = optional
[ policy_anything ]のorganizationNameをoptionalに設定。
スクリプト内だと、対象の記述を一旦コメントアウトしてから、その次の行に新しく記述とかやってますが、直接編集するんじゃなくて、コピって、新しいcnfを編集して、使うたびに呼び出した方が安全なのかも。
③秘密鍵と自己証明書を作成
openssl req -new -x509 -newkey rsa:2048 -out CAcert.pem -keyout private/CAkey.pem -days 365
成功すれば、CAkey.pemという秘密鍵とCAcert.pemという自己証明書が作成されます。
作成時に秘密鍵にかけるパスワードと証明書情報を聞かれます。適当に鍵のパスワードを”piyoca”とかにしておきます。
2.WebサーバーのCSR要求作成
SSLサーバーの元となるWebサーバーを作成。
スクリプトと全コマンドは以下。
①必要ファイルを格納するディレクトリを作成
mkdir /etc/ssl/www.piyoweb.com
②Webサーバー用秘密鍵作成
openssl genrsa -des3 -out ./web.key 204
鍵の名前は適当に"web.key"にして、鍵につけるパスワードも聞かれるので、適当に"piyoweb"とかにしておきます。
③CSRファイル作成
CSRは、"Certificate SigningRequest"の略。要は「こういう証明書くれ!」っていうもの。
今回は「SSLサーバーで使う証明書くれ!」ってやつに自分の秘密鍵で署名したものを作成。
openssl req -new -key ./web.key -out ./web.csr
-keyでさっき作成した鍵(web.key)を指定。
作成されるCSR要求ファイルの名前は適当に"web.csr"とかにしておきます。
最初に鍵のパスワードが聞かれるので、鍵を作成した際に使用した”piyoweb”を指定。
証明書情報を色々と聞かれるけど、
Country/ State/Locality/company/Unitは適当でOK。(Countryは2文字限定)
CommonNameはWebサーバーのURL。今回は同一ネットワーク内のテスト環境なので、Webサーバー環境のIPアドレスを指定(192.168.1.7)。
Emailは適当。なくてもOK。
challengeは適当なパスワードを設定。
optionalは何も設定しなくてOK。
上手くいけばweb.csrができます。
3.CSRに応じてSSL証明書発行
①CSRファイルのコピー
前手順で作成したCSRファイル(web.csr)をCAサーバー側にコピー。
②証明書発行
CAサーバーでオレオレ証明書で作られたサーバー証明書を発行。
$sudo openssl ca -in web.csr -out sslcert.pem
認証局の鍵のパスワードが聞かれるので、今回は"piyoca"を入力。
成功すればサーバー証明書(sslcert.pem)が作成される。
この際、以下のエラーで失敗した場合
TXT_DB error number 2
証明書要求が衝突しているらしい。なので、いったん取り下げる
openssl ca -revoke /etc/ssl/(作成したCA)/newcerts/00.pem
(最後の"00.pem"の部分は発行要求した証明書の数による。大体/etc/ssl/testCA/serial.oldの番号)
4.WebサーバーにSSL証明書を登録
①作成した証明書をコピー
作成した証明書(sslcert.pem)をCAサーバー側からコピー。
②証明書をwebサーバーに登録
コピーした証明書を使用するようにWebサーバー側のapacheの設定ファイルを編集。
編集箇所は/etc/apache2/sites-available/default-ssl.conf内のSSLCertificateFileとSSLCertificateKeyFile。SSLCertificateFileにCAサーバーで発行してもらった証明書、SSLCertificateKeyFileにWebサーバーの秘密鍵を登録
今回は鍵も証明書も /etc/ssl/www.piyoweb.com/以下に置いたので、こんな感じ
Webサーバー側のアパッチの設定ファイルを書き換える
SSLCertificateFile /etc/ssl/www.piyoweb.com/sslcert.pem
SSLCertificateKeyFile /etc/ssl/www.piyoweb.com/web.key
③apacheの再起動
設定ファイルを反映させる為に、webサーバーのapacheを再起動!
/etc/init.d/apache2 restart
これで準備完了!!
ちなみに、手順3.4.の、コピーして、CSRの証明書を発行して、それをまたコピーして、って動作がだるかったので、PHPの簡易アプリを作りました。
それはまた別の場所にメモる。
5.できたかな!
SSL証明書が登録されて、SSL通信ができるかのテスト。
Webブラウザで、Webサーバーにhttpsで接続!
証明書を登録する前は「危ないよ!」って警告が出るけど、証明書登録後は警告無しにApacheのデフォルト画面が表示されるように!証明書の登録は、ブラウザによって違うけど、「設定」→「証明書」とかで。
これでSSLサーバー作成完了!✧٩(ˊωˋ*)و✧
オレオレ証明書って、ドライバのテストの時とかはよく使うけど、
認証局サーバーを立てるってのは初めてだから楽しかった( *´ω`)
あと、"オレオレ証明書"っていう言い方が一般的だと知って、なんだか嬉しくなりました。
参考にさせていただいたページ
http://stacktrace.hatenablog.jp/entry/2015/12/12/102945
http://www.aconus.com/~oyaji/www/certs_linux.htm