Тестирование сведений о клиенте

Обзор

Тестовый сервер PlayReady включает в себя специальную clientinfo функцию, которая отражает информацию, доступную серверу лицензирования, из запроса лицензии, созданного клиентом. Эта функция позволяет разработчикам легко изучить сведения о клиентах, передаваемые на серверы лицензий, и создать соответствующую логику создания лицензий на основе возможностей клиента. Обратите внимание, что ожидаемое поведение для тестового сервера PlayReady для ответа со строкой сбоя, указывающей, что это ошибка конкретного сервера (0x8004c604) с clientinfo данными в CustomData поле ответа на ошибку.

Функция сведений о клиенте

Используйте параметр для проверки сведений 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>https://test.playready.microsoft.com/service/rightsmanager.asmx</LA_URL>
                                    <LUI_URL>https://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

Для вызова, выданного Microsoft Edge в Windows 10:

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

Для вызова, выданного клиентом SL3000 на основе PlayReady 3.2:

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 Клиент поддерживает функции защиты отката часов
Списки отзыва Клиент поддерживает обработку списка отзыва
PlayReady3Features Клиент поддерживает функции PlayReady 3.0+
SecureClock Клиент поддерживает безопасные функции часов

Сведения о уровне безопасности

Уровень безопасности Описание Варианты использования
SL150 Защита на основе программного обеспечения Базовая защита содержимого
SL2000 Защита на основе оборудования Содержимое уровня "Стандартный" категории "Премиум"
SL3000 Аппаратный модуль безопасности Содержимое категории "Премиум"

Сведения о цепочке сертификатов

Каждый сертификат в цепочке предоставляет:

  • 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)
  • Версия надежности: значение для конкретного оборудования
  • Цепочка сертификатов: выданные корпорацией Майкрософт сертификаты
  • Функции: стандартный набор функций PlayReady 3.0

Анализ устройств OEM

Пользовательские характеристики клиента OEM:

  • Платформа: OEM
  • Уровень безопасности: 3000 (SL3000)
  • Производитель: Пользовательское имя OEM
  • Цепочка сертификатов: OEM + Сертификаты Майкрософт
  • Функции: Расширенные функции PlayReady 3.0+

Лучшие практики

Использование сведений о клиентах

  1. Проверка уровня безопасности . Проверка соответствия клиента требованиям к безопасности содержимого
  2. Обнаружение функций . Настройка лицензии на основе поддерживаемых функций
  3. Оптимизация платформы — оптимизация параметров для конкретных платформ
  4. Проверка сертификата — проверка целостности цепочки сертификатов
  5. Сопоставление возможностей . Соответствие требованиям к содержимому с клиентскими возможностями

Стратегия создания лицензий

  1. Консервативные значения по умолчанию— использование безопасных значений по умолчанию для неизвестных клиентов
  2. Прогрессивное улучшение . Добавление функций на основе возможностей клиента
  3. Безопасность в первую очередь — приоритет безопасности над функциями
  4. Осведомленность о платформе . Рассмотрите ограничения, связанные с платформой
  5. Будущая совместимость — проектирование для обеспечения совместимости вперед