Exchange と Exchange Online 組織の間の OAuth 認証を構成する

ハイブリッド構成ウィザードでは、Exchange Server オンプレミス組織と Exchange Online 組織の間で OAuth 認証が自動的に構成されます。 Exchange 組織に Exchange 2010 または Exchange 2007 サーバーが含まれている場合、ハイブリッド構成ウィザードでは、オンプレミスとオンラインの Exchange 組織の間で OAuth 認証が構成されません。 既定では、これらの展開は引き続きフェデレーション信頼プロセスを使用します。 ただし、一部の機能は、新しい Exchange OAuth 認証プロトコルを使用して組織全体でのみ完全に使用できます。

現在のところ、新しい Exchange OAuth 認証プロセスにより Exchange の機能のうち以下のものが有効になります。

  • メッセージ レコード管理 (MRM)
  • Exchange のインプレース電子情報開示
  • Exchange インプレース アーカイブ

ハイブリッド構成ウィザードを実行した後、すべての混合 Exchange 2013 組織で Exchange OAuth 認証を構成することをお勧めします。

重要

  • オンプレミス組織で、累積的な更新プログラム 5 以降、Exchange 2016 または Exchange 2019 を使用する Exchange 2013 サーバーのみを実行している場合は、このトピックの手順を実行する代わりにハイブリッド構成ウィザードを実行します。

  • Exchange Server 2013 のこの機能は、中国で 21Vianet によって運用される Office 365 との完全な互換性を備えておらず、いくつかの機能制限が適用される場合があります。 詳細については、「 21Vianet が運営する Office 365」を参照してください。

はじめに把握しておくべき情報

  • このタスクの予想所要時間:15 分。

  • この手順を実行する際には、あらかじめアクセス許可が割り当てられている必要があります。 必要なアクセス許可を確認するには、「 Exchange とシェルのインフラストラクチャ のアクセス許可」トピックの「フェデレーションと証明書」のアクセス許可エントリを参照してください。

  • ハイブリッド構成ウィザードを使用してハイブリッド展開の構成を完了しました。 詳細については、「 Exchange Server ハイブリッド展開」を参照してください。

  • このトピックの手順で使用可能なキーボード ショートカットについては、「Exchange 管理センターのキーボード ショートカット」を参照してください。

ヒント

問題がある場合は、 Exchange のフォーラムで質問してください。 Exchange Server のフォーラムにアクセスします。

社内の Exchange 組織と Exchange Online 組織の間で OAuth の認証を構成する方法

用語集

初期ドメイン: テナントでプロビジョニングされた最初のドメイン。 たとえば、「 contoso.onmicrosoft.com 」のように入力します。 このドキュメントでは、テナントの初期ドメイン><と呼ばれます。

ハイブリッド ルーティング ドメイン: contoso.mail.onmicrosoft.comなどの Exchange ハイブリッド環境のハイブリッド ルーティング ドメインは、オンプレミスの Exchange サーバーと Exchange Online の間のメール フローを管理するために使用されます。 これにより、両方の環境でシームレスな通信とメッセージ配信が保証されます。 このドキュメントでは、ハイブリッド ルーティング ドメイン><と呼ばれます。

Microsoft Online 電子メール ルーティング アドレス (MOERA): ユーザーの userPrincipalName プレフィックスから作成されたアドレスに加えて、初期ドメイン サフィックスが追加され、Microsoft Entra ID の proxyAddress に自動的に追加されます。 たとえば、「 smtp:john.doe@contoso.onmicrosoft.com 」のように入力します。 このドキュメントの MOERA は使用しませんが、完全のためにここに一覧表示します。

プライマリ SMTP ドメイン: Microsoft Exchange Server のプライマリ SMTP ドメインは、組織内のメール アドレスに使用されるメイン ドメインです。 このドキュメントでは、プライマリ SMTP ドメイン<>と呼ばれます。

自動検出エンドポイント: 自動検出エンドポイントは、Exchange Server 構成情報を提供する Web サービス URL です。 これにより、アプリケーションは Exchange サービスを自動的に検出して接続できます。 たとえば、会社がプライマリ SMTP ドメインとして contoso.com を使用している場合、自動検出エンドポイントは通常、 https://autodiscover.contoso.com/autodiscover/autodiscover.svc または https://contoso.com/autodiscover/autodiscover.svcされます。 このドキュメントでは、オンプレミスの自動検出エンドポイント<>と呼ばれます。

Exchange Web Services (EWS): Exchange Web Services (EWS) は、アプリケーションがメール メッセージ、会議、連絡先などのメールボックスアイテムにアクセスできるようにするクロスプラットフォーム API です。 このドキュメントでは、<オンプレミスの外部 Exchange Web サービス URL と呼ばれます>。

手順 1: Exchange Online 組織の承認サーバー オブジェクトを作成する

オンプレミスの Exchange 組織の Exchange 管理シェル (Exchange PowerShell) で次のコマンドを実行します。 コマンドを実行する前に、プレースホルダーを値に置き換えてください。

New-AuthServer -Name "WindowsAzureACS" -AuthMetadataUrl "https://accounts.accesscontrol.windows.net/<your tenant initial domain>/metadata/json/1"
New-AuthServer -Name "evoSTS" -Type AzureAD -AuthMetadataUrl "https://login.windows.net/<your tenant initial domain>/federationmetadata/2007-06/federationmetadata.xml"

GCC High または DoD では、代わりに次のコマンドを使用する必要があります。

New-AuthServer -Name "WindowsAzureACS" -AuthMetadataUrl "https://login.microsoftonline.us/<your tenant initial domain>/metadata/json/1"
New-AuthServer -Name "evoSTS" -Type AzureAD -AuthMetadataUrl "https://login.microsoftonline.us/<your tenant initial domain>/federationmetadata/2007-06/federationmetadata.xml"

ステップ 2:Exchange Online 組織のパートナー アプリケーションを使用可能にする

オンプレミスの Exchange 組織の Exchange PowerShell で次のコマンドを実行します。

Get-PartnerApplication |  Where-Object {$_.ApplicationIdentifier -eq "00000002-0000-0ff1-ce00-000000000000" -and $_.Realm -eq ""} | Set-PartnerApplication -Enabled $true

ステップ 3:社内の認証証明書をエクスポートする

この手順では、Exchange サーバーで PowerShell スクリプトを直接実行してオンプレミスの承認証明書をエクスポートし、次の手順で Exchange Online 組織にインポートする必要があります。

  1. 次のテキストを、たとえば ExportAuthCert.ps1 という名前の PowerShell スクリプト ファイルに保存します。

    注:

    今後新しい認証証明書になるように構成されている証明書をアップロードする場合は、 $thumbprint = (Get-AuthConfig).CurrentCertificateThumbprint$thumbprint = (Get-AuthConfig).NewCertificateThumbprintに置き換えます。

    $thumbprint = (Get-AuthConfig).CurrentCertificateThumbprint
    if((Test-Path $env:SYSTEMDRIVE\OAuthConfig) -eq $false)
    {
       New-Item -Path $env:SYSTEMDRIVE\OAuthConfig -Type Directory
    }
    Set-Location -Path $env:SYSTEMDRIVE\OAuthConfig
    $oAuthCert = (dir Cert:\LocalMachine\My) | Where-Object {$_.Thumbprint -match $thumbprint}
    $certType = [System.Security.Cryptography.X509Certificates.X509ContentType]::Cert
    $certBytes = $oAuthCert.Export($certType)
    $CertFile = "$env:SYSTEMDRIVE\OAuthConfig\OAuthCert.cer"
    [System.IO.File]::WriteAllBytes($CertFile, $certBytes)
    
  2. 社内 Exchange 組織の Exchange PowerShell で、直前の手順で作成した PowerShell スクリプトを実行します。 以下に例を示します。

    .\ExportAuthCert.ps1
    

手順 4: オンプレミスの承認証明書を Microsoft Entra Access Control Service (ACS) にアップロードする

次に、Microsoft Graph PowerShell を使用して、前の手順でエクスポートしたオンプレミスの承認証明書を Microsoft Entra Access Control Services (ACS) にアップロードします。 モジュールがインストールされていない場合は、管理者として Windows PowerShell ウィンドウを開き、次のコマンドを実行します。

Install-Module -Name Microsoft.Graph.Applications

Microsoft Graph PowerShell がインストールされたら、次の手順を実行します。

  1. Microsoft Graph コマンドレットがインストールされている Windows PowerShell ワークスペースを開きます。 この手順のすべてのコマンドは、Microsoft Graph コンソールに接続されている Windows PowerShell を使用して実行されます。

  2. 次のテキストを、たとえば UploadAuthCert.ps1 という名前の PowerShell スクリプト ファイルに保存します。

    Connect-MgGraph -Scopes Application.ReadWrite.All
    
    $CertFile = "$env:SYSTEMDRIVE\OAuthConfig\OAuthCert.cer"
    $objFSO = New-Object -ComObject Scripting.FileSystemObject
    $CertFile = $objFSO.GetAbsolutePathName($CertFile)
    $cer = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($CertFile)
    $binCert = $cer.GetRawCertData()
    $credValue = [System.Convert]::ToBase64String($binCert)
    $ServiceName = "00000002-0000-0ff1-ce00-000000000000"
    Write-Host "[+] Trying to query the service principals for service: $ServiceName" -ForegroundColor Cyan
    $p = Get-MgServicePrincipal -Filter "AppId eq '$ServiceName'"
    Write-Host "[+] Trying to query the keyCredentials for service: $ServiceName" -ForegroundColor Cyan
    $servicePrincipalKeyInformation = Get-MgServicePrincipal -Filter "AppId eq '$ServiceName'" -Select "keyCredentials"
    
    $keyCredentialsLength = $servicePrincipalKeyInformation.KeyCredentials.Length
    if ($keyCredentialsLength -gt 0) {
       Write-Host "[+] $keyCredentialsLength existing key(s) found - we keep them if they have not expired" -ForegroundColor Cyan
    
       $newCertAlreadyExists = $false
       $servicePrincipalObj = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphServicePrincipal
       $keyCredentialsArray = @()
    
       foreach ($cred in $servicePrincipalKeyInformation.KeyCredentials) {
          $thumbprint = [System.Convert]::ToBase64String($cred.CustomKeyIdentifier)
    
          Write-Host "[+] Processing existing key: $($cred.DisplayName) thumbprint: $thumbprint" -ForegroundColor Cyan
    
          if ($newCertAlreadyExists -ne $true) {
             $newCertAlreadyExists = ($cer.Thumbprint).Equals($thumbprint, [System.StringComparison]::OrdinalIgnoreCase)
          }
    
          if ($cred.EndDateTime -lt (Get-Date)) {
             Write-Host "[+] This key has expired on $($cred.EndDateTime) and will not be retained" -ForegroundColor Yellow
             continue
          }
    
          $keyCredential = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphKeyCredential
          $keyCredential.Type = "AsymmetricX509Cert"
          $keyCredential.Usage = "Verify"
          $keyCredential.Key = $cred.Key
    
          $keyCredentialsArray += $keyCredential
       }
    
    
       if ($newCertAlreadyExists -eq $false) {
          Write-Host "[+] New key: $($cer.Subject) thumbprint: $($cer.Thumbprint) will be added" -ForegroundColor Cyan
          $keyCredential = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphKeyCredential
          $keyCredential.Type = "AsymmetricX509Cert"
          $keyCredential.Usage = "Verify"
          $keyCredential.Key = [System.Text.Encoding]::ASCII.GetBytes($credValue)
    
          $keyCredentialsArray += $keyCredential
    
          $servicePrincipalObj.KeyCredentials = $keyCredentialsArray
          Update-MgServicePrincipal -ServicePrincipalId $p.Id -BodyParameter $servicePrincipalObj
       } else {
          Write-Host "[+] New key: $($cer.Subject) thumbprint: $($cer.Thumbprint) already exists and will not be uploaded again" -ForegroundColor Yellow
       }
    } else {
       $params = @{
          type = "AsymmetricX509Cert"
          usage = "Verify"
          key = [System.Text.Encoding]::ASCII.GetBytes($credValue)
       }
    
       Write-Host "[+] This is the first key which will be added to this service principal" -ForegroundColor Cyan
       Update-MgServicePrincipal -ServicePrincipalId $p.Id -KeyCredentials $params
    }
    
  3. 直前の手順で作成した PowerShell スクリプトを実行します。 たとえば、

    .\UploadAuthCert.ps1
    
  4. スクリプトを起動した後に、[資格情報] ダイアログ ボックスが表示されます。 Microsoft Online Microsoft Entra 組織のテナント管理者アカウントの資格情報を入力します。 スクリプトを実行した後、Windows PowerShell を Microsoft Graph セッションに接続したままにします。 これは、次のステップで PowerShell スクリプトを実行するために使用します。

手順 5: 内部および外部のオンプレミス Exchange HTTP エンドポイントのすべてのホスト名機関を Microsoft Entra ID で登録する

この手順では、ハイブリッド先進認証の内部 URL と外部 URL を含む、オンプレミスの Exchange 組織のパブリックにアクセス可能なエンドポイントごとにスクリプトを実行する必要があります。 たとえば、Exchange が https://mail.contoso.com/ews/exchange.asmxで外部から使用できる場合は、サービス プリンシパル名 https://mail.contoso.comを使用します。 追加の外部ホスト名機関を登録するための制限はありません。

オンプレミス組織の Exchange エンドポイントを確認するには、Exchange 管理シェルで次のコマンドを実行します。

Get-MapiVirtualDirectory | Format-List server,*url*
Get-WebServicesVirtualDirectory | Format-List server,*url*
Get-OABVirtualDirectory | Format-List server,*url*

注:

次のスクリプトでは、前のセクションの手順 4 で説明したように、Microsoft Graph に接続されている Windows PowerShell が Microsoft 365 組織に接続されている必要があります。

  1. 次のテキストを、たとえば RegisterEndpoints.ps1 という名前の PowerShell スクリプト ファイルに保存します。 https://mail.contoso.com/https://autodiscover.contoso.com/を、オンプレミスの Exchange 組織の適切なホスト名機関に置き換えます。

     $ServiceName = "00000002-0000-0ff1-ce00-000000000000";
     $x = Get-MgServicePrincipal -Filter "AppId eq '$ServiceName'"
     $x.ServicePrincipalNames += "https://mail.contoso.com/"
     $x.ServicePrincipalNames += "https://autodiscover.contoso.com/"
     Update-MgServicePrincipal -ServicePrincipalId $x.Id -ServicePrincipalNames $x.ServicePrincipalNames
    
  2. Microsoft Graph に接続されている Windows PowerShell で、前の手順で作成した Windows PowerShell スクリプトを実行します。 以下に例を示します。

    .\RegisterEndpoints.ps1
    
  3. すべてのレコードが追加されたことを確認するには、Microsoft Graph に接続されている Windows PowerShell で次のコマンドを実行し、結果に https://namespace エントリを探します。

    Get-MgServicePrincipal -Filter "AppId eq '$ServiceName'" | Select-Object -ExpandProperty ServicePrincipalNames | Sort-Object
    

手順 6: オンプレミス組織から Microsoft 365 または Office 365 に IntraOrganizationConnector を作成する

この手順では、オンプレミスの Exchange Server が Exchange Online 組織にアクセスできるようにする IntraOrganizationConnector を構成します。 このコネクタを使用すると、組織全体で機能の可用性とサービス接続が可能になります。 オンプレミステナントと Microsoft 365 テナントまたは Office 365 テナントの両方で Get-IntraOrganizationConfiguration コマンドレットを使用して、 New-IntraOrganizationConnector コマンドレットで必要なエンドポイント値を決定できます。

ハイブリッド ルーティング ドメインをターゲット アドレスとして構成します。 ハイブリッド ルーティング ドメインは、Microsoft 365 または Office 365 組織の作成時に自動的に作成されます。 たとえば、Microsoft 365 または Office 365 組織で追加および検証された最初のドメインが contoso.comされている場合、ターゲット アドレスは contoso.mail.onmicrosoft.com

Exchange PowerShell を使用して、社内の組織で次のコマンドレットを実行します。

$ServiceDomain = (Get-AcceptedDomain | Where-Object {$_.DomainName -like "*.mail.onmicrosoft.com"}).DomainName.Address
New-IntraOrganizationConnector -Name ExchangeHybridOnPremisesToOnline -DiscoveryEndpoint https://outlook.office365.com/autodiscover/autodiscover.svc -TargetAddressDomains $ServiceDomain

手順 7: Microsoft 365 または Office 365 組織からオンプレミスの Exchange 組織に IntraOrganizationConnector を作成する

この手順では、Exchange Online がオンプレミスの Exchange 組織にアクセスできるようにする IntraOrganizationConnector を構成します。 このコネクタを使用すると、組織全体で機能の可用性とサービス接続が可能になります。 オンプレミステナントと Microsoft 365 テナントまたは Office 365 テナントの両方で Get-IntraOrganizationConfiguration コマンドレットを使用して、 New-IntraOrganizationConnector コマンドレットで必要なエンドポイント値を決定できます。

Exchange オンプレミス組織で使用されるすべての SMTP ドメイン ( initial domainhybrid routing domainを除く) を TargetAddressDomainsとして追加する必要があります。 複数の SMTP ドメインがある場合は、コンマ区切りリストとして追加します (たとえば、 contoso.comtailspintoys.com)。 また、オンプレミスの自動検出エンドポイントを DiscoveryEndpointとして指定する必要もあります。

Exchange Online PowerShell に接続したら、<your on-premises AutoDiscover endpoint><your on-premises SMTP domain(s)>を自分の値に置き換え、次のコマンドを実行します。

New-IntraOrganizationConnector -Name ExchangeHybridOnlineToOnPremises -DiscoveryEndpoint <your on-premises AutoDiscover endpoint> -TargetAddressDomains <your on-premises SMTP domain(s)>

ステップ 8:Exchange 2013 SP1 よりも前のサーバー用に AvailabilityAddressSpace を構成する

警告

Exchange Server 2007、Exchange Server 2010、Exchange Server 2013 はサポート終了に達しました。

古い Exchange 組織でハイブリッド展開を構成する場合は、Exchange 2013 SP1 以降を実行している Exchange 2013 サーバーが少なくとも 1 つ必要です。 Exchange 2013 サーバーには、クライアント アクセス サーバーとメールボックス サーバーの役割が必要です。 Exchange 2013 サーバーは、既存の Exchange オンプレミス組織と Exchange Online 組織との間の通信を調整します。 ハイブリッド展開機能の信頼性と可用性を向上させために、社内組織に複数の Exchange 2013 サーバーを設置することを強くお勧めします。

Exchange 2010 または Exchange 2007 を使用する Exchange 2013 組織では、インターネットに接続するすべてのフロントエンド サーバーが SP1 以降を実行している Exchange 2013 クライアント アクセス サーバーであることをお勧めします。 すべての Exchange Web サービス (EWS) 要求は、Exchange 2013 クライアント アクセス サーバーを経由する必要があります。 この要件には、Microsoft 365 からオンプレミスの Exchange 組織への要求と、オンプレミスの Exchange 組織から Microsoft 365 への要求が含まれます。 処理負荷を処理し、接続の冗長性を提供するのに十分な Exchange 2013 クライアント アクセス サーバーが必要です。 必要なクライアント アクセス サーバーの数は、EWS 要求の平均量によって異なり、組織によって異なります。

次の手順を完了する前に、以下の点を確認してください。

  • フロントエンド ハイブリッド サーバーは、Exchange 2013 SP1 以降です。
  • Exchange 2013 サーバー用の一意の外部 EWS URL がある。 Microsoft 365 または Office 365 組織は、ハイブリッド機能を正しく機能させるためにクラウドベースの要求を行うために、これらのサーバーに接続する必要があります。
  • サーバーにメールボックス サーバーとクライアント アクセス サーバーの両方の役割がある
  • 既存の Exchange 2010/2007 メールボックス サーバーおよびクライアント アクセス サーバーに、最新の累積更新プログラム (CU) またはサービス パック (SP) が適用されている。

注:

既存の Exchange 2010/2007 メールボックス サーバーは、非ハイブリッド機能接続用に Exchange 2010/2007 クライアント アクセス サーバーをフロントエンド サーバーとして引き続き使用できます。 Exchange 2013 サーバーに接続する必要があるのは、Microsoft 365 または Office 365 組織からのハイブリッド展開機能の要求のみです。

AvailabilityAddressSpaceは、オンプレミスの Exchange 2013 SP1 クライアント アクセス サーバーの Exchange Web サービス エンドポイントを指す Exchange 2013 以前のクライアント アクセス サーバーで構成する必要があります。 このエンドポイントは、手順 5 で概説したエンドポイントと同じものですが、社内の Exchange 2013 SP1 クライアント アクセス サーバーから、次のコマンドレットを実行することで判別できます。

Get-WebServicesVirtualDirectory | Format-List AdminDisplayVersion,ExternalUrl

注:

複数のサーバーから仮想ディレクトリ情報が返ってくる場合は、Exchange 2013 SP1 クライアント アクセス サーバーへ返されたエンドポイントを使用していることを確認してください。 AdminDisplayVersion パラメーターの15.0 (Build 847.32)以上が表示されます。

AvailabilityAddressSpaceを構成するには、Exchange PowerShell を使用し、オンプレミス組織で次のコマンドレットを実行します。

Add-AvailabilityAddressSpace -AccessMethod InternalProxy -ProxyUrl <your on-premises external Exchange Web Services URL> -ForestName <your hybrid routing domain> -UseServiceAccount $true

正常な動作を確認する方法

Test-OAuthConnectivity コマンドレットを使用して、OAuth 構成が正しいことを検証できます。 このコマンドレットは、オンプレミスの Exchange エンドポイントと Exchange Online エンドポイントが相互に要求を正常に認証できることを確認します。

社内の Exchange 組織が Exchange Online に正常に接続できることを検証するために、社内の組織の Exchange PowerShell で次のコマンドを実行します。

Test-OAuthConnectivity -Service EWS -TargetUri https://outlook.office365.com/ews/exchange.asmx -Mailbox <On-Premises Mailbox> -Verbose | Format-List

Exchange Online 組織がオンプレミスの Exchange 組織に正常に接続できることを確認するには、 Exchange Online PowerShell に接続し 、次のコマンドを実行します。

Test-OAuthConnectivity -Service EWS -TargetUri <external hostname authority of your Exchange On-Premises deployment>/metadata/json/1 -Mailbox <Exchange Online Mailbox> -Verbose | Format-List

例:

Test-OAuthConnectivity -Service EWS -TargetUri `https://mail.contoso.com/metadata/json/1` -Mailbox ExchangeOnlineBox1 -Verbose | Format-List

重要

The SMTP address has no mailbox associated with it. エラーは無視できます。 ResultTask パラメーターが Success の値を返す必要があるのは重要です。 たとえば、テスト出力の最後のセクションは次のようになります。

ResultType: Success
Identity: Microsoft.Exchange.Security.OAuth.ValidationResultNodeId
IsValid: True
ObjectState: New