Я пытаюсь использовать ColdFusion для доступа к веб-службам Amazon (AWS), используя их текущий метод проверки подлинности, известный как Signature Version 4. Я ознакомился с их документацией, которая содержит примеры кода для several programming languages, а также псевдокод для other languages. Они предоставили некоторые тестовые входные значения, чтобы перейти к функции подписи моего скрипта, а также некоторые ожидаемые результаты.Как получить ключ входа для AWS Signature Version 4 (в ColdFusion)?
Вот тестовые входы:
key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
dateStamp = '20120215'
regionName = 'us-east-1'
serviceName = 'iam'
Вот ожидаемые результаты:
kSecret = '41575334774a616c725855746e46454d492f4b374d44454e472b62507852666943594558414d504c454b4559'
kDate = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d'
kRegion = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c'
kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa'
kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d'
Правильное значение для "kSigning" должно быть таким:
f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d
Однако, для «kSigning» мой код генерирует это:
31A84DCE0538A8B15ED68CCFBD803F17947E41BF625EFFD1AD6A67FC821F9BE2
Я использую Railo 4.2. Может кто-то, пожалуйста, помогите мне решить эту проблему, чтобы ожидаемое значение соответствовало сброшенному значению? Вот мой ColdFusion разметки:
<cfsilent>
<!--- HMACSHA256 --->
<cffunction name="sign" returntype="binary" access="private" output="false" hint="Sign with NSA SHA-256 Algorithm">
<cfargument name="signMessage" type="string" required="true" />
<cfargument name="signKey" type="string" required="true" />
<cfset var jMsg = JavaCast("string",arguments.signMessage).getBytes("utf-8") />
<cfset var jKey = JavaCast("string",arguments.signKey).getBytes("utf-8") />
<cfset var key = createObject("java","javax.crypto.spec.SecretKeySpec") />
<cfset var mac = createObject("java","javax.crypto.Mac") />
<cfset key = key.init(jKey,"HmacSHA256") />
<cfset mac = mac.getInstance(key.getAlgorithm()) />
<cfset mac.init(key) />
<cfreturn mac.doFinal(jMsg) />
</cffunction>
<!--- Get Signature Key --->
<cffunction name="getSignatureKey" returntype="binary" access="private" output="false" hint="Derive the sign-in key">
<cfargument name="key" type="string" required="true" />
<cfargument name="dateStamp" type="string" required="true" />
<cfargument name="regionName" type="string" required="true" />
<cfargument name="serviceName" type="string" required="true" />
<cfset var kSecret = "AWS4" & arguments.key />
<cfset var kDate = sign(arguments.dateStamp, kSecret) />
<cfset var kRegion = sign(arguments.regionName, kDate) />
<cfset var kService = sign(arguments.serviceName, kRegion) />
<cfset var kSigning = sign(arguments.serviceName, kService) />
<cfreturn kSigning />
</cffunction>
</cfsilent><!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>AWS Test</title>
</head>
<body>
<cfset kSecret = getSignatureKey(
'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY',
'20120215',
'us-east-1',
'iam'
) />
<cfdump var="#BinaryEncode(kSecret, 'hex')#" label="kSecret" />
</body>
</html>
Я имел в виду обновить свой скрипт от 2 до 4. Но в то же время это может дать вам некоторый прогресс. https://gist.github.com/CFJSGeek/3f6f14ba86049af75361 –
Когда вы выясните, я с удовольствием посмотрю ваши результаты! –
Я провел 72 часа подряд, пытаясь понять подпись версии 4 с помощью aws webservice, я, наконец, получил маркер правильно, как и ожидалось, как образцы кода, и когда я отправил его на службу, у меня все еще была ошибка проверки подлинности. Проработанные последующие часы с поддержкой уровня aws в корпоративной сети (мы назвали учетную запись), и инженер не мог понять, почему служба отклонила вызовы REST. Завершена загрузка java sdk и использование этого. Любовь aws, ненавидьте их реализацию. Это ужасно, черт возьми. Удачи! – rodmunera