次の方法で共有


PlayReady テスト環境用のサーバーのセキュリティで保護された削除

概要

PlayReady Secure Delete Server は、PlayReady 実装でセキュリティで保護された削除機能を検証するためのテスト エンドポイントを提供します。 Secure Delete を使用すると、保護されたコンテンツと関連するライセンスを、必要に応じてクライアント デバイスから安全に削除でき、コンテンツ保護とコンプライアンスの要件を維持できます。

サービス エンドポイント

Secure Delete テスト サーバーは、次の環境で使用できます。

https://playready.directtaps.net/pr/svc/securedelete.asmx

セキュリティで保護された削除プロトコル

プロトコルの概要

Secure Delete を使用すると、コンテンツ プロバイダーは、コンテンツとライセンスの安全な削除をリモートでトリガーできます。

  1. コンテンツ プロバイダーが削除が必要と判断する
  2. サーバーがセキュリティで保護された削除コマンドを生成する
  3. コマンドがクライアント デバイスに配信される
  4. クライアントがセキュリティで保護された削除を検証して実行する
  5. クライアントが削除の完了をサーバーに報告する

メッセージ フロー

Content Provider       Secure Delete Server        Client Device
       |                        |                        |
       |-- Delete Request ----->|                        |
       |<-- Delete Command -----|                        |
       |                        |-- Push Command ------>|
       |                        |<-- Execution Report ---|
       |<-- Completion Report --|                        |

サーバー構成

セキュリティで保護された削除ポリシー

ライセンスでセキュリティで保護された削除要件を構成します。

{
  "licenseType": "persistent",
  "keyId": "key-id-guid",
  "secureDelete": {
    "enabled": true,
    "serverUrl": "https://playready.directtaps.net/pr/svc/securedelete.asmx",
    "triggerMechanism": "remote|policy|expiration",
    "deletionScope": "license|content|both",
    "customData": {
      "contentId": "content-identifier",
      "policyId": "deletion-policy-id"
    }
  }
}

削除ポリシー

さまざまな削除シナリオを定義します。

{
  "deletionPolicies": [
    {
      "policyId": "immediate-delete",
      "trigger": "remote-command",
      "scope": "both",
      "verification": "required"
    },
    {
      "policyId": "expiration-delete",
      "trigger": "license-expiration",
      "scope": "license",
      "gracePeriod": "PT24H"
    },
    {
      "policyId": "compliance-delete",
      "trigger": "compliance-violation",
      "scope": "content",
      "enforcement": "immediate"
    }
  ]
}

API エンドポイント

セキュリティで保護された削除を要求する

エンドポイント:POST /pr/svc/securedelete.asmx/RequestDelete

要求の形式:

POST /pr/svc/securedelete.asmx/RequestDelete HTTP/1.1
Host: playready.directtaps.net
Content-Type: application/json

{
  "contentId": "content-identifier",
  "deviceId": "target-device-id",
  "deletionScope": "license|content|both",
  "reason": "expiration|violation|request",
  "immediateExecution": true
}

応答形式:

{
  "deleteCommandId": "command-identifier",
  "status": "queued|sent|acknowledged|completed",
  "timestamp": "2024-01-15T10:30:00Z",
  "estimatedCompletion": "2024-01-15T10:35:00Z"
}

クエリの削除の状態

エンドポイント:GET /pr/svc/securedelete.asmx/QueryStatus

要求の形式:

GET /pr/svc/securedelete.asmx/QueryStatus?commandId=COMMAND_ID HTTP/1.1
Host: playready.directtaps.net

応答形式:

{
  "commandId": "command-identifier",
  "status": "pending|in-progress|completed|failed",
  "progress": {
    "itemsToDelete": 5,
    "itemsDeleted": 3,
    "percentComplete": 60
  },
  "completionTime": "2024-01-15T10:35:00Z",
  "errorDetails": null
}

レポートの削除の完了

エンドポイント:POST /pr/svc/securedelete.asmx/ReportCompletion

要求の形式:

POST /pr/svc/securedelete.asmx/ReportCompletion HTTP/1.1
Host: playready.directtaps.net
Content-Type: application/octet-stream

[Secure Delete Completion Report - Binary Format]

テスト シナリオ

基本的なセキュリティで保護された削除テスト

標準の安全な削除フローをテストします。

async function testBasicSecureDelete() {
    // 1. Request secure delete for content
    const deleteRequest = {
        contentId: 'test-content-123',
        deviceId: 'test-device-456',
        deletionScope: 'both',
        reason: 'expiration',
        immediateExecution: true
    };
    
    const response = await requestSecureDelete(deleteRequest);
    
    // 2. Monitor deletion progress
    let status;
    do {
        await new Promise(resolve => setTimeout(resolve, 1000)); // Wait 1 second
        status = await queryDeleteStatus(response.deleteCommandId);
    } while (status.status === 'pending' || status.status === 'in-progress');
    
    return status.status === 'completed';
}

ポリシー ベースの削除テスト

さまざまな削除ポリシーをテストします。

async function testPolicyBasedDeletion() {
    const policies = [
        {
            name: 'Immediate Delete',
            config: { trigger: 'remote-command', scope: 'both' }
        },
        {
            name: 'Expiration Delete',
            config: { trigger: 'license-expiration', scope: 'license' }
        },
        {
            name: 'Selective Delete',
            config: { trigger: 'compliance-violation', scope: 'content' }
        }
    ];
    
    const results = [];
    for (const policy of policies) {
        try {
            const result = await testDeletionPolicy(policy.config);
            results.push({ policy: policy.name, result: 'PASS' });
        } catch (error) {
            results.push({ policy: policy.name, result: 'FAIL', error: error.message });
        }
    }
    
    return results;
}

バッチ削除テスト

複数のコンテンツの削除をテストする:

async function testBatchDeletion() {
    const contentItems = [
        'content-001',
        'content-002', 
        'content-003',
        'content-004',
        'content-005'
    ];
    
    // Request batch deletion
    const batchRequest = {
        contentIds: contentItems,
        deviceId: 'test-device-789',
        deletionScope: 'both',
        reason: 'batch-cleanup'
    };
    
    const response = await requestBatchDelete(batchRequest);
    
    // Monitor batch progress
    const finalStatus = await monitorBatchProgress(response.batchCommandId);
    
    return {
        totalItems: contentItems.length,
        successfulDeletions: finalStatus.progress.itemsDeleted,
        failedDeletions: finalStatus.progress.itemsToDelete - finalStatus.progress.itemsDeleted,
        completionTime: finalStatus.completionTime
    };
}

クライアント統合

JavaScript の実装

class SecureDeleteClient {
    constructor(serverUrl) {
        this.serverUrl = serverUrl;
    }
    
    async requestDelete(deleteRequest) {
        const response = await fetch(`${this.serverUrl}/RequestDelete`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(deleteRequest)
        });
        
        if (!response.ok) {
            throw new Error(`Delete request failed: ${response.status}`);
        }
        
        return await response.json();
    }
    
    async queryStatus(commandId) {
        const response = await fetch(`${this.serverUrl}/QueryStatus?commandId=${commandId}`);
        
        if (!response.ok) {
            throw new Error(`Status query failed: ${response.status}`);
        }
        
        return await response.json();
    }
    
    async reportCompletion(completionData) {
        const response = await fetch(`${this.serverUrl}/ReportCompletion`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/octet-stream'
            },
            body: completionData
        });
        
        return response.ok;
    }
}

// Usage
const secureDeleteClient = new SecureDeleteClient('https://playready.directtaps.net/pr/svc/securedelete.asmx');

C# の実装

public class SecureDeleteClient
{
    private readonly HttpClient httpClient;
    private readonly string serverUrl;
    
    public SecureDeleteClient(string serverUrl)
    {
        this.serverUrl = serverUrl;
        this.httpClient = new HttpClient();
    }
    
    public async Task<DeleteResponse> RequestDeleteAsync(DeleteRequest request)
    {
        var json = JsonConvert.SerializeObject(request);
        var content = new StringContent(json, Encoding.UTF8, "application/json");
        
        var response = await httpClient.PostAsync($"{serverUrl}/RequestDelete", content);
        response.EnsureSuccessStatusCode();
        
        var responseJson = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<DeleteResponse>(responseJson);
    }
    
    public async Task<DeleteStatus> QueryStatusAsync(string commandId)
    {
        var response = await httpClient.GetAsync($"{serverUrl}/QueryStatus?commandId={commandId}");
        response.EnsureSuccessStatusCode();
        
        var json = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<DeleteStatus>(json);
    }
    
    public async Task<bool> ReportCompletionAsync(byte[] completionData)
    {
        var content = new ByteArrayContent(completionData);
        content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        
        var response = await httpClient.PostAsync($"{serverUrl}/ReportCompletion", content);
        return response.IsSuccessStatusCode;
    }
}

削除スコープ

License-Only 削除

ライセンスのみを削除し、コンテンツを保持します。

{
  "deletionScope": "license",
  "preserveContent": true,
  "licenseCleanup": {
    "removeFromStore": true,
    "clearCacheReferences": true,
    "revokeBindings": true
  }
}

コンテンツのみの削除

ライセンスを保持したままコンテンツ ファイルを削除する:

{
  "deletionScope": "content",
  "preserveLicense": true,
  "contentCleanup": {
    "removeFiles": true,
    "clearTemporaryFiles": true,
    "cleanupMetadata": true
  }
}

完全な削除

ライセンスとコンテンツの両方を削除します。

{
  "deletionScope": "both",
  "thoroughCleanup": true,
  "verification": {
    "confirmLicenseRemoval": true,
    "confirmContentRemoval": true,
    "verifyNoResidualData": true
  }
}

セキュリティに関する考慮事項

コマンド認証

セキュリティで保護された削除コマンドを認証する必要があります。

{
  "commandAuthentication": {
    "signature": "cryptographic-signature",
    "certificateChain": ["cert1", "cert2"],
    "timestamp": "2024-01-15T10:30:00Z",
    "nonce": "random-value"
  }
}

検証の要件

セキュリティで保護された削除が正しく実行されていることを確認します。

{
  "verificationRequirements": {
    "cryptographicProof": true,
    "overwriteVerification": true,
    "witnessReporting": true,
    "tamperDetection": true
  }
}

高度な機能

条件付き削除

条件付き削除トリガーを構成します。

{
  "conditionalDeletion": {
    "conditions": [
      {
        "type": "time-based",
        "trigger": "2024-12-31T23:59:59Z"
      },
      {
        "type": "usage-based",
        "trigger": "max-plays-exceeded"
      },
      {
        "type": "location-based",
        "trigger": "geographic-restriction"
      }
    ],
    "logicalOperator": "OR"
  }
}

ロールバック機能

削除ロールバックのサポート (可能な場合):

{
  "rollbackSupport": {
    "enabled": true,
    "retentionPeriod": "PT72H",
    "backupLocation": "secure-backup-store",
    "rollbackConditions": ["deletion-error", "false-positive"]
  }
}

監視と報告

削除分析

安全な削除操作を追跡する:

async function getDeletionAnalytics(period) {
    const response = await fetch(`${serverUrl}/Analytics?period=${period}`);
    return await response.json();
}

// Example response
{
  "period": "24h",
  "totalDeletions": 150,
  "successfulDeletions": 145,
  "failedDeletions": 5,
  "averageExecutionTime": "2.3s",
  "deletionReasons": {
    "expiration": 89,
    "violation": 12,
    "request": 49
  }
}

コンプライアンス レポート

監査用のコンプライアンス レポートを生成します。

async function generateComplianceReport(startDate, endDate) {
    const params = new URLSearchParams({
        startDate: startDate.toISOString(),
        endDate: endDate.toISOString(),
        format: 'detailed'
    });
    
    const response = await fetch(`${serverUrl}/ComplianceReport?${params}`);
    return await response.blob(); // Returns PDF report
}

ベスト プラクティス

実装ガイドライン

  1. 検証: 削除の完了を常に確認する
  2. ログ記録: 詳細な削除ログを保持する
  3. セキュリティ: 削除コマンドに強力な認証を使用する
  4. 回復: 適切なバックアップ戦略を実装する
  5. テスト: 削除シナリオを徹底的にテストする

パフォーマンスの最適化

  1. バッチ操作: グループ関連の削除
  2. 非同期処理: 大規模な操作に非同期削除を使用する
  3. リソース管理: 削除中にシステム リソースを監視する
  4. スケジュール設定: 使用率の低い期間中に削除をスケジュールする

エラー処理

一般的なエラー シナリオ

  • 認証エラー: 無効または期限切れの資格情報
  • コンテンツが見つかりません: 指定されたコンテンツが存在しません
  • 削除の競合: 現在使用中のコンテンツ
  • システム エラー: ストレージまたはネットワークの問題
  • ポリシー違反: 削除はポリシーで許可されていません

エラーの回復

async function handleDeletionError(commandId, error) {
    switch (error.type) {
        case 'AUTHENTICATION_FAILED':
            // Refresh credentials and retry
            await refreshAuthToken();
            return await retryDeletion(commandId);
            
        case 'CONTENT_IN_USE':
            // Wait and retry
            await waitForContentRelease();
            return await retryDeletion(commandId);
            
        case 'SYSTEM_ERROR':
            // Log error and schedule retry
            await logSystemError(error);
            return await scheduleDeletionRetry(commandId);
            
        default:
            throw new Error(`Unhandled deletion error: ${error.message}`);
    }
}

サポートとトラブルシューティング

セキュリティで保護された削除機能に関する問題の場合:

  1. ライセンスでセキュリティで保護された削除が有効になっていることを確認する
  2. 削除スコープとポリシー構成を確認する
  3. コマンド認証を検証する
  4. 削除の進行状況と状態を監視する
  5. エラー ログで特定の問題を確認する

一般的なトラブルシューティング手順:

  • 簡単な削除シナリオでテストする
  • サーバーへのネットワーク接続を確認する
  • コンテンツの削除についてデバイスのアクセス許可を確認する
  • 暗号化署名を検証する
  • ポリシーの競合を確認する

追加のサポートについては、 PlayReady テスト サーバー のメイン ドキュメントを参照してください。