Итак, я пытаюсь вручную проверить запрос от разрабатываемого мной навыка Alexa, но не могу проверить, что все сертификаты в цепочке объединяются для создания цепочки доверия к доверенному корневому сертификату ЦС. как показано на шаге 3.c документация.
Обработка этих сертификатов - совершенно новая территория для меня, и, поскольку я уже приобрел этот навык без использования предложенного ask-sdk от Amazon, я подумал, что будет быстрее выполнить проверку вручную, а не адаптировать свой навык для использования SDK. Но теперь я застрял и мне нужна помощь.
Я действительно не понимаю, как работает caStore, и думаю, что могу неправильно его инициализировать. Я попытался использовать сертификат подписи Amazon, указанный в запросе навыка, и два корневых сертификата (URL-адреса в коде), но безуспешно.
Вот код
const rp = require('request-promise')
const pki = require('node-forge').pki
const AlexaSkill = {
validate: async (request) => {
if (request.headers) {
const signature = request.headers.signature
const signatureCertChainUrl = request.headers.signaturecertchainurl
if (signature && signatureCertChainUrl) {
let urlPieces = signatureCertChainUrl.replace('../', '').split('echo.api/')
if (urlPieces.length > 1) {
const normalizedUrl = `${urlPieces[0]}echo.api/${urlPieces[urlPieces.length - 1]}`
if (normalizedUrl.startsWith('https://s3.amazonaws.com:443/echo.api/') || normalizedUrl.startsWith('https://s3.amazonaws.com/echo.api/')) {
const pem = await rp(signatureCertChainUrl)
const amazonSigningPem = pem.substring(0, pem.indexOf('END CERTIFICATE-----\n') + 21)
const amazonSigningCert = pki.certificateFromPem(amazonSigningPem)
const pem1 = await rp('https://www.amazontrust.com/repository/AmazonRootCA1.pem')
const amazonRootCert1 = pki.certificateFromPem(pem1)
const pem2 = await rp('https://www.amazontrust.com/repository/AmazonRootCA2.pem')
const amazonRootCert2 = pki.certificateFromPem(pem2)
// const pem3 = await rp('https://www.amazontrust.com/repository/AmazonRootCA3.pem')
// const amazonRootCert3 = pki.certificateFromPem(pem3)
// const pem4 = await rp('https://www.amazontrust.com/repository/AmazonRootCA4.pem')
// const amazonRootCert4 = pki.certificateFromPem(pem4)
const caStore = pki.createCaStore([ amazonSigningCert ])
const caStore1 = pki.createCaStore([ amazonRootCert1 ])
const caStore2 = pki.createCaStore([ amazonRootCert2 ])
// const caStore3 = pki.createCaStore([ amazonRootCert3 ])
// const caStore4 = pki.createCaStore([ amazonRootCert4 ])
const certChain = pem.substring(pem.indexOf('END CERTIFICATE-----\n') + 21)
.split('-----END CERTIFICATE-----\n')
.filter(cert => cert.length > 0)
.map(cert => pki.certificateFromPem(`${cert}-----END CERTIFICATE-----\n`))
try {
const v = pki.verifyCertificateChain(caStore, certChain)
console.log('Passed!', v)
} catch (e) {
console.log('Error!', JSON.stringify(e))
}
try {
const v1 = pki.verifyCertificateChain(caStore1, certChain)
console.log('Passed!', v1)
} catch (e) {
console.log('Error!', JSON.stringify(e))
}
try {
const v2 = pki.verifyCertificateChain(caStore2, certChain)
console.log('Passed!', v2)
} catch (e) {
console.log('Error!', JSON.stringify(e))
}
}
}
}
}
return false
}
}
И на выходе
Ошибка! {сообщение: сертификат не является доверенным., ошибка: forge.pki.UnknownCertificateAuthority}
Ошибка! {сообщение: сертификат не является доверенным., ошибка: forge.pki.UnknownCertificateAuthority}
Ошибка! {сообщение: сертификат не является доверенным., ошибка: forge.pki.UnknownCertificateAuthority}
Заранее спасибо.