ZPA Browser Access用: Let’s Encrypt証明書の発行と適用

# はじめに
こんにちは、ゼットスケーラーでカスタマーサクセス・エンジニアを担当しておりますナレットです。

この記事は、ゼットスケーラー株式会社による [Advent Calendar 2023](https://qiita.com/advent-calendar/2023/zscaler) の4日目の記事として投稿されます。今回の記事では、Let's Encryptを利用してZPA Browser Access用の証明書を発行し、その適用方法について詳しく解説します。

また、後日「実践ガイド」としてZPA Browser Accessのセットアップと活用方法についても詳しくご紹介する予定です。お楽しみにしてください。

# 免責事項
本記事のコンテンツや情報において、可能な限り正確な情報を掲載するよう努めておりますが、 誤情報が入り込んだり、情報が古くなったりすることもあり、必ずしもその内容の正確性および完全性を保証するものではございません。そのため、本記事をエビデンスとしたゼットスケーラーへの問い合わせなどはご対応致しかねることをご理解頂けると幸いです。掲載内容はあくまで個人の意見であり、ゼットスケーラーの立場、戦略、意見を代表するものではありません。当該情報に基づいて被ったいかなる損害について、一切責任を負うものではございませんのであらかじめご了承ください。

# Browser Accessとは？
Browser Accessは便利なツールで、どのWebブラウザからでも追加のソフトウェアを必要とせず、安全にアプリケーションにアクセスできるようにします。例えば、Zscaler Client Connectorをサポートしていないデバイスや、会社が管理していないデバイス（例えば、パートナー企業のデバイス）からでも、簡単にアクセスすることができます。

# ワイルドカード証明書の使用
今回の検証では、ワイルドカード証明書を発行して使用します。ワイルドカード証明書は、一つの証明書で同一ドメインの複数のサブドメインをカバーすることができる便利な方法です。詳しくは、[ブラウザーアクセスアプリケーションでのワイルドカード証明書の使用](https://help.zscaler.com/ja/zpa/using-wildcard-certificates-browser-access-applications)を参照してください。

# Certbotとは？
Let's Encryptの証明書をmacOSで生成するためには、Certbotというコマンドラインツールのインストールが必要です。macOSでは、便利なパッケージマネージャーであるHomebrewを利用してCertbotを簡単にインストールできます。

# macOSにCertbotをインストール
```ruby:qiita.rb
brew install certbot
```

# Let's Encrypt SSL証明書を取得
Let's EncryptのSSL証明書を取得するには、以下のCertbotコマンドを使用します。証明書の秘密鍵アルゴリズムはRSAを指定します。

```ruby:qiita.rb
sudo certbot certonly --manual --preferred-challenges=dns --agree-tos --key-type rsa
```

この例では、ワイルドカード証明書（例: *.zkyone.com）を要求しています。

```ruby:qiita.rb
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): *.zkyone.com
Requesting a certificate for *.zkyone.com
```


コマンド実行後、以下のようなプロンプトが表示されます：
```ruby:qiita.rb
Please deploy a DNS TXT record under the name:

_acme-challenge.zkyone.com.

with the following value:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

このTXTレコードは、ドメインの所有権を証明するために使用されます。

### DNS TXTレコードを更新
提供された値を使用して、ドメインサービスにアクセスし、DNS TXT レコードを更新してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622929/abc440d2-f526-2802-643e-ff9529c4122a.png)

### DNSの伝搬を確認
以下のようなサービスを使用して DNSの伝搬を確認します。

https://toolbox.googleapps.com/apps/dig/#TXT/
https://dnschecker.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622929/04c2bcd6-32b0-7509-775e-6b4a76f356cc.png)


DNSの伝搬を確認したら、コマンドラインに戻ってEnterを押して続けます。

```ruby:qiita.rb
Press Enter to Continue

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/zkyone.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/zkyone.com/privkey.pem
```
証明書と秘密鍵が保存されているディレクトリをリストアウトします。
```ruby:qiita.rb
sudo ls /etc/letsencrypt/live/zkyone.com/
```
出力
```ruby:qiita.rb
cert.pem chain.pem fullchain.pem privkey.pem  README
```

ZPAにアップロードする証明書には、暗号化されていない秘密鍵が含まれている必要があります。詳しくはこちらを参照してください。[(Webサーバ)証明書のアップロード](https://help.zscaler.com/ja/zpa/uploading-web-server-certificates)

### 単一の .pem ファイルを生成
以下のコマンドは、証明書と暗号化されていないプライベートキーを組み合わせたPKCS#12ファイル(.pfx)を作成します。

```ruby:qiita.rb
sudo cd /etc/letsencrypt/live/zkyone.com/
openssl pkcs12 -export -in cert.pem -inkey privkey.pem -out combined.pfx
```
以下のコマンドは、証明書と暗号化されていない秘密鍵ファイルを結合したPKCS#12ファイル(.pfx)をPEM形式(.pem)に変換します。
```ruby:qiita.rb
openssl pkcs12 -in combined.pfx -out combined.pem -nodes
```
単一の .pem サーバ証明書を保持するディレクトリをリストアウトします。

```ruby:qiita.rb
sudo ls /etc/letsencrypt/live/zkyone.com/
cert.pem  chain.pem  combined.pem  combined.pfx  fullchain.pem privkey.pem  README
```

その後、生成されたファイル combined.pem をZPAポータルにアップロードします。

### サーバ証明書をアップロード
ZPA Admin Portal > Configuration & Control > Certificate Management > Certificates > Upload Server Certificate
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622929/1f56eeb5-a0f6-3e61-7d36-0de39942ac04.png)


# 証明書を更新
ブラウザアクセスアプリケーションのためのポータルサーバ証明書を更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622929/8170e9ef-584d-cff7-cc8c-5859dc333e74.png)

期限切れの証明書で設定されたユーザーポータルや特権ポータルがある場合は、それらも更新することを忘れないでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622929/ea11892f-817b-ca4f-6196-9d6a02c09ebe.png)

# 最後に
Let's Encrypt を利用すれば、有効期限は短いものの、無償でありながら、どのブラウザでも信頼される正式な証明書を発行することができます。この記事では、Let's Encryptを使用してZPA Browser Access用の証明書を発行し、適用するまでの一連のプロセスをご案内しました。次回の記事ではBrowser Accessの具体的な使用方法に焦点を当てる予定です。また、Let's Encrypt証明書の自動更新とZPAへのAPI経由でのアップロードに関する詳細も今後ご紹介したいと思います。

今日はこの記事をお読みいただき、ありがとうございました。それでは、また次の機会にお会いしましょう！