Vb.net AWS API-Won和x27;我不接受我的签名

Vb.net AWS API-Won和x27;我不接受我的签名,vb.net,amazon-ec2,amazon-web-services,load-balancing,Vb.net,Amazon Ec2,Amazon Web Services,Load Balancing,我已经尝试了这里的一切,但是Amazon负载平衡器API不会接受我的签名 无论我怎么做,我都会得到“403 SignatureedoEsnotmatch”的回复。我可能错过了一些明显的东西,但花了几个小时试图弄清楚那是什么,我已经筋疲力尽了。请帮忙!!谢谢 这是我的密码: Public Sub DeregisterInstanceFromLoadBalance(ByVal strServerID As String) Dim strURL As String strURL = "

我已经尝试了这里的一切,但是Amazon负载平衡器API不会接受我的签名

无论我怎么做,我都会得到“403 SignatureedoEsnotmatch”的回复。我可能错过了一些明显的东西,但花了几个小时试图弄清楚那是什么,我已经筋疲力尽了。请帮忙!!谢谢

这是我的密码:

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
Public Sub从LoadBalance取消注册instancefromLoadBalance(ByVal strServerID作为字符串)
暗弦
strURL=”http://elasticloadbalancing.amazonaws.com/?"
Dim strTimestamp As String=PercentEncodeRfc3986(DateTime.UtcNow.ToString(“yyyy-MM-dd'T'HH:MM:ss'Z'))
将strParams设置为字符串
strParams=“AWSAccessKeyId=”和_
“&Action=从LoadBalancer取消注册安装”&_
“&Instances.member.N=“&strServerID&_
“&LoadBalancerName=ATTB”&_
“&SignatureMethod=HmacSHA256”&_
“&SignatureVersion=2”&_
“&Timestamp=“&strTimestamp&_
“&Version=2009-05-15”
Dim strStringToSign As String=“GET\nelasticloadbalance.amazonaws.com\n/\n”&strParams
strURL=strURL&strParams&“&Signature=“&PercentEncodeRfc3986(HashString(strStringToSign))
Dim wc作为新的WebClient()
作为字符串的Dim strResponse
strResponse=wc.DownloadString(strURL)
端接头
Private Const Private_KEY As String=“”
私有函数HashString(ByVal StringToHash作为字符串)作为字符串
Dim Key()为Byte=Encoding.UTF8.GetBytes(私钥)
Dim XML()作为Byte=Encoding.UTF8.GetBytes(StringToHash)
Dim myHMACSHA256作为新系统。安全。加密。HMACSHA256(密钥)
Dim HashCode作为Byte()=myHMACSHA256.ComputeHash(XML)
返回Convert.ToBase64String(HashCode)
端函数
私有函数PercentEncodeRfc3986(ByVal str作为字符串)作为字符串
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”,“~”)
作为StringBuilder的尺寸sbuilder=新StringBuilder(str)
对于i As Int32=0到sbuilder.Length-1
如果sbuilder(i)=“%”,则
如果(Char.IsLetter(sbuilder(i+1))或lse Char.IsLetter(sbuilder(i+2)),那么
sbuilder(i+1)=Char.ToUpper(sbuilder(i+1))
sbuilder(i+2)=Char.ToUpper(sbuilder(i+2))
如果结束
如果结束
下一个
返回sbuilder.ToString()
端函数

好的,我把这件事搞清楚了。有一些问题;不仅仅是亚马逊的文档

  • 在VB.Net中,我应该使用ControlChars.Lf而不是“\n”
  • Instances.member.N参数如文档所示 只是错了,应该是
    实例.member.[N].InstanceId,其中[N]是实例索引,
    1开始。这又回来了 相当混乱的错误消息
    “LoadBalancerNotFound”
  • 正确的域是ElasticLoadBalancement.[availability_zone].amazonaws.com;文档中使用的示例也没有特别清楚地说明这一点。(尽管其他地方记录了域的使用情况)

好的,我把事情弄清楚了。有一些问题;不仅仅是亚马逊的文档

  • 在VB.Net中,我应该使用ControlChars.Lf而不是“\n”
  • Instances.member.N参数如文档所示 只是错了,应该是
    实例.member.[N].InstanceId,其中[N]是实例索引,
    1开始。这又回来了 相当混乱的错误消息
    “LoadBalancerNotFound”
  • 正确的域是ElasticLoadBalancement.[availability_zone].amazonaws.com;文档中使用的示例也没有特别清楚地说明这一点。(尽管其他地方记录了域的使用情况)