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
Output
init-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 というファイルにいくつかのデフォルト値を作成および入力する必要があります。 まず、cdeasy-rsa ディレクトリに移動し、nano またはお好みのテキスト エディタで vars ファイルを作成および編集します:

  • cd ~/easy-rsa
  • nano vars

ファイルを開いたら、次の行を貼り付けて、強調表示されている各値を編集して自分の組織の情報を反映させます。 ここで重要な部分は、任意の値を空白にしないことを確認することです:

~/easy-rsa/vars
set_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を押した後、YENTERを押して確認することで実行できます。 認証局を構築する準備が整いました。

認証局のルート公開鍵と秘密鍵のペアを作成するには、./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 台目のコンピュータのファイルにコピーして貼り付けることができます。 また、scprsyncなどのツールを使って、システム間でファイルを転送することもできます。

CAサーバーの非ルートユーザーとして、次のコマンドを実行します。

  • cat ~/easy-rsa/pki/ca.crt

ターミナルに次のような出力が表示されます。

2番目のLinuxシステムでnanoまたはお好みのテキストエディターを使用して、/tmp/ca.crt:

  • nano /tmp/ca.crt

先ほどCAサーバーからコピーした内容をエディターに貼り付けてください。 終了したら、ファイルを保存して閉じます。 nano を使用している場合は、CTRL+X を押し、YENTER を押して確定します。

これで、2番目の Linux システムに ca.crt ファイルのコピーができたので、今度はその証明書をそのオペレーティング システム証明書ストアにインポートする番です。

Ubuntu および Debian ベースのシステムでは、非 root ユーザーとして次のコマンドを実行して、証明書をインポートします:

Ubuntu および Debian 派生ディストリビューション
  • 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 コマンドを実行します。

CentOS, Fedora, RedHat distribution
  • 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
Output
Generating 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
Output
subject=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 スクリプトを実行して、要求に署名することができます。 リクエストタイプはclientservercaのいずれかを指定します。 架空のサーバーの証明書で練習しているので、必ずserverリクエストタイプを使用してください:

  • ./easyrsa sign-req server sammy-server

出力では、リクエストが信頼できるソースから来ていることを確認するよう求められます。

Output
You 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、構成管理ツール、データベースシステム、クライアント認証などの目的で、発行した証明書を使用できるようになっているはずです。

(オプション) – 証明書の取り消し

時折、ユーザーまたはサーバーが証明書を使用できないようにするために、証明書を取り消す必要がある場合があります。

証明書を取り消すには、一般的に次の手順を実行します。

  1. ./easyrsa revoke client_nameコマンドを使用して証明書を取り消します。
  2. 更新されたcrl.pemファイルをCAに依存しているサーバまたはサーバに転送し、それらのシステムで、それを参照するプログラムの必要なディレクトリまたはディレクトリにコピーします。
  3. CAおよびCRLファイルを使用しているサービスをすべて再起動します。

    Revoking a Certificate

    証明書を失効するには、CAサーバーのeasy-rsaディレクトリに移動します。

    • cd ~/easy-rsa

    次に、revokeオプションと失効したいクライアント名の後に続けて、easyrsaスクリプトを実行します。 上記の実践例に従い、証明書のCommon Nameは sammy-server:

    • ./easyrsa revoke sammy-server

    このとき、yes:

    Output
    Please 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
    Output
    Serial Number: 8348B3F146A765581946040D5C4D590A Revocation Date: Apr 1 20:48:02 2020 GMT

    grep コマンドが、失効ステップで指摘した固有のシリアル番号を確認するのに使用されていることに注意してください。

    まとめ

    このチュートリアルでは、スタンドアロンの Ubuntu 20.04 サーバー上で Easy-RSA パッケージを使用してプライベート認証局を作成しました。 CAに依存する当事者間で、信頼モデルがどのように機能するかを学びました。 また、練習用サーバーの証明書署名要求 (CSR) を作成し署名し、証明書を失効させる方法を学びました。 最後に、サービスにアクセスすべきでないユーザーやサーバーがアクセスできないようにするために、CA に依存するすべてのシステムに対して証明書取り消しリスト (CRL) を生成して配布する方法を学びました。

    これで、ユーザーに対して証明書を発行して、それを OpenVPN などのサービスと共に使用することができるようになりました。 また、CA を使用して、証明書付きの開発およびステージング Web サーバーを構成し、非本番環境のセキュリティを確保することができます。 開発中に TLS 証明書を持つ CA を使用することで、コードと環境が本番環境にできるだけ一致するようにすることができます。 Working with SSL Certificates, Private Keys and CSRs」チュートリアルには、OpenSSL の基本をよりよく理解するための追加情報が多数掲載されています。

コメントを残す

メールアドレスが公開されることはありません。