2011-04-08 7 views
1

여기에서 모든 것을 시도했지만 Amazon Load Balancer API는 내 서명을 허용하지 않습니다.AWS API - 내 서명을 허용하지 않습니다.

내가 시도해도 "403 SignatureDoesNotMatch"응답이 표시됩니다. 나는 분명히 뭔가 빠져있을 것입니다. 그러나 그것이 무엇인지 알아 내려고 노력하면서 시간을 보냈습니다. 저는 제 밧줄 끝에 있습니다. 도와주세요!! 감사. 나는이의 하단에 도착,

Public Sub DeregisterInstanceFromLoadBalance(ByVal strServerID As String) 
    Dim strURL As String 
    strURL = "http://elasticloadbalancing.amazonaws.com/?" 
    Dim strTimestamp As String = PercentEncodeRfc3986(DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss'Z'")) 

    Dim strParams As String 
    strParams = "AWSAccessKeyId=<MY_API_KEY>" & _ 
    "&Action=DeregisterInstancesFromLoadBalancer" & _ 
    "&Instances.member.N=" & strServerID & _ 
    "&LoadBalancerName=ATTB" & _ 
    "&SignatureMethod=HmacSHA256" & _ 
    "&SignatureVersion=2" & _ 
    "&Timestamp=" & strTimestamp & _ 
    "&Version=2009-05-15" 

    Dim strStringToSign As String = "GET\nelasticloadbalancing.amazonaws.com\n/\n" & strParams 

    strURL = strURL & strParams & "&Signature=" & PercentEncodeRfc3986(HashString(strStringToSign)) 

    Dim wc As New WebClient() 
    Dim strResponse As String 
    strResponse = wc.DownloadString(strURL) 

End Sub 


Private Const PRIVATE_KEY As String = "<MY_PRIVATE_KEY>" 

Private Function HashString(ByVal StringToHash As String) As String 
    Dim Key() As Byte = Encoding.UTF8.GetBytes(PRIVATE_KEY) 
    Dim XML() As Byte = Encoding.UTF8.GetBytes(StringToHash) 
    Dim myHMACSHA256 As New System.Security.Cryptography.HMACSHA256(Key) 
    Dim HashCode As Byte() = myHMACSHA256.ComputeHash(XML) 
    Return Convert.ToBase64String(HashCode) 
End Function 


Private Function PercentEncodeRfc3986(ByVal str As String) As String 

    str = HttpUtility.UrlEncode(str, System.Text.Encoding.UTF8) 
    str = str.Replace("'", "%27").Replace("(", "%28").Replace(")", "%29").Replace("*", "%2A").Replace("!", "%21").Replace("%7e", "~").Replace("+", "%20").Replace("%7E", "~") 

    Dim sbuilder As StringBuilder = New StringBuilder(str) 
    For i As Int32 = 0 To sbuilder.Length - 1 

     If sbuilder(i) = "%" Then 
      If (Char.IsLetter(sbuilder(i + 1)) OrElse Char.IsLetter(sbuilder(i + 2))) Then 
       sbuilder(i + 1) = Char.ToUpper(sbuilder(i + 1)) 
       sbuilder(i + 2) = Char.ToUpper(sbuilder(i + 2)) 
      End If 
     End If 
    Next 
    Return sbuilder.ToString() 
End Function 

답변

1

확인 :

여기 내 코드입니다. 몇 가지 문제가있었습니다. 아마존의 문서. VB.Net에서

  • , 내가 ControlChars.Lf보다는 을 사용하고 있어야
  • 문서화 같은 Instances.member.N 매개 변수를 그냥 잘못 "\ n", 그것은해야 일
    Instances.member. [N]을 1부터
    [N]은 인스턴스 인덱스를
    , .InstanceId. 이것은 다소 혼란스러운 오류 메시지
    "LoadBalancerNotFound"를 반환했습니다.
  • 올바른 도메인은 입니다. elasticloadbalancing. [availability_zone] .amazonaws.com; 문서에서 사용 된 예제는이 점을 특히 명확하게하지 않습니다. (도메인 사용은 다른 곳에 문서화되어 있지만)
관련 문제