使用带有临时证书的boto3

时间:2019-10-19 21:09:19

标签: python amazon-web-services boto3

我想使用boto3将文件上传到AWS S3。但是我只能通过不受我控制的Web服务来临时访问S3。我提供了以下凭据信息:

class Foo
{
    public Foo(int length)
    {
        // toggle these to see the issue
        Bars = InitializeWithYield(length);
        //Bars = InitializeCalledFromConstructor(length);
    }

    public void DoSomething()
    {
        IBar firstBar = Bars.FirstOrDefault(); // calls InitializeWithYield if in constructor 
        IList<IBar> listOfBar = Bars.ToList(); // calls InitializeWithYield if in constructor
        Console.Write($"First Bar has value {b.Value}");
    }

    IEnumerable<IBar> Bars { get; }

    // shorter syntax, but gets called every time the Bars property is used
    // also, not called from constructor
    IEnumerable<IBar> InitializeWithYield(int number)
    {
        for (int i = 0; i < number; i++)
        {
            yield return new Bar(i);
        }
    }

    // this only gets called from the constructor, which is what I want
    IEnumerable<IBar> InitializeCalledFromConstructor(int number)
    {
        IList<IBar> result = new List<IBar>();
        for (int i = 0; i < number; i++)
        {
            result.Add(new Bar(i));
        }
        return result;
    }
}

据我所知,这些信息可以用于POST请求。但是我无法找到如何结合boto3命令使用此信息

    {
        "key": <string>,
        "x-amz-algorithm": <string>,
        "x-amz-credential": <string>,
        "x-amz-date": <string>,
        "policy": <string>,
        "x-amz-signature": <string>
    }

通常需要 aws_access_key_id aws_secret_access_key 。 帖子here暗示,这应该可行:

  

您应该通过AWS安全令牌服务(STS)生成临时凭证,而不是对URL(通常是通过Web浏览器进行呼叫时使用的URL)进行签名

     

[...]

     

然后,您的Python应用会在调用boto时使用这些凭据

但是我无法找出如何向boto客户端提供临时凭证。

1 个答案:

答案 0 :(得分:2)

似乎您已获得Amazon S3 pre-signed URLs。这是一种通过授权请求的散列签名来授予对特定Amazon S3命令的临时访问权的方法。

使用访问密钥和秘密密钥生成请求时,您无法从请求中提取秘密密钥。 (相反,它是用来创建签名的。)因此,您不能使用boto3使用提供的信息来发出请求。这完全是故意的。

使用安全令牌服务生成临时凭据不同于生成预签名URL。 STS将提供boto3可以使用的凭据。但是,在为您提供访问信息时,这并不是他们要做的。