Как подписать manifest.json для push-уведомлений safari с помощью golang?

#go #push-notification #apple-push-notifications #safari-push-notifications

#Вперед #push-уведомление #apple-push-уведомления #safari-push-уведомления

Вопрос:

Как правильно подписать файл manifest.json, который будет использоваться для пакета push-уведомлений Safari?

 func servePushPackage() func(w http.ResponseWriter, r *http.Request) {
    return func(w http.ResponseWriter, r *http.Request) {
        body, _ := ioutil.ReadAll(r.Body)
        fmt.Printf("servePushPackage() %s %s %s %s %vn", r.Method, r.RequestURI, r.RemoteAddr, body, r.FormValue)

        buf := new(bytes.Buffer)

        // Create a new zip archive.
        z := zip.NewWriter(buf)

        // Build the website.json file
        websiteJson :=
`{
    "websiteName": "Test",
    "websitePushID": "web.example.test",
    "allowedDomains": ["https://example.com"],
    "urlFormatString": "https://example.com/%@",
    "authenticationToken": "19f8d7a6e9fb8a7f6d9330dabe",
    "webServiceURL": "https://example.com"
}`

        // Build the manifest.json
        manifestJson := "{"

        // Add the icon files to the archive and to the manifest
        .... snip ....

        // Complete the manifest
        manifestJson = fmt.Sprintf("%snt"website.json":"%x"n}", manifestJson, sha1.Sum([]byte(websiteJson)) )

        addFileToArchive(z, "website.json", []byte([]byte(websiteJson)))
        addFileToArchive(z, "manifest.json", []byte([]byte(manifestJson)))
        addFileToArchive(z, "signature", []byte([]byte("test test test")))

        // Make sure to check the error on Close.
        err := z.Close()
        if err != nil {
            panic(err)
        }

        // Successfully built the push package
        w.Header().Set("Content-type", "application/zip")
        w.Write(buf.Bytes())
    }
}
 

Обратите внимание, что все это работает правильно, единственная проблема заключается в том, что safari сообщает следующее:

 {"logs":["Signature verification of push package failed"]}
 

В документации Apple указано, что это встроенная функция PHP, но не удалось найти эквивалент в go:

В PHP вы можете сделать это с помощью функции openssl_pkcs7_sign …

Комментарии:

1. Согласно go-nuts , в стандартной библиотеке Go нет реализации PKCS # 7. Я подозреваю, что там есть библиотека, но я ее еще не нашел.

2. Для справки, AGL является основным поставщиком криптопакетов Go. Я бы, вероятно, воспользовался его советом и перешел на OpenSSL.

3. Да, я тоже нашел этот пост. Ему уже более двух лет.