Autenticação de servidor para servidor do CloudKit

A Apple publicou um novo método para se autenticar no CloudKit, servidor para servidor.https://developer.apple.com/library/content/documentation/DataManagement/Conceptual/CloudKitWebServicesReference/SettingUpWebServices.html#//apple_ref/doc/uid/TP40015240-CH24-SW6

Eu tentei me autenticar no CloudKit e nesse método. No começo, gerei o par de chaves e dei a chave pública ao CloudKit, sem problemas até agora.

Comecei a criar o cabeçalho da solicitação. De acordo com a documentação, deve ficar assim:

X-Apple-CloudKit-Request-KeyID: [keyID]  
X-Apple-CloudKit-Request-ISO8601Date: [date]  
X-Apple-CloudKit-Request-SignatureV1: [signature]
[keyID], não há problema. Você pode encontrar isso no painel do CloudKit.[Data], acho que isso deve funcionar: 2016-02-06T20: 41: 00Z[assinatura], aqui está o problema ...

A documentação diz:

A assinatura criada na Etapa 1.

O passo 1 diz:

Concatene os seguintes parâmetros e separe-os com dois pontos.
[Current date]:[Request body]:[Web Service URL]

Eu me perguntei "Por que tenho que gerar o par de chaves?".
Mas o passo 2 diz:

Calcule a assinatura ECDSA desta mensagem com sua chave privada.

Talvez eles pretendam assinar a assinatura concatenada com a chave privada e colocá-la no cabeçalho? Enfim, eu tentei os dois ...

Minha amostra para este valor de assinatura (não assinado) é semelhante a:

2016-02-06T20:41:00Z:YTdkNzAwYTllNjI1M2EyZTllNDNiZjVmYjg0MWFhMGRiMTE2MjI1NTYwNTA2YzQyODc4MjUwNTQ0YTE5YTg4Yw==:https://api.apple-cloudkit.com/database/1/[iCloud Container]/development/public/records/lookup  

O valor do corpo da solicitação é hash SHA256 e, depois disso, codificado em base64. Minha pergunta é: eu devo concatenar com um ":", mas o URL e a data também contêm ":". Está correto? (Também tentei codificar por URL e excluir ":" na data).
Em seguida, assinei esta sequência de assinaturas com a ECDSA, coloque-a no cabeçalho e envie-a. Mas eu sempre recebo 401 "A autenticação falhou" de volta. Para assinar, usei oecdsa módulo python, com os seguintes comandos:

from ecdsa import SigningKey  
a = SigningKey.from_pem(open("path_to_pem_file").read())  
b = "[date]:[base64(request_body)]:/database/1/iCloud....."  
print a.sign(b).encode('hex')

Talvez o módulo python não funcione corretamente. Mas pode gerar a chave pública correta a partir da chave privada. Então, espero que as outras funções também funcionem.

Alguém conseguiu se autenticar no CloudKit com o método servidor para servidor? Como funciona corretamente?

Editar: Versão python correta que funciona

from ecdsa import SigningKey
import ecdsa, base64, hashlib  

a = SigningKey.from_pem(open("path_to_pem_file").read())  
b = "[date]:[base64(sha256(request_body))]:/database/1/iCloud....."  
signature = a.sign(b, hashfunc=hashlib.sha256, sigencode=ecdsa.util.sigencode_der)  
signature = base64.b64encode(signature)
print signature #include this into the header

questionAnswers(6)

yourAnswerToTheQuestion