MK's-Lab

日々のはてなな用語を調べてメモるブログです

【わかりやすい】自己認証局を作成しルート証明書、サーバー証明書、クライアント証明書を作成【備忘録】

【目的(動機)】

仕事関係で調査が必要だったためプライベート認証局からルート証明書を発行する検証をしてみることにした。

【すること】

①自己認証局を作成、プライベートのルート証明書サーバー証明書、クライアント証明書を作成し、ブラウザ上で動作を確認。

②ある製品のクライアントデバイス管理用にも作成したルート証明書とカスタム証明書で動作するかを確認。

【導入環境、登場機器】

GCP上にCentOS

>>ここでルート証明書を発行+Webサーバー作成

Windows10

>>・クライアント、ブラウザの表示確認、

  ・とあるリモートアクセス製品のデバイス制御確認


www.youtube.com

1. GCP仮想マシンを作成して、認証局、Webサーバー作成

GCPインスタンス作成、OSはCentOS7

・http,httpsは許可にチェック

GCPIPアドレス確認後、ドメイン名はexample.comにして Windowsのhostsに登録

2. コンソールからSSH接続、Apacheインストール、Firewall設定

<ブラウザ経由でSSH接続>

sudo su

<Appachをインストール>

httpdインストール

yum -y install httpd

SSLもインストール

yum -y install mod_ssl

自動起動コマンド

systemctl enable httpd.service

サービススタート

service httpd start

ステータス確認

service httpd status

CentOSFirewall設定>

設定テキストを開いて「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

入っているか確認

rpm -qa|grep openssl

以下のディレクトリに移動する

cd /etc/pki/tls

中身を書き換え

vi /etc/pki/tls/openssl.cnf

<追加/変事項は以下>

[ 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

秘密鍵パスフレーズを聞かれるので入力(今回は:test)

その後もインタラクティブな画面が出てくるのでエンターで先に進み、以下は認証局の名前を入力(今回は: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)

サーバー証明書CSRの作成

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...

CSRよりサーバ証明書を作成する

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ファイルをクライアント証明書用に変更

vi /etc/pki/tls/openssl-client.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に記載

vi /etc/httpd/conf.d/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を再起動


www.youtube.com

11. 確認結果(まとめ)

①について、以下のことが確認できた

1.Apacheを入れただけの時のブラウザ画面(Chrome

httpsでアクセスすると警告画面が表示されること

2.ルート証明書を信頼されたストアに入れ、サーバーにサーバー証明書とサーバー秘密キーを設定後

→警告は表示されず、”この接続は保護されています”と表示されること

3.クライアント証明書をサーバーに登録したとき、

→”ログインが認証されていない”旨のメッセージがでてWebサイトにアクセスできなくなること

4.その後クライアント証明書を個人のストアに入れた後

→Webサイトにアクセスできるようになること

証明書のインストールによるブラウザの制御は確認することができた

(備忘録で動画にとってみた)

②一方で、あるリモートアクセス製品のデバイスの制御だが、

1.ルート証明書をクライアントデバイスの信頼できるストアに入れ、製品のポータル上にも同様のものをUploadした

→CA証明書が有/無でデバイスの制御をするはずらしいができなかった(失敗した)

2.ルート証明書とクライアント証明書をクライアントのデバイスにインストールし、製品のポータル上にルート証明書をUploadした

→クライアント証明書とルート証明書を突合してデバイス制御ができるはずらしいけれどできなかった(失敗した)

※現在サポートデスクに確認中です。。。(何か設定が間違っているのか・・・)