XKMS
XKMS (англ. XML Key Management Specification — спецификация управления ключами в XML) использует фреймворк веб-сервисов для упрощения обеспечения защищённой передачи данных между приложениями с помощью инфраструктуры открытых ключей (PKI). XKMS — это протокол, разработанный Консорциумом Всемирной паутины (W3C), который описывает распространение и регистрацию открытых ключей[1].
Архитектура
XKMS состоит из двух частей:
- XKRSS — XML Key Registration Service Specification (XML-спецификация службы регистрации ключей)
- определяет, как происходит регистрация, отзыв и восстановление открытых ключей. Генерация ключей может осуществляться как на стороне клиента, так и на сервере во время регистрации.
- XKISS — XML Key Information Service Specification (XML-спецификация службы информации о ключах)
- определяет процессы получения и проверки открытых ключей.
В обоих случаях основная цель — вынести всю сложность традиционных реализаций PKI на внешний сервер, позволяя клиенту работать с ним простыми запросами.
Структура
Допустим, клиент обладает своим закрытым ключом Private, знает секретное слово Password и получил от сервера отдельный ключ auth для аутентификации.
Auth = HMAC-SHA1 (auth, 0x1) Pass = HMAC-SHA1 (HMAC-SHA1 (Password, 0x2), 0x3)
XKRSS
- Регистрация и отзыв ключа
Запрос
- Register (начальная метка)
- Prototype
- Status (состояние ключа: при регистрации отправляется «Valid», при отзыве — «Invalid»)
- KeyID
- ds:KeyInfo
- ds:KeyValue (публичный ключ; не указывается, если на сервере выполняется генерация)
- ds:KeyName
- ValidInterval (интервал действия ключа)
- NotBefore
- NotAfter
- PassPhrase (Pass)
- AuthInfo
- AuthUserInfo
- ProofOfPossession (доказательство владения ключами; не указывается, если генерация на сервере)
- ds:Signature (подпись Prototype приватным ключом)
- KeyBindingAuth (аутентификация в сервисе)
- ds:Signature (хэш Prototype с Auth в качестве ключа)
- ProofOfPossession (доказательство владения ключами; не указывается, если генерация на сервере)
- AuthUserInfo
- Respond (список меток KeyInfo, которые нужно получить в ответе)
- string (имя метки; при генерации ключа на сервере для получения зашифрованного приватного ключа нужно указать метку «Private» с шифрованием по ключу Auth)
- Prototype
Ответ
- RegisterResult (начальная метка)
- Answer
- Status (состояние ключа)
- KeyID
- ds:KeyInfo (содержит метки, указанные в запросе)
- Private (только если была запрошена при серверной генерации ключа)
- Answer
XKISS
Для XKISS синтаксис запросов аналогичен.
- Получение ключа
- Запрос
<Locate>
<Query>
<ds:KeyInfo>
<ds:RetrievalMethod
URI="http://www.PKeyDir.test/Certificates/01293122"
Type="http://www.w3.org/2000/09/xmldsig#X509Data"/>
</ds:KeyInfo>
</Query>
<Respond>
<string>KeyName</string>
<string>KeyValue</string>
</Respond>
</Locate>
- Ответ
<LocateResult>
<Result>Success</Result>
<Answer>
<ds:KeyInfo>
<ds:KeyName>O=XMLTrustCernter.org OU="Crypto"
CN="Alice"</ds:KeyName>
<ds:KeyValue>...</ds:KeyValue>
</ds:KeyInfo>
</Answer>
</LocateResult>
- Валидация ключа
- Запрос
<Validate>
<Query>
<Status>Valid</Status>
<ds:KeyInfo>
<ds:KeyName>...</ds:KeyName>
<ds:KeyValue>...</ds:KeyValue>
</ds:KeyInfo>
</Query>
<Respond>
<string>KeyName</string>
<string>KeyValue</string>
</Respond>
</Validate>
- Ответ
<ValidateResult>
<Result>Success</Result>
<Answer>
<KeyBinding>
<Status>Valid</Status>
<KeyID>http://www.xmltrustcenter.org/assert/20010120-39</KeyID>
<ds:KeyInfo>
<ds:KeyName>...</ds:KeyName>
<ds:KeyValue>...</ds:KeyValue>
</ds:KeyInfo>
<ValidityInterval>
<NotBefore>2000-09-20T12:00:00</NotBefore>
<NotAfter>2000-10-20T12:00:00</NotAfter>
</ValidityInterval>
</KeyBinding>
</Answer>
</ValidateResult>