概要
PlayReady テスト サーバーには、クライアントによって生成されたライセンス要求チャレンジからライセンス サーバーで使用できる情報を反映する特別な clientinfo 機能が含まれています。 この機能を使用すると、開発者はライセンス サーバーに送信されるクライアント情報を簡単に確認し、クライアント機能に基づいて適切なライセンス生成ロジックを構築できます。
クライアント情報機能
clientinfo パラメーターを使用して、ライセンス要求で送信されたクライアント情報を検査します。
テスト サーバーの URL:
http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(msg:clientinfo)
SOAP アクション:
http://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense
要求構造のサンプル
クライアント情報機能は、標準の PlayReady ライセンス取得要求を処理し、ライセンスではなくクライアントに関する詳細情報を返します。 一般的な要求の構造を次に示します。
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<AcquireLicense xmlns="http://schemas.microsoft.com/DRM/2007/03/protocols">
<challenge>
<Challenge xmlns="http://schemas.microsoft.com/DRM/2007/03/protocols/messages">
<LA xmlns="http://schemas.microsoft.com/DRM/2007/03/protocols"
Id="SignedData" xml:space="preserve">
<Version>1</Version>
<ContentHeader>
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader"
version="4.0.0.0">
<DATA>
<PROTECTINFO>
<KEYLEN>16</KEYLEN>
<ALGID>AESCTR</ALGID>
</PROTECTINFO>
<KID>JpbjtvscoUq8vU7xq6eEOg==</KID>
<LA_URL>http://test.playready.microsoft.com/service/rightsmanager.asmx</LA_URL>
<LUI_URL>http://test.playready.microsoft.com/service/getrights.html</LUI_URL>
</DATA>
</WRMHEADER>
</ContentHeader>
<CLIENTINFO>
<CLIENTVERSION>10.0.16384.10011</CLIENTVERSION>
</CLIENTINFO>
<RevocationLists>
<RevListInfo>
<ListID>ioydTlK2p0WXkWklprR5Hw==</ListID>
<Version>11</Version>
</RevListInfo>
<!-- Additional revocation lists... -->
</RevocationLists>
<LicenseNonce>YCBas7tAUmkjOcabdD4DuQ==</LicenseNonce>
<ClientTime>1488568844</ClientTime>
<EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#"
Type="http://www.w3.org/2001/04/xmlenc#Element">
<!-- Encrypted client data... -->
</EncryptedData>
</LA>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<!-- Digital signature... -->
</Signature>
</Challenge>
</challenge>
</AcquireLicense>
</soap:Body>
</soap:Envelope>
応答の例: Windows 10 Edge ブラウザー
Windows 10 で Microsoft Edge によって発行されたチャレンジの場合:
Client Info:
Client Version: 10.0.16384.10011
Client Time: 10/01/2017 2:00:00 PM
Supported Features:
Receiver
AntiRollbackClock
RevocationLists
PlayReady3Features
Device Certificate Info (Cert 0):
Platform: WindowsOnX86
Type: Device
SecurityLevel: 2000
RobustnessVersion: 100925543
DigestValue: 04+2aK5sjv+m5/EUY9BIMFqe0ResBkL9wfuFepWDU9E=
IssuerKey: h/k8EU71zsgAqa0niR1TnpKDC6dyOEgUGjybc3+s/EnUJWpkMtOwygoyCPp1nuRCFDvfoaaI78kb2fqGBI0tWg==
Binding Key Type: 3
Certificate Chain:
↳ Cert 1:
ManufacturerName: Microsoft
ModelName: Windows
ModelNumber: 6.4.0.103
DigestValue: LLp1fynIs9tgDxDDU+8jFveBoQp+0x8fXnqyV9tk1Zc=
Platform: WindowsOnX86
↳ Cert 2:
ManufacturerName: Microsoft
ModelName: PlayReady SL2000 Device Port- Windows Lib Codebase Version CA
ModelNumber: 1.0.0.4
DigestValue: Y3C0kjOxz3h/njYBKeApsvfPscwLcV1qAiTfAXXSLw4=
↳ Cert 3:
ManufacturerName: Microsoft
ModelName: PlayReady SL2000 Device Port - Windows Platform CA for x86/amd64
ModelNumber: 1.0.0.3
DigestValue: L62pDo9+gkd6LoLDbQwgxwtYldcuhSEog7GcJwtJ3CE=
↳ Cert 4:
ManufacturerName: Microsoft
ModelName: PlayReady SL2000 Device Port + Link CA
ModelNumber: 1.0.0.1
DigestValue: 7Q8z1rSr8I3AGkcf0BNoDgwS46nO0wD5m0WvYfFoTWQ=
応答の例: PlayReady 3.2 SL3000 クライアント
PlayReady 3.2 ベースの SL3000 クライアントによって発行されたチャレンジの場合:
Client Info:
Client Version: 3.2.0.4242
Client Time: 10/01/2017 2:00:00 PM
Supported Features:
SecureClock
RevocationLists
Receiver
Transmitter
PlayReady3Features
Device Certificate Info (Cert 0):
Platform: OEM
Type: Device
SecurityLevel: 3000
RobustnessVersion: 0
ManufacturerName: Contoso
ModelName: Cool Device Name
ModelNumber: Cool Device Name
DigestValue: IOSxDmGiRlX+dUf62sohHj/IB0qRKSkV7wz7sbZ3HSo=
IssuerKey: UlT6XXcgAMzaVAJN9JLJVomCFwppjoqgMMcT748yX27D053iiEP69pjEBnTxWiSEVXj76/e2wDImTgQDtbLTVg==
Binding Key Type: 3
Certificate Chain:
↳ Cert 1:
ManufacturerName: Contoso
ModelName: Cool Device Name
ModelNumber: ABC-XYZ-123
DigestValue: rmnxSlpuh9WTlXa6ACLcSJDnPVtoS5/2P1wa/kEgs1M=
↳ Cert 2:
ManufacturerName: Contoso
DigestValue: 5H3YVzR9EhHVnsseOJmO/ZCrX10Z8bOx9PDhKOhrxe4=
↳ Cert 3:
ManufacturerName: Microsoft
ModelName: PlayReady SL3000 Device Port + Link CA
ModelNumber: 1.0.0.1
DigestValue: bk7YOJRioSgnzjpZgLasowaL96LFIBHDx6B0z+JoDPE=
クライアント情報要素
基本的なクライアント情報
| フィールド | 説明 | 値の例 |
|---|---|---|
| クライアント バージョン | PlayReady クライアントのバージョン |
10.0.16384.10011、3.2.0.4242 |
| クライアント時間 | クライアント システム時刻 | 10/01/2017 2:00:00 PM |
| プラットフォーム | クライアント プラットフォーム識別子 |
WindowsOnX86、OEM |
サポートされている機能
| 特徴 | 説明 |
|---|---|
| レシーバー | クライアントはコンテンツの受信と暗号化解除を行うことができます |
| トランスミッター | クライアントは他のデバイスにコンテンツを送信できます |
| AntiRollbackClock | クライアントはロールバック防止クロック機能をサポートしています |
| RevocationLists | クライアントは失効リストの処理をサポートしています |
| PlayReady3Features | クライアントは PlayReady 3.0 以降の機能をサポートしています |
| SecureClock | クライアントは、セキュリティで保護されたクロック機能をサポートしています |
セキュリティ レベル情報
| セキュリティ レベル | 説明 | 使用例 |
|---|---|---|
| SL150 | ソフトウェア ベースの保護 | 基本的なコンテンツ保護 |
| SL2000 | ハードウェア ベースの保護 | Standard Premium コンテンツ |
| SL3000 | ハードウェア セキュリティ モジュール | Ultra-Premium コンテンツ |
証明書チェーン情報
チェーン内の各証明書には、次のものが用意されています。
- ManufacturerName - デバイスの製造元
- ModelName - デバイス モデル識別子
- ModelNumber - 特定のモデル バージョン
- DigestValue - 証明書のフィンガープリント
- プラットフォーム - ハードウェア プラットフォームの種類
テスト シナリオ
クライアント機能の検出
async function detectClientCapabilities() {
const clientInfoUrl = 'http://test.playready.microsoft.com/service/rightsmanager.asmx?cfg=(msg:clientinfo)';
try {
const response = await sendLicenseRequest(clientInfoUrl);
const clientInfo = parseClientInfoResponse(response);
return {
version: clientInfo.clientVersion,
securityLevel: clientInfo.deviceCert.securityLevel,
features: clientInfo.supportedFeatures,
platform: clientInfo.deviceCert.platform,
manufacturer: clientInfo.certificateChain[0].manufacturerName
};
} catch (error) {
console.error('Failed to detect client capabilities:', error);
return null;
}
}
セキュリティ レベルの検証
async function validateSecurityLevel(requiredLevel) {
const clientInfo = await detectClientCapabilities();
if (!clientInfo) {
return { valid: false, reason: 'Could not detect client capabilities' };
}
const clientLevel = parseInt(clientInfo.securityLevel);
const required = parseInt(requiredLevel);
return {
valid: clientLevel >= required,
clientLevel: clientLevel,
requiredLevel: required,
reason: clientLevel >= required ? 'Security level sufficient' : 'Security level insufficient'
};
}
機能互換性テスト
async function testFeatureCompatibility(requiredFeatures) {
const clientInfo = await detectClientCapabilities();
if (!clientInfo) {
return { compatible: false, reason: 'Could not detect client features' };
}
const missingFeatures = requiredFeatures.filter(
feature => !clientInfo.features.includes(feature)
);
return {
compatible: missingFeatures.length === 0,
supportedFeatures: clientInfo.features,
missingFeatures: missingFeatures,
requiredFeatures: requiredFeatures
};
}
ライセンス サーバーの実装
ライセンス決定のためのクライアント情報の使用
public class ClientInfoBasedLicenseHandler
{
public LicenseResponse GenerateLicense(LicenseRequest request)
{
var clientInfo = ExtractClientInfo(request.Challenge);
// Determine security level
var securityLevel = GetSecurityLevel(clientInfo);
// Check feature support
var supportedFeatures = GetSupportedFeatures(clientInfo);
// Build license based on client capabilities
var license = new LicenseBuilder()
.WithSecurityLevel(securityLevel)
.WithFeatures(supportedFeatures)
.WithOutputProtections(GetOutputProtections(securityLevel))
.Build();
return new LicenseResponse(license);
}
private SecurityLevel GetSecurityLevel(ClientInfo clientInfo)
{
switch (clientInfo.DeviceCertificate.SecurityLevel)
{
case 3000:
return SecurityLevel.SL3000;
case 2000:
return SecurityLevel.SL2000;
default:
return SecurityLevel.SL150;
}
}
private List<string> GetSupportedFeatures(ClientInfo clientInfo)
{
var features = new List<string>();
if (clientInfo.SupportedFeatures.Contains("PlayReady3Features"))
{
features.Add("AdvancedOutputProtection");
features.Add("SecureStop");
}
if (clientInfo.SupportedFeatures.Contains("SecureClock"))
{
features.Add("AntiRollback");
}
return features;
}
}
Platform-Specific ライセンス ロジック
public OutputProtectionLevels DetermineOutputProtections(ClientInfo clientInfo)
{
var protections = new OutputProtectionLevels();
// Adjust based on platform
switch (clientInfo.Platform.ToLower())
{
case "windowsonx86":
case "windowsonx64":
protections.CompressedDigitalVideo = 270;
protections.UncompressedDigitalVideo = 270;
break;
case "oem":
// Custom OEM device - check manufacturer
if (IsHighSecurityOEM(clientInfo.ManufacturerName))
{
protections.CompressedDigitalVideo = 270;
protections.UncompressedDigitalVideo = 270;
}
else
{
protections.CompressedDigitalVideo = 200;
protections.UncompressedDigitalVideo = 200;
}
break;
default:
// Conservative defaults for unknown platforms
protections.CompressedDigitalVideo = 150;
protections.UncompressedDigitalVideo = 150;
break;
}
return protections;
}
クライアント情報分析
Windows プラットフォーム分析
Windows 10 Edge クライアントの特性:
- プラットホーム:
WindowsOnX86 - セキュリティ レベル:
2000(SL2000) - 堅牢性バージョン: ハードウェア固有の値
- 証明書チェーン: Microsoft が発行した証明書
- 機能: Standard PlayReady 3.0 機能セット
OEM デバイス分析
カスタム OEM クライアントの特性:
- プラットホーム:
OEM - セキュリティ レベル:
3000(SL3000) - 製造元: カスタム OEM 名
- 証明書チェーン: OEM + Microsoft 証明書
- 機能: 高度な PlayReady 3.0 以降の機能
ベスト プラクティス
クライアント情報の使用状況
- セキュリティ レベルの検証 - クライアントがコンテンツのセキュリティ要件を満たしていることを確認する
- 機能検出 - サポートされている機能に基づいてライセンスを調整する
- プラットフォームの最適化 - 特定のプラットフォームの設定を最適化する
- 証明書の検証 - 証明書チェーンの整合性を確認する
- 機能の照合 - コンテンツ要件をクライアントの機能に一致させる
ライセンス生成戦略
- 保守的な既定値 - 不明なクライアントに安全な既定値を使用する
- プログレッシブエンハンスメント - クライアント機能に基づいて機能を追加する
- セキュリティ優先 - 機能よりもセキュリティに優先順位を付ける
- プラットフォーム認識 - プラットフォーム固有の制限事項を考慮する
- 将来の互換性 - 前方互換性のための設計
関連ドキュメント
- PlayReady テスト サーバー サービス - 主要なテスト サーバー機能
- クエリ文字列構文 - パラメーター構文リファレンス
- 出力保護のテスト - 出力保護テスト
- PlayReady テスト サーバー - サーバーの完全なドキュメント
サポート リソース
ビジネス クエリ
- 電子メール: playready@microsoft.com
操作クエリ
- Web サイト: http://wmlalicensing.com/
- 電子メール: ipla@microsoft.com
テクニカル サポート
- サポート ポータル: PlayReady テクニカル サポート
トレーニング情報
- 電子メール: plyrdyev@microsoft.com