# 機能設計書 610-Remove-DbaComputerCertificate

## 概要

本ドキュメントは、ローカルまたはリモートコンピュータのWindows証明書ストアから証明書を削除する`Remove-DbaComputerCertificate`機能の設計書である。

### 本機能の処理概要

`Remove-DbaComputerCertificate`は、PowerShellリモーティングを使用してローカルまたはリモートコンピュータのWindows証明書ストアから証明書を削除する機能である。SQL Serverインスタンスが暗号化接続や認証に使用するSSL/TLS証明書の管理に不可欠である。

**業務上の目的・背景**：DBAは一般的に、期限切れの証明書のクリーンアップ、セキュリティインシデント時の侵害された証明書の削除、SQL Serverの移行やデコミッション時の証明書ライフサイクル管理にこの機能を使用する。本機能は、サムプリントによる特定の証明書をターゲットにし、複数の証明書ストアとフォルダにまたがって操作できる。

**機能の利用シーン**：
- 期限切れSSL証明書のクリーンアップ
- セキュリティインシデント対応（侵害された証明書の即時削除）
- SQL Server移行・デコミッション時の証明書管理
- 証明書更新後の古い証明書の削除

**主要な処理内容**：
1. サムプリントによる削除対象証明書の特定
2. PowerShellリモーティング（Invoke-Command2）によるリモートスクリプト実行
3. 証明書ストアを読み書きモードで開く
4. 対象証明書の削除
5. 削除結果の返却

**関連システム・外部連携**：Windows証明書ストア、PowerShellリモーティング（WinRM）

**権限による制御**：証明書ストアへの書き込み権限が必要。LocalMachineストアの場合は管理者権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | なし | - | CLIベースの機能のため関連画面なし |

## 機能種別

オブジェクト削除（DELETE相当） / 証明書管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| ComputerName | DbaInstanceParameter[] | No | 証明書を削除するターゲットコンピュータ（デフォルト: localhost） | なし |
| Credential | PSCredential | No | リモートコンピュータ接続用の代替資格情報 | なし |
| Thumbprint | String[] | Yes | 削除する証明書のサムプリント（SHA-1ハッシュ） | Mandatory, ValueFromPipelineByPropertyName |
| Store | String | No | 証明書ストアの場所（デフォルト: "LocalMachine"） | なし |
| Folder | String | No | 証明書ストアのフォルダ（デフォルト: "My"） | なし |
| EnableException | Switch | No | 例外処理の有効化フラグ | なし |

### 入力データソース

- Get-DbaComputerCertificateからのパイプライン入力（Thumbprintプロパティ）
- コマンドラインでの直接指定

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | String | 証明書削除が試行されたコンピュータ名 |
| Store | String | 証明書ストアの場所（LocalMachineまたはCurrentUser） |
| Folder | String | 証明書ストアのフォルダ/サブフォルダ（My, Root, TrustedPeople等） |
| Thumbprint | String | 削除対象の証明書のSHA-1ハッシュサムプリント |
| Status | String | 削除操作のステータス（"Removed"または"Certificate not found in Cert:\$Store\$Folder"） |

### 出力先

PowerShellパイプライン（PSCustomObject）

## 処理フロー

### 処理シーケンス

```
1. 前処理（beginブロック）
   └─ リモート実行用スクリプトブロックの定義
       ├─ Get-CoreCertStore関数（証明書ストアを開く）
       ├─ Get-CoreCertificate関数（証明書を取得）
       └─ 削除ロジック
2. 各ComputerNameとThumbprintの組み合わせに対して処理（processブロック）
   ├─ ShouldProcess確認
   ├─ Invoke-Command2でリモートスクリプト実行
   │   ├─ サムプリントで証明書を検索
   │   ├─ 証明書が見つかった場合は削除
   │   └─ ステータスを返却
   └─ 結果を出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[スクリプトブロック定義]
    B --> C[ComputerNameループ開始]
    C --> D[Thumbprintループ開始]
    D --> E{ShouldProcess確認}
    E -->|No| F[スキップ]
    E -->|Yes| G[Invoke-Command2実行]
    G --> H[リモートスクリプト実行]
    H --> I[Get-CoreCertificate]
    I --> J{証明書存在?}
    J -->|Yes| K[Get-CoreCertStore ReadWrite]
    K --> L[certstore.Remove実行]
    L --> M[Status = "Removed"]
    J -->|No| N[Status = "Certificate not found"]
    M --> O[PSCustomObject作成]
    N --> O
    O --> P[結果出力]
    P --> Q{次のThumbprint?}
    F --> Q
    Q -->|Yes| D
    Q -->|No| R{次のComputerName?}
    R -->|Yes| C
    R -->|No| S[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-610-01 | デフォルトコンピュータ | ComputerName未指定時はlocalhostを使用 | ComputerName未指定時 |
| BR-610-02 | デフォルトストア | Store未指定時はLocalMachineを使用 | Store未指定時 |
| BR-610-03 | デフォルトフォルダ | Folder未指定時はMyを使用 | Folder未指定時 |
| BR-610-04 | 必須パラメータ | Thumbprintは必須 | 常時 |
| BR-610-05 | ConfirmImpact High | 確認プロンプトがデフォルトで表示される | 常時 |
| BR-610-06 | 証明書未検出時の動作 | 証明書が見つからない場合はエラーではなくステータスで報告 | 証明書未検出時 |
| BR-610-07 | パイプライン入力 | ThumbprintはValueFromPipelineByPropertyNameで取得可能 | パイプライン使用時 |

### 計算ロジック

特になし

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | SQLデータベースへのアクセスなし |

### テーブル別操作詳細

本機能はSQLデータベースにアクセスせず、Windows証明書ストアのみを操作する。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 証明書未検出 | 指定されたサムプリントの証明書が見つからない | ステータスで "Certificate not found" を返却（エラーではない） |
| - | リモート接続失敗 | WinRM接続ができない | 接続情報を確認、WinRM構成を確認 |
| - | 権限エラー | 証明書ストアへの書き込み権限がない | 適切な権限（管理者権限）で実行 |

### リトライ仕様

特になし

## トランザクション仕様

証明書削除はアトミック操作

## パフォーマンス要件

特に規定なし（リモート接続のレイテンシに依存）

## セキュリティ考慮事項

- LocalMachineストアへのアクセスには管理者権限が必要
- リモートマシンへの接続にはWinRM権限が必要
- 削除操作は元に戻せないため、ConfirmImpact = "High" が設定されている
- 削除前にGet-DbaComputerCertificateで対象証明書を確認することを推奨
- SQL Serverが使用中の証明書を削除するとサービスに影響する可能性がある

## 備考

- Get-DbaComputerCertificateからパイプラインで証明書を削除可能
- 複数のサムプリントを一度に指定可能
- 証明書が見つからない場合でもエラーにならず、ステータスで報告される

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Remove-DbaComputerCertificate.ps1 | `public/Remove-DbaComputerCertificate.ps1` | 39-48行目のコメントで出力オブジェクト（PSCustomObject）の構造を確認 |
| 1-2 | Remove-DbaComputerCertificate.ps1 | `public/Remove-DbaComputerCertificate.ps1` | 75-84行目のparamブロックで入力パラメータ定義を確認 |

**読解のコツ**: 本機能はリモート実行用のスクリプトブロックが複雑なため、まずbeginブロック内のスクリプトブロック定義を理解することが重要。

#### Step 2: beginブロックのスクリプトブロックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaComputerCertificate.ps1 | `public/Remove-DbaComputerCertificate.ps1` | 87-169行目でリモート実行スクリプトブロックを確認 |

**主要処理フロー**:
- **88-93行目**: スクリプトブロックのパラメータ定義（Thumbprint, Store, Folder）
- **96-114行目**: Get-CoreCertStore関数（証明書ストアを開く）
- **116-139行目**: Get-CoreCertificate関数（証明書を取得）
- **141-150行目**: サムプリントで証明書を検索（try-catch付き）
- **153-158行目**: 証明書が見つかった場合の削除処理
- **161-167行目**: PSCustomObjectで結果を返却

#### Step 3: processブロックの処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Remove-DbaComputerCertificate.ps1 | `public/Remove-DbaComputerCertificate.ps1` | 172-184行目で実際の呼び出し処理を確認 |

**主要処理フロー**:
- **173行目**: foreachでComputerNameをループ
- **174行目**: foreachでThumbprintをループ
- **175行目**: ShouldProcess確認
- **177行目**: Invoke-Command2でスクリプトブロックを実行

### プログラム呼び出し階層図

```
Remove-DbaComputerCertificate
    │
    ├─ [begin]
    │   └─ スクリプトブロック定義
    │        ├─ Get-CoreCertStore (内部関数)
    │        │      └─ X509Store.Open()
    │        │
    │        ├─ Get-CoreCertificate (内部関数)
    │        │      └─ Thumbprintで証明書検索
    │        │
    │        └─ 削除ロジック
    │               └─ certstore.Remove()
    │
    └─ [process]
        │
        ├─ ShouldProcess確認
        │      └─ "Connecting to $computer to remove cert from Cert:\$Store\$Folder"
        │
        └─ Invoke-Command2
               └─ リモートでスクリプトブロック実行
                      └─ PSCustomObject結果返却
```

### データフロー図

```
[入力]                      [処理]                              [出力]

ComputerName ───────┐
                    │
Thumbprint ─────────┤
                    ├─▶ Invoke-Command2
Store ──────────────┤        │
                    │        ▼
Folder ─────────────┘   リモートスクリプト実行
                              │
                              ├─ Get-CoreCertificate
                              │      │
                              │      ▼
                              │  証明書検索
                              │      │
                              │      ▼
                              │  ┌─────────────────┐
                              │  │  証明書存在?    │
                              │  └────────┬────────┘
                              │           │
                              │    ┌──────┴──────┐
                              │    ▼              ▼
                              │  存在            未検出
                              │    │              │
                              │    ▼              ▼
                              │  Remove()    Status設定
                              │    │              │
                              │    ▼              │
                              │  Status=         Status=
                              │  "Removed"   "not found"
                              │    │              │
                              │    └──────┬───────┘
                              │           │
                              │           ▼
                              └───▶ PSCustomObject
                                         │
                                         ▼
                                    出力 (ComputerName,
                                          Store, Folder,
                                          Thumbprint, Status)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaComputerCertificate.ps1 | `public/Remove-DbaComputerCertificate.ps1` | ソース | メイン機能実装 |
| Invoke-Command2.ps1 | `private/functions/Invoke-Command2.ps1` | ソース | PowerShellリモーティングラッパー |
| Get-DbaComputerCertificate.ps1 | `public/Get-DbaComputerCertificate.ps1` | ソース | 証明書取得（パイプライン入力元） |
| Stop-Function.ps1 | `private/functions/Stop-Function.ps1` | ソース | エラー処理ユーティリティ |
