【わかりやすい】自己認証局を作成しルート証明書、サーバー証明書、クライアント証明書を作成【備忘録】
【目的(動機)】
仕事関係で調査が必要だったためプライベート認証局からルート証明書を発行する検証をしてみることにした。
【すること】
①自己認証局を作成、プライベートのルート証明書、サーバー証明書、クライアント証明書を作成し、ブラウザ上で動作を確認。
②ある製品のクライアントデバイス管理用にも作成したルート証明書とカスタム証明書で動作するかを確認。
【導入環境、登場機器】
>>ここでルート証明書を発行+Webサーバー作成
Windows10
>>・クライアント、ブラウザの表示確認、
・とあるリモートアクセス製品のデバイス制御確認
- 1. GCPに仮想マシンを作成して、認証局、Webサーバー作成
- 2. コンソールからSSH接続、Apacheインストール、Firewall設定
- 3. 証明書作成の準備
- 4.CA証明書を作成
- 5.クライアントにCA証明書をインストール
- 6. サーバー証明書作成
- 7. クライアント用の証明書を作成
- 8.クライアントにクライアント証明書をインストール
- 9. できた証明書を再度確認
- 10. サーバーのssl.confに記載
- 11. 確認結果(まとめ)
1. GCPに仮想マシンを作成して、認証局、Webサーバー作成
・http,httpsは許可にチェック
・GCPのIPアドレス確認後、ドメイン名はexample.comにして Windowsのhostsに登録
2. コンソールからSSH接続、Apacheインストール、Firewall設定
<ブラウザ経由でSSH接続>
sudo su
<Appachをインストール>
httpdインストール
SSLもインストール
自動起動コマンド
systemctl enable httpd.service
サービススタート
service httpd start
ステータス確認
service httpd status
設定テキストを開いて「disabled」に変更してあげる (念のため)
vi /etc/selinux/config
"SELINUX=disabled"
ファイアウォールの設定確認
firewall-cmd --list-all-zones
http、httpsを許可
firewall-cmd --add-service=https --zone=public --permanent
firewall-cmd --add-service=http --zone=public --permanent
サービスをリロード
firewall-cmd --reload
3. 証明書作成の準備
OpenSSLをインストールする(もしかしたらすでに入っているかも)
yum -y install openssl
入っているか確認
以下のディレクトリに移動する
中身を書き換え
<追加/変事項は以下>
[ req ]
req_ex//tensions = v3_req
[ usr_cert ]
subjectAltName = @alt_names
[ v3_req ]
subjectAltName = @alt_names
下記の3行を追加
[ alt_names ]
DNS = (自分のドメイン:今回はexample.com)
IP = (自分のWebサーバーのIPアドレス)
国名、地名、組織名は適宜入力
countryName_default = JP
stateOrProvinceName_default = Saitama
localityName_default = Toda
0.organiz:ationName_default = hoge Company
保存する(:wq)
ひな形ができたので、ルート証明書、サーバー証明書、クライアント証明書 それぞれ3つの証明書用にコピー作成
cp openssl.cnf openssl-ca.cnf
cp openssl.cnf openssl-server.cnf
cp openssl.cnf openssl-client.cnf
4.CA証明書を作成
cnfファイルをCA用に変更
vi openssl-ca.cnf
CAなのでCA:FalseをCA:Trueに変更
basicConstraints=CA:True
左に#がついているので外す
nsCertType = sslCA, emailCA
保存する(:wq)
以下のコマンドでCA証明書を発行する、期限は3年(1095日)、以下の流れ
CAの秘密鍵生成→公開鍵とCSR(証明書署名要求生成)→CAの秘密鍵で署名→CA証明書発行
CADAYS="-days 1095" SSLEAY_CONFIG="-config /etc/pki/tls/openssl-ca.cnf" /etc/pki/tls/misc/CA -newca
その後もインタラクティブな画面が出てくるのでエンターで先に進み、以下は認証局の名前を入力(今回は:MKLab CA)
Common Name (eg, your name or your server's hostname) :MKLab CA
再び先ほどのパスワードの入力を求められるので入力(:test)
最後に”Data Base Updated”が出てきたらCA証明書の作成完了
証明書を確認
cat /etc/pki/CA/cacert.pem
証明書をエクスポート
CGPのコンソール画面の右上の(ギア?)アイコンをクリック
→「ファイルのダウンロード」を選択→cacert.pem を選択
CA証明書をクライアント(今回はWindows10)にインストールする
5.クライアントにCA証明書をインストール
Windowsの検索項目に”mmc”と入力、コンソール画面を出す。
管理者として実行
”ファイル” → ”スナップインの追加と削除” → ”証明書(追加)” → ”ユーザーアカウント” → OK
”信頼されたルート証明機関”を右クリック → ”インポート” → 証明書ファイルを選択してインストール → コンソールを上書き保存
以上でルート証明書のインストールが完了しました。
6. サーバー証明書作成
cnfファイルをサーバー証明書用に変更
vi openssl-server.cnf
有効期間変更
default_days = 1095
CA:Falseになっていることを確認
basicConstraints=CA:FALSE
左に#がついているので外す
nsCertType = server
保存する(:wq)
SSLEAY_CONFIG="-config /etc/pki/tls/openssl-server.cnf" /etc/pki/tls/misc/CA -newreq
秘密鍵のパスフレーズを聞かれるので入力(一旦全部:test)
その後もインタラクティブな画面が出てくるのでエンターで先に進み、以下のホストネームはIPアドレスかドメインネームを入れる
Common Name (eg, your name or your server's hostname) : 34.77.88.99 、example.com etc...
SSLEAY_CONFIG="-config /etc/pki/tls/openssl-server.cnf" /etc/pki/tls/misc/CA -sign
パスワードを求められるので先ほどのものを入力(:test)
名前を変えてcertsフォルダに入れる
mv /etc/pki/tls/newcert.pem /etc/pki/CA/certs/example.com.crt
サーバー証明書の秘密鍵にCA証明書の秘密鍵パスワードを埋め込む
openssl rsa -in /etc/pki/tls/newkey.pem -out /etc/pki/CA/private/example.com.key
7. クライアント用の証明書を作成
cnfファイルをクライアント証明書用に変更
CA:Falseになっていることを確認
basicConstraints=CA:FALSE
左に#がついているので外す
nsCertType = client, email
保存する(:wq)
クライアント証明書のCSRの作成
SSLEAY_CONFIG="-config /etc/pki/tls/openssl-client.cnf" /etc/pki/tls/misc/CA -newreq
パスフレーズを求められるので"test"と入力
その後もインタラクティブな画面が出てくるのでエンターで先に進み、以下はユーザーの名前を入力(今回は:user qbc)
Common Name (eg, your name or your server's hostname) []:user abc
CSRよりクライアント証明書を作成
SSLEAY_CONFIG="-config /etc/pki/tls/openssl-client.cnf" /etc/pki/tls/misc/CA -sign
パスフレーズを求められるので"test"と入力、クライアント証明書が作成される
できた証明書と秘密鍵をWindows用にPKCS#12フォーマットに変更
openssl pkcs12 -export -in newcert.pem -inkey newkey.pem -out test-abc.pfx
パスフレーズは"test" windowsに展開時のパスワードも2回入力が必要なのでどちらも"test"とした
証明書をエクスポート
CGPのコンソール画面の右上の(ギア?)アイコンをクリック
→「ファイルのダウンロード」を選択→ test-abc.pfxを選択 クライアント証明書をクライアント(今回はWindows10)にインストールする
8.クライアントにクライアント証明書をインストール
Windowsの検索項目に”mmc”と入力、コンソール画面を出す。
管理者として実行
”ファイル” → ”スナップインの追加と削除” → ”証明書(追加)” → ”ユーザーアカウント” → OK
”個人”を右クリック → ”インポート” → 証明書ファイルを選択してインストール → コンソールを上書き保存
以上でクライアント証明書のインストールが完了しました。
9. できた証明書を再度確認
CA証明書 /etc/pki/CA/cacert.pem
サーバ証明書 /etc/pki/CA/certs/example.com.crt
サーバ証明書秘密鍵 /etc/pki/CA/private/example.com.key
クライアント証明書 /etc/pki/tls/test-abc.pfx
10. サーバーのssl.confに記載
# Server Certificate:
SSLCertificateFile /etc/pki/tls/certs/localhost.crt ←サーバー証明書のパスに変更
# Server Private Key:
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key ←サーバー証明書の秘密鍵のパスに変更
#Certificate Authority (CA):
#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt ←#を取ってルート証明書のパスに変更
#Client Authentication (Type):
#VerifyClient require ←#を取る
#SSLVerifyDepth 10 ←#を取る
保存する(:wq)
service httpd restart
httpdを再起動
11. 確認結果(まとめ)
①について、以下のことが確認できた
1.Apacheを入れただけの時のブラウザ画面(Chrome)
→httpsでアクセスすると警告画面が表示されること
2.ルート証明書を信頼されたストアに入れ、サーバーにサーバー証明書とサーバー秘密キーを設定後
→警告は表示されず、”この接続は保護されています”と表示されること
3.クライアント証明書をサーバーに登録したとき、
→”ログインが認証されていない”旨のメッセージがでてWebサイトにアクセスできなくなること
4.その後クライアント証明書を個人のストアに入れた後
→Webサイトにアクセスできるようになること
証明書のインストールによるブラウザの制御は確認することができた
(備忘録で動画にとってみた)
②一方で、あるリモートアクセス製品のデバイスの制御だが、
1.ルート証明書をクライアントデバイスの信頼できるストアに入れ、製品のポータル上にも同様のものをUploadした
→CA証明書が有/無でデバイスの制御をするはずらしいができなかった(失敗した)
2.ルート証明書とクライアント証明書をクライアントのデバイスにインストールし、製品のポータル上にルート証明書をUploadした
→クライアント証明書とルート証明書を突合してデバイス制御ができるはずらしいけれどできなかった(失敗した)
※現在サポートデスクに確認中です。。。(何か設定が間違っているのか・・・)