# 機能設計書 26-Backup-DbaComputerCertificate

## 概要

本ドキュメントは、コンピュータ証明書をディスクにエクスポートするBackup-DbaComputerCertificate機能の設計仕様を記述する。

### 本機能の処理概要

Backup-DbaComputerCertificateは、ローカルまたはリモートコンピュータの証明書ストアからコンピュータ証明書をファイルにエクスポートするPowerShellコマンドレットである。

**業務上の目的・背景**：SQL Serverのネットワーク暗号化（TLS/SSL）に使用されるコンピュータ証明書は、サーバー移行、証明書更新、または災害復旧シナリオに備えてバックアップしておく必要がある。本機能は、Get-DbaComputerCertificateで取得した証明書オブジェクトを受け取り、.cer（公開鍵）または.pfx（秘密鍵含む）形式でファイルにエクスポートする。

**機能の利用シーン**：
- サーバー移行前の証明書バックアップ
- 証明書更新前のバックアップ作成
- 災害復旧計画の一環としての証明書保護
- 複数サーバーへの証明書配布準備

**主要な処理内容**：
1. Get-DbaComputerCertificateからパイプライン入力を受け取り
2. 証明書オブジェクトからX509Certificate2オブジェクトを構築
3. 指定された形式（Cert/Pfx等）でファイルにエクスポート
4. エクスポートされたファイルのFileInfoオブジェクトを返却

**関連システム・外部連携**：.NETのSystem.Security.Cryptography.X509Certificates名前空間を使用。SQL ServerのTLS/SSL設定と連携。

**権限による制御**：証明書ストアへの読み取りアクセス権限が必要。PFXエクスポートには秘密鍵へのアクセス権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 画面機能マッピングに該当なし |

## 機能種別

ファイル出力（証明書エクスポート）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| InputObject | object[] | Yes | エクスポートする証明書オブジェクト（Get-DbaComputerCertificateから） | ValueFromPipeline |
| Path | string | No | 出力先ディレクトリ（デフォルト：カレントディレクトリ） | - |
| FilePath | string | No | 出力ファイルの完全パス | - |
| Type | string | No | 出力形式（デフォルト：Cert） | Authenticode/Cert/Pfx/Pkcs12/Pkcs7/SerializedCert |
| SecurePassword | SecureString | No | PFXエクスポート時のパスワード | - |
| EnableException | switch | No | 例外を有効化 | - |

### 入力データソース

- InputObjectパラメータ：Get-DbaComputerCertificateからのパイプライン入力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| Name | string | エクスポートされたファイル名 |
| FullName | string | エクスポートされたファイルの完全パス |
| DirectoryName | string | 親ディレクトリ |
| Extension | string | ファイル拡張子 |
| Length | long | ファイルサイズ（バイト） |
| CreationTime | DateTime | 作成日時 |
| LastWriteTime | DateTime | 最終更新日時 |

### 出力先

- PowerShellパイプライン（System.IO.FileInfoオブジェクト）
- ディスクファイル（.cer/.pfx等）

## 処理フロー

### 処理シーケンス

```
1. 各証明書に対する処理開始
   └─ InputObjectから証明書を1つずつ処理
2. 出力パス決定
   └─ FilePathが未指定の場合、Path + ComputerName-Thumbprint.cer形式で生成
3. X509Certificate2オブジェクト構築
   └─ RawDataとSecurePasswordからオブジェクトを構築
4. ファイルエクスポート
   └─ Export()メソッドで指定形式にエクスポート
5. 結果出力
   └─ エクスポートされたファイルのFileInfoを返却
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[foreach cert in InputObject]
    B --> C{FilePath指定?}
    C -->|No| D[Path + ComputerName-Thumbprint.cer生成]
    C -->|Yes| E[FilePathを使用]
    D --> F[X509Certificate2オブジェクト構築]
    E --> F
    F --> G[Export実行]
    G --> H[WriteAllBytes実行]
    H --> I[Get-ChildItem FilePath]
    I --> J{次の証明書?}
    J -->|Yes| B
    J -->|No| K[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 自動ファイル名生成 | FilePath未指定時はComputerName-Thumbprint.cer形式 | FilePath未指定時 |
| BR-02 | デフォルトディレクトリ | Path未指定時はカレントディレクトリ使用 | Path未指定時 |
| BR-03 | デフォルト形式 | Type未指定時はCert形式でエクスポート | Type未指定時 |
| BR-04 | パスワード保護 | PFX形式の場合、SecurePasswordで暗号化 | Type=Pfxまたは秘密鍵エクスポート時 |

### 計算ロジック

特になし（ファイル出力操作のため）

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

データベース操作なし（ファイルシステム操作のみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ファイル書き込みエラー | 出力先への書き込み権限がない | 適切な権限で再実行 |
| - | 証明書エクスポートエラー | 秘密鍵へのアクセス権限がない | 管理者権限で再実行 |

### リトライ仕様

リトライ機能は実装されていない。

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

ファイルシステム操作のためトランザクション管理なし。

## パフォーマンス要件

特に定義なし。操作自体は軽量で、通常は数秒以内に完了する。

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

- 秘密鍵を含むPFXエクスポートには適切なパスワード保護が必要
- エクスポートされたファイルは安全な場所に保存すること
- 証明書ストアへのアクセス権限に注意

## 備考

- Get-DbaComputerCertificateと組み合わせて使用
- Thumbprintで証明書を一意に識別
- PFX形式でエクスポートすると秘密鍵も含まれる

---

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

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

### 推奨読解順序

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

.NETのX509Certificate2クラスが中心的なデータ構造である。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Backup-DbaComputerCertificate.ps1 | `public/Backup-DbaComputerCertificate.ps1` | パラメータ定義と型（72-82行目）を確認 |

**読解のコツ**: ValidateSetでTypeの許可値を確認。Cert（公開鍵のみ）とPfx（秘密鍵含む）の違いを理解する。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Backup-DbaComputerCertificate.ps1 | `public/Backup-DbaComputerCertificate.ps1` | process ブロック（83-91行目）がメイン処理 |

**主要処理フロー**:
1. **84行目**: foreach処理開始
2. **85-87行目**: FilePathの自動生成ロジック
3. **88行目**: X509Certificate2オブジェクト構築
4. **89行目**: Export()とWriteAllBytes()でファイル出力
5. **90行目**: Get-ChildItemでFileInfo取得

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

```
Backup-DbaComputerCertificate
    │
    ├─ Test-Bound (パラメータ検証)
    │
    ├─ New-Object X509Certificate2 (証明書オブジェクト構築)
    │
    ├─ X509Certificate2.Export() (証明書エクスポート)
    │
    ├─ [IO.File]::WriteAllBytes() (ファイル書き込み)
    │
    └─ Get-ChildItem (FileInfo取得)
```

### データフロー図

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

InputObject ──────────▶ X509Certificate2構築 ──────────▶ .cer/.pfxファイル
  (証明書オブジェクト)            │                              │
                                  │                              │
SecurePassword ───────────────────┤                              │
                                  │                              │
Path/FilePath ────────────────────┘                              ▼
                                                            FileInfo
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Backup-DbaComputerCertificate.ps1 | `public/Backup-DbaComputerCertificate.ps1` | ソース | メイン機能実装 |
| Get-DbaComputerCertificate.ps1 | `public/Get-DbaComputerCertificate.ps1` | ソース | 証明書取得（入力元） |
| Add-DbaComputerCertificate.ps1 | `public/Add-DbaComputerCertificate.ps1` | ソース | 証明書追加 |
