Google WorkspaceとAzure ADFS環境でOffice 365のSAML証明書を更新する手順
概要
ある日、突然 Office 365 へログインできなくなりました。
Error: malformed_certificate

原因は SAML の有効期限切れだったので、問題の発見方法と設定手順を説明します。
背景
弊社のアカウント管理がどのようになっているかを以下に説明します。
- Google Workspace を利用しているので Google Workspace のユーザマスタを主として運用している。
- Microsoft Azure を利用して ADFS(Active Directory Federation Service)を使っている。
- ADFS を利用することによって Office 365 のユーザを ADFS のユーザと同期できるようになってライセンス付与を自動化している。
上記の設定によって以下のようなユースケースを実現しています。
- ユーザマスタ管理者が Google Workspace 上でユーザを作成
- 自動的に Microsoft Azure の ADFS にユーザ情報が同期される(5 分ぐらいかかる)
- Office 365 のライセンスが Organization Unit に応じて付与される。
当時、ADFS の設定をしたときにはドキュメントがほとんど存在していなくて設定をするのにまる 1 日ぐらいかかったと思います。
今、検索してみたら以下の記事にわかりやすくまとまっているのを見つけました。
(当時、手順書をかブログにまとめようと思っていましたが複雑だったのと、色々トライアンドエラーをしていたし、スクショにマスクをしないといけなかったりで面倒なので諦めました)
原因
最初に挙げた問題に対して軽く調べましたところ、原因は Google Workspace 上の Microsoft 365 アプリで発行した SAML の証明書が切れたからでした。
SAML 連携の設定時に Service Provider へ IdP で発行した証明書を登録します。
関連づいている証明書はこちらから確認できます。スクショではすでに更新済みなので有効期限が未来になっています。

上記のボタンを押すと証明書の削除や新規発行が行える画面になるのでここで証明書の管理をします。本来なら有効期限が切れる前にこの操作をして登録をしておく必要があります。

更新手順
ADFS 環境にて SAMLを設定するための手順書は存在しているのですが、更新する際の手順書が見つかりませんでした。
この更新作業には Windows の PC が必要になります。Windows が手元に無いので Azure の VM を立ち上げて作業します。
ちなみに、Azure 上の PowerShell で更新ができたら楽だったのですができませんでした。

Azure 上で適当に Windows を立ち上げます。無料クレジットがあると思いますので、無料で立ち上げられると思います。

手元の mac から Remote Desktop を使ってこの VM へ接続します。PowerShell を立ち上げます。

まず、設定を確認してみます。
以下のコマンドで ADFS に使っている SAML の設定情報を出力します。
$DomainName = "example.com"
Get-MsolDomainFederationSettings -DomainName $DomainName

古い証明書が登録されていることを確認しておきます。
まず、Federatedの状態を解除してManagedにします。
Set-MsolDomainAuthentication -Authentication Managed -DomainName example.com

以下のようなコマンドを打ち込んで、SAMLの設定を更新します。
xxxxxxxx は伏せ字です
$ssoUrl = "https://accounts.google.com/o/saml2/idp?idpid=xxxxxxxx"
$entity = "https://accounts.google.com/o/saml2?idpid=xxxxxxxx"
$domain = "xxxxxx"
$cert = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Set-MsolDomainAuthentication -Authentication Federated -DomainName $domain -ActiveLogOnUri $ssoUrl -PassiveLogOnUri $ssoUrl -IssuerUri $entity -LogOffUri $ssoUrl -SigningCertificate $cert -PreferredAuthenticationProtocol SAMLP
証明書が更新されているかを以下のコマンドで確認します。
$DomainName = "example.com"
Get-MsolDomainFederationSettings -DomainName $DomainName
そのあと、以下のコマンドを打ち込んでドメインの状態がFederatedになっているかを確認します。
Get-MsolDomainFederationSettings
テスト
Google WorkspaceのOffice 365のアプリ画面から TEST SAML LOGIN をクリックしてログインが成功するかを検証します。冒頭のエラーが出なくログインできれば成功です。

最後に、立ち上げたVMを綺麗サッパリ削除して終わりにします。
考察
Federatedを解除しないで更新できるか?
できませんでした。
Set-MsolDomainAuthentication コマンドを使って新しい証明書を設定しようとしましたができませんでした。コマンド自体は成功しますが、証明書が書き換わりませんでした。
VMを立ち上げないでCloud Shellでできるのか?
Connect-MsolService で接続できないので無理かなと思います。
自動更新できないのか?
でき無さそう。自分でリマインダーを設定しておきましょう。

Discussion