Ubuntu 20.04 で認証局 (CA) をセットアップして設定する方法
はじめに
認証局 (CA) は、インターネット上の身元を確認するためのデジタル証明書の発行に責任を負う事業体です。 公開 CA は、一般公衆に提供される Web サイトやその他のサービスの身元を確認するための一般的な選択肢ですが、プライベート CA は通常、閉じたグループやプライベートサービスに使用されます。
プライベート認証局を構築すると、クライアントとサーバー間の暗号化接続を必要とするプログラムの構成、テスト、および実行が可能になります。 プライベート CA を使用すると、インフラストラクチャ内のユーザー、サーバー、または個々のプログラムおよびサービスに対して証明書を発行することができます。
このガイドでは、Ubuntu 20.04 サーバーでプライベート認証局を設定する方法、および新しい CA を使用してテスト証明書を生成して署名する方法について説明します。 また、CAサーバーのパブリック証明書をオペレーティングシステムの証明書ストアにインポートし、CAとリモートサーバーまたはユーザー間の信頼の連鎖を検証する方法についても学びます。 最後に、認証されたユーザーとシステムのみが CA に依存するサービスを使用できるように、証明書を失効させ、証明書失効リストを配布する方法を学びます。
Prerequisites
このチュートリアルを完了するには、Ubuntu 20.04 サーバーにアクセスして CA サーバーをホストすることが必要になります。 このガイドを開始する前に、sudo
権限を持つ非rootユーザを設定する必要があります。 Ubuntu 20.04の初期サーバ設定ガイドに従って、適切な権限を持つユーザを設定することができます。
このチュートリアルでは、このサーバをCAサーバと呼びます。
CAサーバはスタンドアロンシステムであることを確認してください。 これは、証明書要求のインポート、署名、および失効にのみ使用されます。 また、理想的には、CAで積極的に作業していないときは、オフラインにするか完全にシャットダウンします。
注意:このチュートリアルの最後のセクションは、証明書の署名と取り消しについて学習したい場合は、オプションです。
ステップ1 – Easy-RSAのインストール
このチュートリアルの最初のタスクは、easy-rsa
スクリプトのセットをCAサーバーにインストールすることです。 easy-rsa
は認証局管理ツールで、秘密鍵とパブリックルート証明書を生成し、あなたの認証局に依存するクライアントとサーバからの要求に署名するために使用します。
初期設定ステップで作成した非 root sudo ユーザであなたの認証局サーバにログインし、以下を実行します。 y
を押して、パッケージをインストールすることを確認します。
この時点で、必要なものはすべてセットアップされ、Easy-RSAを使用する準備が整っています。
ステップ2 – 公開鍵基盤ディレクトリの準備
さて、easy-rsa
をインストールしたので、いよいよCAサーバ上にスケルトン公開鍵基盤(PKI)を作成する段階に入ります。 非 root ユーザーとしてログインしていることを確認し、easy-rsa
ディレクトリを作成します。 通常のユーザは昇格した特権なしでCAを管理し、対話する必要があるため、以下のコマンドのいずれかを実行するのにsudoを使用しないことを確認してください。
- mkdir ~/easy-rsa
これにより、ホームフォルダにeasy-rsa
という新しいディレクトリが作成されます。 このディレクトリを使用して、前のステップでインストールしたeasy-rsa
パッケージファイルを指すシンボリックリンクを作成します。 これらのファイルは、CAサーバの/usr/share/easy-rsa
フォルダにあります。
ln
コマンドを使用してシンボリックリンクを作成します:
- ln -s /usr/share/easy-rsa/* ~/easy-rsa/
注意:他のガイドでは、easy-rsa
パッケージファイルをPKIディレクトリにコピーするように指示されているかもしれませんが、このチュートリアルではシンボリックリンクアプローチを採用しています。 その結果、easy-rsa
パッケージの更新はすべて、PKI のスクリプトに自動的に反映されます。
新しい PKI ディレクトリへのアクセスを制限するには、chmod
コマンドを使用して所有者だけがアクセスできるようにします:
- chmod 700 /home/sammy/easy-rsa
最後に、easy-rsa
ディレクトリ内で PKI を初期化します:
- cd ~/easy-rsa
- ./easyrsa init-pki
Outputinit-pki complete; you may now create a CA or requests.Your newly created PKI dir is: /home/sammy/easy-rsa/pki
このセクションを完了すると、認証局の作成に必要となるすべてのファイルを含むディレクトリができあがります。 次のセクションでは、CA のプライベート キーとパブリック証明書を作成します。
Step 3 – 認証局の作成
認証局のプライベート キーと証明書を作成する前に、vars
というファイルにいくつかのデフォルト値を作成および入力する必要があります。 まず、cd
を easy-rsa
ディレクトリに移動し、nano
またはお好みのテキスト エディタで vars
ファイルを作成および編集します:
- cd ~/easy-rsa
- nano vars
ファイルを開いたら、次の行を貼り付けて、強調表示されている各値を編集して自分の組織の情報を反映させます。 ここで重要な部分は、任意の値を空白にしないことを確認することです:
~/easy-rsa/varsset_var EASYRSA_REQ_COUNTRY "US"set_var EASYRSA_REQ_PROVINCE "NewYork"set_var EASYRSA_REQ_CITY "New York City"set_var EASYRSA_REQ_ORG "DigitalOcean"set_var EASYRSA_REQ_EMAIL "[email protected]"set_var EASYRSA_REQ_OU "Community"set_var EASYRSA_ALGO "ec"set_var EASYRSA_DIGEST "sha512"
あなたは終了したら、ファイルを保存して閉じます。 nano
を使用している場合は、CTRL+X
を押した後、Y
とENTER
を押して確認することで実行できます。 認証局を構築する準備が整いました。
認証局のルート公開鍵と秘密鍵のペアを作成するには、./easy-rsa
コマンドを再度、今度は build-ca
オプションを付けて実行します:
- ./easyrsa build-ca
出力には OpenSSL バージョンに関するいくつかの行と鍵ペアのパスフレーズを入力するよう促されることでしょう。 強力なパスフレーズを選択し、安全な場所にメモしておいてください。 例えば、証明書に署名したり、証明書を失効させたりするために、CA と対話する必要があるときはいつでもパスフレーズを入力する必要があります。
また、CA の共通名 (CN) を確認するよう求められます。 CN は認証局のコンテキストでこのマシンを参照するために使用される名前です。 CAのCommon Nameには任意の文字列を入力できますが、簡単のため、ENTERキーを押してデフォルトの名前を受け入れます。
Output. . .Enter New CA Key Passphrase:Re-Enter New CA Key Passphrase:. . .Common Name (eg: your user, host, or server name) :CA creation complete and you may now import and sign cert requests.Your new CA certificate file for publishing is at:/home/sammy/easy-rsa/pki/ca.crt
注意: CA と対話するたびにパスワードの入力を要求されたくない場合は、build-ca
コマンドを nopass
オプション付きで次のように実行します:
- ./easyrsa build-ca nopass
これで、認証局のパブリックおよびプライベートコンポーネントを構成する ~/easy-rsa/pki/ca.crt
と ~/easy-rsa/pki/private/ca.key
という 2 つの重要なファイルを手に入れました。
-
ca.crt
はCAのパブリック証明書ファイルです。 ユーザ、サーバ、クライアントはこの証明書を使って、同じ信頼の輪の一部であることを確認します。 あなたのCAを使用するすべてのユーザーとサーバーは、このファイルのコピーを持っている必要があります。 -
ca.key
は、CAがサーバーとクライアントの証明書に署名するために使用するプライベートキーです。 もし攻撃者があなたのCA、ひいてはca.key
ファイルにアクセスした場合、あなたのCAを破壊する必要があります。 このため、ca.key
ファイルはあなたの CA マシンにだけあるべきで、理想的には、追加のセキュリティ対策として、証明書要求に署名しないときは、あなたの CA マシンをオフラインにしておくべきです。
以上で、あなたの CA は設置されて、証明書要求に署名し、証明書を取り消すために使用できる状態になりました。
ステップ 4 – 認証局のパブリック証明書を配布する
これで CA は設定され、それを使用するように設定するシステムの信頼ルートとして動作する準備が整いました。 OpenVPN サーバー、Web サーバー、メールサーバーなどに CA の証明書を追加することができます。 ネットワーク内の他のユーザーやサーバーの身元を確認する必要があるユーザーやサーバーは、オペレーティングシステムの証明書ストアにインポートされた ca.crt
ファイルのコピーを持つべきです。
別のサーバーやローカルコンピュータなどの第二の Linux システムに CA の公開証明書をインポートするには、まず CA のサーバーから ca.crt
ファイルのコピーを取得します。 cat
コマンドを使用してターミナルに出力し、証明書をインポートする 2 台目のコンピュータのファイルにコピーして貼り付けることができます。 また、scp
、rsync
などのツールを使って、システム間でファイルを転送することもできます。
CAサーバーの非ルートユーザーとして、次のコマンドを実行します。
- cat ~/easy-rsa/pki/ca.crt
ターミナルに次のような出力が表示されます。
2番目のLinuxシステムでnano
またはお好みのテキストエディターを使用して、/tmp/ca.crt
:
- nano /tmp/ca.crt
先ほどCAサーバーからコピーした内容をエディターに貼り付けてください。 終了したら、ファイルを保存して閉じます。 nano
を使用している場合は、CTRL+X
を押し、Y
と ENTER
を押して確定します。
これで、2番目の Linux システムに ca.crt
ファイルのコピーができたので、今度はその証明書をそのオペレーティング システム証明書ストアにインポートする番です。
Ubuntu および Debian ベースのシステムでは、非 root ユーザーとして次のコマンドを実行して、証明書をインポートします:
- sudo cp /tmp/ca.crt /usr/local/share/ca-certificates/
- sudo update-ca-certificates
CentOS、Fedora または RedHat ベース システムで CA Server の証明書をインポートするには、前述の例のようにファイルの内容をコピーして /tmp/ca.crt
というファイル内にシステムにペーストしてください。 次に、証明書を /etc/pki/ca-trust/source/anchors/
にコピーし、update-ca-trust
コマンドを実行します。
- sudo cp /tmp/ca.crt /etc/pki/ca-trust/source/anchors/
- sudo update-ca-trust
これで、2 番目の Linux システムは、CA サーバーによって署名されている任意の証明書を信頼します。
注意:Web サーバーで CA を使用していてブラウザとして Firefox を使っているなら、公開 ca.crt
証明書を直接 Firefox へインポートする必要があります。 Firefoxはローカルオペレーティングシステムの証明書ストアを使用しません。 Firefox に CA の証明書を追加する方法の詳細については、Mozilla のサポート記事「Firefox での認証局 (CA) の設定」を参照してください。
CA を使用して Windows 環境またはデスクトップ コンピュータと統合する場合、certutil.exe
を使用して CA 証明書をインストールする方法に関するドキュメントを参照してください。 証明書に署名する方法および証明書を取り消す方法についてさらに詳しく知りたい場合は、次のオプションのセクションで各プロセスを詳しく説明します。
(オプション)- 証明書署名要求の作成と証明書の取り消し
このチュートリアルの次のセクションはオプションです。 前のステップをすべて完了した場合、他のチュートリアルの前提条件として使用できる、完全に設定され動作する認証局ができていることになります。 CA の ca.crt
ファイルをインポートし、CA によって署名されたネットワーク内の証明書を検証できます。
証明書要求に署名する方法および証明書を取り消す方法を練習してさらに学びたい場合、これらのオプションのセクションでは、両方のプロセスがどのように機能するかを説明します。
(オプション)-練習用証明書要求の作成と署名
CA を使用する準備ができたので、秘密鍵と証明書要求を生成して署名と配布プロセスに慣れる練習ができます。
証明書署名要求(CSR)は、公開鍵、要求システムの識別情報、要求当事者の秘密鍵を使用して作成される、要求自体の署名という 3 つの要素から構成されています。 秘密鍵は秘密にされ、署名された公開証明書を持つ誰もが復号化できる情報の暗号化に使用されます。
以下の手順は、2 番目の Ubuntu または Debian システム、あるいはそれらのいずれかに由来するディストリビューションで実行されます。 それは他のリモート サーバーでも、ラップトップやデスクトップ コンピューターなどのローカル Linux マシンでもかまいません。 easy-rsa
はすべてのシステムでデフォルトで使用できるわけではないので、openssl
ツールを使用して練習用の秘密鍵と証明書を作成します。
openssl
は通常ほとんどの Linux ディストリビューションでデフォルトでインストールされていますが、念のため、お使いのシステムで以下を実行してください:
- sudo apt update
- sudo apt install openssl
openssl
をインストールするか聞かれたら y
を入力してインストールのステップを続行してください。
CSRを作成するために必要な最初のステップは、秘密鍵の作成です。 openssl
を使用して秘密鍵を作成するには、practice-csr
ディレクトリを作成し、その中に鍵を生成します。 ここでは、ユーザーまたは別の CA を識別するために使用される証明書を作成するのとは対照的に、sammy-server
という架空のサーバーに対してこの要求を行います。
- mkdir ~/practice-csr
- cd ~/practice-csr
- openssl genrsa -out sammy-server.key
OutputGenerating RSA private key, 2048 bit long modulus (2 primes). . .. . .e is 65537 (0x010001)
秘密鍵が得られたので、対応する CSR を作成することができますが、これも openssl
ユーティリティを使用します。 国、州、市町村などのフィールドを入力するよう促されます。 フィールドを空白にしたい場合は .
を入力できますが、これが実際の CSR である場合は、場所や組織に応じた正しい値を使用することが最善であることに注意してください。 ハイライト表示された値を、練習場所、組織、およびサーバー名に合わせて編集してください。
- openssl req -new -key sammy-server.key -out server.req -subj \
- /C=US/ST=New\ York/L=New\ York\ City/O=DigitalOcean/OU=Community/CN=sammy-server
CSRの内容を確認するには、openssl
で要求ファイルを読み込んで、中のフィールドを調べます。
- openssl req -in sammy-server.req -noout -subject
Outputsubject=C = US, ST = New York, L = New York City, O = DigitalOcean, OU = Community, CN = sammy-server
練習用証明書要求のサブジェクトに満足したら、scp
:
- scp sammy-server.req sammy@your_ca_server_ip:/tmp/sammy-server.req
この手順で、sammy-server
という架空のサーバーに対する証明書署名要求を生成しました。 実際のシナリオでは、テスト用の TLS 証明書を必要とするステージングや 開発用 Web サーバーからのリクエストであったり、ユーザーが VPN に接続できるように証明書を要求する OpenVPN サーバーからのリクエストであったりすることでしょう。 次のステップでは、CAサーバーの秘密鍵を使って証明書署名リクエストに署名することに進みます。
(オプション)-CSRに署名する
前の手順で、架空のサーバーの練習用証明書要求と鍵を作成しました。 これをCAサーバの/tmp
ディレクトリにコピーし、署名が必要なCSR要求を送ってくる実際のクライアントまたはサーバがある場合のプロセスをエミュレートしました。
架空のシナリオを続けながら、今度はCAサーバが練習用証明書をインポートし、それに署名する必要が出てきました。
私たちは easy-rsa
ユーティリティが利用可能な CA の PKI 内部で操作するので、署名の手順では、前の例で行ったように openssl
を直接使用するのではなく、easy-rsa
ユーティリティを使用して簡単に行うようにします。
架空の CSR に署名する最初の手順は、easy-rsa
スクリプトを使用して証明書要求をインポートすることです。
- cd ~/easy-rsa
- ./easyrsa import-req /tmp/sammy-server.req sammy-server
Output. . .The request has been successfully imported with a short name of: sammy-serverYou may now use this name to perform signing operations on this request.
次に、sign-req
オプション、要求タイプ、CSR に含まれる共通名を続けて指定した easyrsa
スクリプトを実行して、要求に署名することができます。 リクエストタイプはclient
、server
、ca
のいずれかを指定します。 架空のサーバーの証明書で練習しているので、必ずserver
リクエストタイプを使用してください:
- ./easyrsa sign-req server sammy-server
出力では、リクエストが信頼できるソースから来ていることを確認するよう求められます。
OutputYou are about to sign the following certificate.Please check over the details shown below for accuracy. Note that this requesthas not been cryptographically verified. Please be sure it came from a trustedsource or that you have verified the request checksum with the sender.Request subject, to be signed as a server certificate for 3650 days:subject= commonName = sammy-serverType the word 'yes' to continue, or any other input to abort. Confirm request details: yes. . .Certificate created at: /home/sammy/easy-rsa/pki/issued/sammy-server.crt
CA鍵を暗号化した場合、この時点でパスワードの入力を求められます。
以上の手順で、/home/sammy/easy-rsa/pki/private/ca.key
のCAサーバの秘密鍵を使用してsammy-server.req
CSRに署名できました。 この結果、sammy-server.crt
ファイルには、練習サーバの公開暗号鍵と、CAサーバからの新しい署名が含まれます。 署名のポイントは、CAを信頼する人に、sammy-server
証明書も信頼できることを伝えることです。
この要求がWebサーバやVPNサーバのような実際のサーバに対するものであれば、CAサーバの最後のステップは、CSR要求を行ったリモートサーバにCAサーバから新しいsammy-server.crt
ファイルとca.crt
ファイルを配布することです:
- scp pki/issued/sammy-server.crt sammy@your_server_ip:/tmp
- scp pki/ca.crt sammy@your_server_ip:/tmp
この時点で、Webサーバ、VPN、構成管理ツール、データベースシステム、クライアント認証などの目的で、発行した証明書を使用できるようになっているはずです。
(オプション) – 証明書の取り消し
時折、ユーザーまたはサーバーが証明書を使用できないようにするために、証明書を取り消す必要がある場合があります。
証明書を取り消すには、一般的に次の手順を実行します。
-
./easyrsa revoke client_name
コマンドを使用して証明書を取り消します。 - 更新された
crl.pem
ファイルをCAに依存しているサーバまたはサーバに転送し、それらのシステムで、それを参照するプログラムの必要なディレクトリまたはディレクトリにコピーします。 - CAおよびCRLファイルを使用しているサービスをすべて再起動します。
Revoking a Certificate
証明書を失効するには、CAサーバーの
easy-rsa
ディレクトリに移動します。- cd ~/easy-rsa
次に、
revoke
オプションと失効したいクライアント名の後に続けて、easyrsa
スクリプトを実行します。 上記の実践例に従い、証明書のCommon Nameはsammy-server
:- ./easyrsa revoke sammy-server
このとき、
yes
:OutputPlease confirm you wish to revoke the certificate with the following subject:subject= commonName = sammy-serverType the word 'yes' to continue, or any other input to abort. Continue with revocation: yes. . .Revoking Certificate 8348B3F146A765581946040D5C4D590A. . .を入力して失効を確認するよう求められます。
Revoking Certificate
行のハイライトされた値に注意してください。 この値は、取り消された証明書に固有のシリアル番号です。 このセクションの最後のステップで失効リストを調べて証明書がその中にあることを確認したい場合は、この値が必要です。動作を確認すると、CAは証明書を失効させます。 しかし、CAに依存するリモートシステムには、どの証明書が取り消されたかを確認する方法がありません。
次のステップでは、CRL を生成するか、既存の
crl.pem
ファイルを更新します。Generating a Certificate Revocation List
証明書を取り消したので、CA サーバーの取り消された証明書のリストを更新することが重要です。
CRL を生成するには、
~/easy-rsa
ディレクトリの中でgen-crl
オプションを指定してeasy-rsa
コマンドを実行します。gen-crl
コマンドは、その CA の取り消された証明書の更新リストを含むcrl.pem
というファイルを生成します。次に、
gen-crl
コマンドを実行するたびに、この CA に依存しているすべてのサーバーとクライアントに更新されたcrl.pem
ファイルを転送する必要があります。証明書取り消しリストの転送
さて、CA サーバで CRL を生成したので、それを CA に依存しているリモート システムに転送する必要があります。 このファイルをサーバーに転送するには、
scp
コマンドを使用します。注意: このチュートリアルでは、CRLを手動で生成して配布する方法を説明します。 OCSP-Staplingのような、より堅牢で自動化された方法で取り消しリストを配布およびチェックできますが、それらの方法の構成はこの記事の範囲外です。
非 root ユーザーとして CA サーバにログインしていることを確認して、
your_server_ip
:- scp ~/easy-rsa/pki/crl.pem sammy@your_server_ip:/tmp
ファイルがリモート システムにあるので、最後の手順は、取り消しリストの新しいコピーによってあらゆるサービスを更新することです。
CRL をサポートするサービスの更新
crl.pem
ファイルを使用するサービスを更新するために必要な手順を列挙することは、このチュートリアルの範囲外です。 一般的には、サービスが期待する場所にcrl.pem
ファイルをコピーし、systemctl
を使用してサービスを再起動する必要があります。一度、新しい
crl.pem
ファイルでサービスを更新すると、サービスは取り消された証明書を使用しているクライアントまたはサーバーからの接続を拒否することができるようになります。CRL の内容の検査と検証
取り消された証明書のリストを確認するなど、CRL ファイルを検査したい場合は、CA サーバーの
easy-rsa
ディレクトリ内で次のopenssl
コマンドを使用します。 たとえば、crl.pem
ファイルを 2 番目のシステムに転送し、sammy-server
証明書が失効していることを確認したい場合、次のようなopenssl
コマンドを使用し、証明書を失効したときに指摘したシリアル番号をここで強調表示した番号に置き換えます:- openssl crl -in /tmp/crl.pem -noout -text |grep -A 1 8348B3F146A765581946040D5C4D590A
OutputSerial Number: 8348B3F146A765581946040D5C4D590A Revocation Date: Apr 1 20:48:02 2020 GMTgrep
コマンドが、失効ステップで指摘した固有のシリアル番号を確認するのに使用されていることに注意してください。まとめ
このチュートリアルでは、スタンドアロンの Ubuntu 20.04 サーバー上で Easy-RSA パッケージを使用してプライベート認証局を作成しました。 CAに依存する当事者間で、信頼モデルがどのように機能するかを学びました。 また、練習用サーバーの証明書署名要求 (CSR) を作成し署名し、証明書を失効させる方法を学びました。 最後に、サービスにアクセスすべきでないユーザーやサーバーがアクセスできないようにするために、CA に依存するすべてのシステムに対して証明書取り消しリスト (CRL) を生成して配布する方法を学びました。
これで、ユーザーに対して証明書を発行して、それを OpenVPN などのサービスと共に使用することができるようになりました。 また、CA を使用して、証明書付きの開発およびステージング Web サーバーを構成し、非本番環境のセキュリティを確保することができます。 開発中に TLS 証明書を持つ CA を使用することで、コードと環境が本番環境にできるだけ一致するようにすることができます。 Working with SSL Certificates, Private Keys and CSRs」チュートリアルには、OpenSSL の基本をよりよく理解するための追加情報が多数掲載されています。