签名

最近更新时间:2020-08-12 15:23:05

1.出现签名不匹配的错误,如何排查?


1.出现签名不匹配的错误,如何排查?

如果返回“SignatureDoesNotMatch”的错误码,说明签名出现错误。 请检查:

  1. 确认AccessKey是否多写了空格;
  2. 当请求的header中包含Content-MD5时,StringToSign中需要包含请求内容数据的MD5值, 使用Base64编码;
  3. Content-Type 表示请求内容的类型,取HTTP header中的Content-Type;
  4. Date 取HTTP Header中的Date,且必须为 HTTP1.1 中支持的 GMT 格式,请注意,您发送请求的时间(客户端系统时间)与服务端收到请求的时间,间隔前后不得超出15分钟,否则该请求将被认为无效并返回错误,请检查发送请求设备的系统时间与标准时间是否一致;
  5. CanonicalizedKssHeaders 取HTTP请求中的以x-kss开头的Header组合;
  6. CanonicalizedResource 取用户访问的资源;
  7. 签名构造规则见API接口文档中的签名。

建议使用SDK进行签名,SDK文档:JavaPHPPythonAndroidIOSJavaScriptNode.jsC#C/C++

2.自建签名服务器怎么算签名?
public void testUseServerSignature() throws SignatureException {
        //此示例为分块上传第一步Initiate Multipart Upload
        Authorization auth = new Authorization("youak", "yousk");
        Request request = new Request();
        request.setMethod(HttpMethod.POST);
        request.setKey("testsignature");
        request.setEndpoint("ks3-cn-beijing.ksyun.com"); //自己bucket所在endpoint
        request.setBucket("yourbucket");
        request.setRegion("BEIJING"); //自己bucket所在region

        //设置url参数
        Map<String, String> queryParamMap = new HashMap<>();
        queryParamMap.put("uploads", null);
        request.setQueryParams(queryParamMap);

        //设置header
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "binary/octet-stream");
        String dateStr = DateUtils.convertDate2Str(new Date(), DateUtils.DATETIME_PROTOCOL.RFC1123);
        headers.put("Date", dateStr);
        request.setHeaders(headers);

        //传入请求参数,从服务端获取签名,AuthUtils工具类在java sdk中
        String signature = AuthUtils.calcAuthorization(auth, request);

        //实际发起请求
        HttpPost httpPost = new HttpPost("http://" + request.getEndpoint() + "/" + request.getBucket() + "/" + request.getKey() + "?uploads");
        //下面的header传入内容需要和计算签名时保持一致
        httpPost.addHeader("Date", dateStr);
        httpPost.addHeader("Authorization", signature);
        httpPost.addHeader("Content-Type", "binary/octet-stream");

        try {
            CloseableHttpClient httpclient = HttpClients.createDefault();
            CloseableHttpResponse responseBody = httpclient.execute(httpPost);
            System.out.println(JSON.toJSONString(responseBody));
            System.out.println(responseBody.getStatusLine());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

金山云,开启您的云计算之旅

免费注册