AWS WorkSpaces デバイス認証用の証明書をOpenSSLでサクッと作る手順

記事タイトルとURLをコピーする

AWS WorkSpaces で「信頼されたデバイスのみアクセスを許可する(デバイス認証)」を設定する際、証明書の作成で少しハマったので、現在の最短手順を備忘録として残します。

前提

  • OpenSSL がインストールされている環境(Mac, Linux, WSLなど)

1. 設定ファイル (workspaces.cnf) の作成

ここが最大のポイントです。AWSが要求する v3 拡張(Key Usageなど)を正確に付与するために、設定ファイルを作成します。 以下の内容を workspaces.cnf として保存してください。

[ req ]
distinguished_name = req_distinguished_name
req_extensions     = v3_req
x509_extensions    = v3_ca

[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
stateOrProvinceName         = State or Province Name (full name)
localityName                = Locality Name (eg, city)
organizationName            = Organization Name (eg, company)
commonName                  = Common Name (eg, YOUR name)

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

[ v3_ca ]
# ルートCA用の設定
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints       = critical, CA:true
keyUsage               = critical, digitalSignature, cRLSign, keyCertSign

[ v3_client ]
# クライアント(デバイス)証明書用の設定
# 要件: Key Usage: Digital Signature
# 要件: Enhanced Key Usage: Client Authentication
basicConstraints       = CA:FALSE
nsCertType             = client, email
nsComment              = "OpenSSL Generated Client Certificate"
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
keyUsage               = critical, digitalSignature
extendedKeyUsage       = clientAuth

v3拡張が必要な理由

単に openssl req コマンドを打つだけでも証明書は作れますが、それらはデフォルトでは「X.509 v1」という古い形式か、あるいは用途制限のない証明書になりがちです。

AWS WorkSpaces が要求しているのは、「この証明書は『クライアント認証』だけに使います」 と明確に用途が刻印された証明書(X.509 v3)です。これを実現するために、以下の2つの拡張設定が不可欠となります。

  1. Key Usage: Digital Signature(デジタル署名)

    • 背景: デバイス認証の通信時、PC(クライアント)は「私がこの秘密鍵の持ち主です」と証明するために、通信データに署名を行います。
    • 理由: この設定がないと、AWS側は「この証明書は署名用として許可されていない」と判断し、接続を拒否してしまいます。
  2. Extended Key Usage: Client Authentication(クライアント認証)

    • 背景: 証明書には「Webサーバー用」「メール署名用」「コード署名用」など様々な用途があります。
    • 理由: AWSはセキュリティのため、「クライアント認証(Client Authentication)」というタグが付いた証明書しか受け入れません。これにより、誤ってWebサーバー用の証明書などが認証に使われるのを防いでいます。

これらの細かい属性(拡張領域)を正確に付与するために、今回はコマンドラインオプションではなく、構成ファイル (workspaces.cnf) を使用しています。

2. ルート CA (認証局) の作成

まずは大元となるルート証明書を作成します。

# 秘密鍵の作成
openssl genrsa -out rootCA.key 4096

# ルート証明書の発行
# -subj の内容は適宜変更してください
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem -config workspaces.cnf -extensions v3_ca -subj "/C=JP/ST=Tokyo/O=MyOrg/CN=MyWorkSpacesRootCA"

3. クライアント(デバイス)証明書の作成

次に、実際に PC に配布する証明書を作成します。 ポイントは openssl x509 コマンド実行時に -extfile-extensions を指定して、クライアント認証用の属性を付与することです。

# クライアント秘密鍵の作成
openssl genrsa -out device.key 2048

# CSR (署名要求) の作成
# CN=の部分はデバイスを識別できる名前にします
openssl req -new -key device.key -out device.csr -config workspaces.cnf -subj "/C=JP/ST=Tokyo/O=MyOrg/CN=device-user-01"

# ルートCAによる署名(証明書の発行)
# ここで [ v3_client ] セクションを適用します
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 365 -sha256 -extfile workspaces.cnf -extensions v3_client

4. 配布用ファイル (p12) への変換

Windows や Mac にインストールするために .p12 形式に変換します。実行時にエクスポート用パスワードの設定を求められます。

openssl pkcs12 -export -out device.p12 -inkey device.key -in device.crt -certfile rootCA.pem

ところが、Mac にインポートができませんでした。 正しいパスワードを入れているはずなのにエラーになります。

最近の OpenSSL(バージョン3系)で作成した .p12 ファイルは、デフォルトの暗号化方式が新しすぎて、Mac のキーチェーンアクセスが読み取れず、「解読できない=パスワードが違う」と誤ったエラーを出している 可能性が非常に高いです。

これを解決するには、Mac が理解できる「昔ながらの形式」で書き出すための魔法のオプション -legacy を付けて作り直す必要があります。

openssl pkcs12 -export -legacy -out device.p12 -inkey device.key -in device.crt -certfile rootCA.pem

これで必要なファイルが揃いました。

  • rootCA.pem: テキストの中身をコピーして、AWS WorkSpaces コンソールの「信頼されたデバイスの証明書」に登録しましょう。
  • device.p12: 対象のクライアント PC に配布してインストールします。

5. WorkSpaces のディレクトリにルート証明書を登録

WorkSpaces コンソールを開き、対象のディレクトリを選択して [アクション] > [詳細の更新] をクリックします。
「アクセスコントロールオプション」という項目の中に設定があります。
「信頼されたデバイス...」のチェックを全てオンにします。

ここに、手順2で作成した rootCA.pem の中身(-----BEGIN CERTIFICATE----- から始まるテキスト)を貼り付けて [インポート] をクリックします。

正しくインポートされると、証明書の拇印(Thumbprint)が表示されます。これで AWS 側の設定は完了です。

6. クライアント PC にクライアント(デバイス)証明書を登録

Mac の場合 作成した .p12 ファイルをダブルクリックすると、キーチェーンアクセスへの登録画面が開きます。 ここでパスワードを求められますが、2回入力が必要になる点に注意してください。

  1. 証明書のパスワード: openssl コマンドで設定したパスワードを入力
  2. キーチェーンの変更許可: Mac のログインパスワードを入力

正しく登録されると、キーチェーン一覧に証明書が表示されます。

Windows の場合 .p12 ファイルをダブルクリックすると、「証明書のインポート ウィザード」が起動します。基本的には「次へ」で進めていけばOKですが、数箇所ポイントがあります。

  1. 保存場所の選択 「現在のユーザー」を選択して次へ進みます。

  2. ファイルの選択 そのまま次へ進みます。

  3. パスワードの入力とオプション 設定したパスワードを入力します。 この時、「このキーをエクスポート可能にする (Mark this key as exportable)」 にチェックを入れておくのがおすすめです。これをしておくと、PC入れ替え時などに証明書をバックアップ(再エクスポート)できるようになります。

  4. 証明書ストアの選択 「証明書の種類に基づいて、自動的に証明書ストアを選択する」のままで大丈夫です。

  5. 完了とセキュリティ警告 [完了] をクリックすると、セキュリティ警告が表示されます。 これは「自作した(公的な認証局ではない)証明書」をインストールする際に必ず出る警告です。 自分で作ったものなので問題ありません。[はい(Yes)] をクリックしてインストールを完了させます。

7. 接続

証明書インストール前には接続できませんでした。デバイスエラーが出ています。

証明書インストール後には接続できるようになりました。

補足:証明書の有効期限(Expire)について

今回の手順では、コマンド内の -days オプションで証明書の有効期限を設定しています。

  • ルート CA 証明書: 3650 (約10年)
  • クライアント証明書: 365 (1年)
# クライアント証明書の作成コマンド(抜粋)
openssl x509 ... -days 365 ...

なぜ期間が違うのか

ルート CA は、一度 AWS 側や全社員の PC に登録すると、入れ替え作業が非常に大変(全台再配布)になります。そのため、一般的に 10年〜20年 といった長い期間を設定します。

一方、クライアント証明書 は、紛失や盗難のリスクを考慮して 1年〜2年 程度で運用するのが一般的です。

期限を変えたい場合

運用を楽にするために「クライアント証明書も 3年 (1095日) にしたい」という場合は、openssl x509 コマンドの -days 365 の部分を -days 1095 に書き換えて実行してください。

有効期限の確認方法

作成した証明書がいつ切れるかは、以下のコマンドで確認できます。

openssl x509 -in device.crt -noout -enddate
# 出力例: notAfter=Jan 23 15:00:00 2027 GMT

公式ドキュメント

docs.aws.amazon.com

手順は以上です。

山本 哲也 (記事一覧)

カスタマーサクセス部のインフラエンジニア。

山を走るのが趣味です。