[UiPath] オンプレ版OrchestratorでURL変更＆証明書差し替え

# 前提
| 使用した環境 | バージョン　|
| -------     | -----      |
|       IIS      |     Windows Server 2019 Standard Edition        |
|    SQLServer         |  Windows Server 2012 Standard Edition / SQL Server 2016 Standard Edition(64-bit)           |
|   Orchestrator          |      2020.10.11       |

- 下記手順では、旧URL「https:\//[ホスト名]」を、新URL「https:\//[EC2インスタンスのパブリック IPv4 DNS]/」に変更します。
- 証明書は、SAN値付き自己署名証明書を発行します。

# 参照した公式ドキュメント
- [Orchestrator/Identity Server の URL を変更する](https://docs.uipath.com/ja/orchestrator/standalone/2020.10/installation-guide/changing-the-orchestrator-identity-server-url#changing-the-orchestrator-url)
- [証明書を使用して HTTPS プロトコルを有効化する](https://docs.uipath.com/ja/orchestrator/standalone/2020.10/installation-guide/using-a-certificate-for-the-https-protocol)
- [Orchestrator サーバー証明書入れ替え手順](https://docs.uipath.com/ja/orchestrator/standalone/2020.10/installation-guide/using-a-certificate-for-the-https-protocol)

# 手順
## URLを変更する
1. 念のためIISを停止する。（公式の手順にはないが、この後設定ファイルいじるので一応。）

2. UiPath.Orchestrator.dll.config (C:\Program Files (x86)\UiPath\Orchestrator) を修正する。

| 検索する項目 | 変更前 | 変更後 |
|  ---  |  ---   |  ---  |
| ExternalAuth.System.OpenIdConnect.Authority | \<add key="ExternalAuth.System.OpenIdConnect.Authority" value="https://**[OldOrchestratorAddress]**/identity" /> | \<add key="ExternalAuth.System.OpenIdConnect.Authority" value="https://**[NewOrchestratorAddress]**/identity" /> |
| ExternalAuth.System.OpenIdConnect.RedirectUri | \<add key="ExternalAuth.System.OpenIdConnect.RedirectUri" value="https://**[OldOrchestratorAddress]**/signinsystemopenidconnect" /> | \<add key="ExternalAuth.System.OpenIdConnect.RedirectUri" value="https://**[NewOrchestratorAddress]**/signinsystemopenidconnect" /> |
| ExternalAuth.System.OpenIdConnect.PostLogoutRedirectUri | \<add key="ExternalAuth.System.OpenIdConnect.PostLogoutRedirectUri" value="https://**[OldOrchestratorAddress]**" /> | \<add key="ExternalAuth.System.OpenIdConnect.PostLogoutRedirectUri" value="https://**[NewOrchestratorAddress]**" /> |
| IdentityServer.Integration.Authority | \<add key="IdentityServer.Integration.Authority" value="https://**[OldOrchestratorAddress]**/identity" />|  \<add key="IdentityServer.Integration.Authority" value="https://**[NewOrchestratorAddress]**/identity" /> |
 
 3\. appsettings.Production.json (C:\Program Files (x86)\UiPath\Orchestrator\Identity) を修正する。

- 変更前

      "AppSettings": {
        "IdentityServerAddress": "https://[OldOrchestratorAddress]/identity", ......
        }

- 変更後

      "AppSettings": {
        "IdentityServerAddress": "https://[NewOrchestratorAddress]/identity", ......
        }

 4\. SSMSでClientRedirectUris テーブルを開き、https://**[OldOrchestratorAddress]**/signinsystemopenidconnect の値を持つ [RedirectUri] フィールドを探す。
⇒下図だと、Id=2,5の2件。（Id=2は「http://」なので、手順的には変えなくてもいいのかもしれませんが、今回は変えました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/5758bef1-a543-6177-5fc0-c91926eeb9c4.png)

 5\. 下記のクエリを実行し、https://**[NewOrchestratorAddress]**/signinsystemopenidconnect に変更する。

	UPDATE [UiPath].[identity].[ClientRedirectUris] SET RedirectUri = 'http://[NewOrchestratorAddress]/signinsystemopenidconnect' WHERE Id = [上記で確認したId];
	UPDATE [UiPath].[identity].[ClientRedirectUris] SET RedirectUri = 'https://[NewOrchestratorAddress]/signinsystemopenidconnect' WHERE Id = [上記で確認したId];

 6\. 値が正しく書き換わっていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/997b015c-882e-969a-c3eb-2465f5b3b611.png)

 7\. ClientPostLogoutRedirectUris テーブルを開き、https://**[OldOrchestratorAddress]**/ の値を持つ [PostLogoutRedirectUri] フィールドを探す。
⇒下図だと、Id=3,4,5,8の4件。（Id=5は「http://」なので、手順的には変えなくてもいいのかもしれませんが、今回は変えました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/86868d60-1a06-ff71-49ca-0f8290f3c635.png)

 8\. 下記のクエリを実行し、https://**[NewOrchestratorAddress]**/ に変更する。

	UPDATE [UiPath].[identity].[ClientPostLogoutRedirectUris] SET PostLogoutRedirectUri = 'https://[NewOrchestratorAddress]' WHERE Id = [上記で確認したId];
	UPDATE [UiPath].[identity].[ClientPostLogoutRedirectUris] SET PostLogoutRedirectUri = 'https://[NewOrchestratorAddress]/' WHERE Id = [上記で確認したId];
	UPDATE [UiPath].[identity].[ClientPostLogoutRedirectUris] SET PostLogoutRedirectUri = 'http://[NewOrchestratorAddress]/' WHERE Id = [上記で確認したId];
	UPDATE [UiPath].[identity].[ClientPostLogoutRedirectUris] SET PostLogoutRedirectUri = 'https://[NewOrchestratorAddress]/account/login' WHERE Id = [上記で確認したId];

 9\. 値が正しく書き換わっていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/43db1829-4df6-8b1d-e3a9-d58f3581fdfe.png)

10\. Identity Server の appsettings.Production.json(C:\Program Files (x86)\UiPath\Orchestrator\Identity) ファイル内の OrchestratorUrl パラメーターを、Orchestrator の新しいパブリック アドレスで更新する。


- 変更前
```
    "OrchestratorUrl": "https://[OldOrchestratorAddress]",
```
- 変更後
```
    "OrchestratorUrl": "https://[NewOrchestratorAddress]",
```


 11\. IISを起動する。

## 証明書を差し替える
1. 念のためIISを停止する。

2. Powershellを管理者権限で起動し、SAN値付自己署名SSL証明書を作成する。
⇒下記の[サーバ名]、[NewOrchestratorAddress]、[証明書のインポートに使うパスワード]、[証明書のファイル名]の4箇所を環境に合わせて修正する。

```
$ssc = New-SelfSignedCertificate -FriendlyName "[サーバ名]" -Subject "CN=[NewOrchestratorAddress]" -DnsName "[NewOrchestratorAddress]"
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store( "Root", "LocalMachine")
$store.Open("MaxAllowed")
$store.Add($ssc)
$pass = ConvertTo-SecureString -String "[証明書のインポートに使うパスワード]" -Force -AsPlainText
Export-PfxCertificate -Cert $ssc -FilePath "C:\temp\[証明書のファイル名].pfx" -Password $pass
```

3\. SAN 自己署名証明書をインポートする。
⇒下記の[証明書のインポートに使うパスワード]、[証明書のファイル名]の2箇所を、上で設定したものに合わせる。

```
$pass = ConvertTo-SecureString -String "[証明書のインポートに使うパスワード]" -Force -AsPlainText
$imported = Import-PfxCertificate -FilePath "C:\temp\[証明書のファイル名].pfx" -CertStoreLocation Cert:\LocalMachine\My\ -Exportable -Password $pass
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store( "Root", "LocalMachine")
$store.Open("MaxAllowed")
$store.Add($imported)
```

4\. 「UiPath Orchestrator」のサイトバインドから、3.でインポートした証明書を参照させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/a95ca71c-aa51-793d-baf0-67abb9a10815.png)

5\. 証明書の拇印をコピーする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/eb6dbf5b-97b5-1e45-c7e4-de13ad321925.png)

6\. appsettings.Production.json (C:\Program Files (x86)\UiPath\Orchestrator\Identity) を修正する。
⇒ 5.でコピーした拇印を、"StoreLocation"の"Name"に貼り付ける。

- 変更前

```
  "AppSettings": {
      ......
    "SigningCredentialSettings": {
      "StoreLocation": {
        "Name": "[旧証明書の拇印]",
        "Location": "LocalMachine",
        "NameType": "Thumbprint"
      }
    }
```

- 変更後

```
  "AppSettings": {
      ......
    "SigningCredentialSettings": {
      "StoreLocation": {
        "Name": "[新証明書の拇印]",
        "Location": "LocalMachine",
        "NameType": "Thumbprint"
      }
    }
```

7\. PowerShellコンソールにて certlm.msc を実行し、[ローカルコンピューター] → [個人の証明書ストア]を開く。新しい証明書を右クリックし、秘密キーの管理をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/1c2ea0d2-2c4f-b9f6-e9d8-1c105470fe8b.png)

8\. 証明書のアクセス許可画面にて、追加をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/11577024-82fd-8aa6-57ea-7ff81e1c5cab.png)

9\. オブジェクト名に IIS_IUSRS を指定し、名前の確認をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/32f90e12-e030-c5aa-5def-3b8347b07f6e.png)

10\. アクセス許可画面にて IIS_IUSRS アカウントにフルコントロールが付与されていることを確認し、OKをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/5bcf7492-4883-f1c0-f49f-c30442941c2e.png)

11\. IISを起動する。

# メモ
- 証明書がうまくいってないときのエラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/58fc724e-17bf-e1dd-ce55-5a1c919a539e.png)

- IIS_IUSRSが追加されてない時のエラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/0e666f37-7e53-74f0-2f59-62ec1e7dd844.png)