游客mskzzar2michw_个人页

个人头像照片 游客mskzzar2michw
0
1
0

个人介绍

暂无个人介绍

擅长的技术

获得更多能力
通用技术能力:

暂时未有相关通用技术能力~

云产品技术能力:

暂时未有相关云产品技术能力~

阿里云技能认证

详细说明
暂无更多信息
正在加载, 请稍后...
暂无更多信息
  • 提交了问题 2018-06-27

    清除主机的所有数据

  • 回答了问题 2018-06-01

    MongoDB数据拆分和同步的问题

    详细解答可以参考官方帮助文档使用数据传输DTS可以将本地的MongoDB实例的数据迁移至RDS For MongoDB。Mongodb迁移支持增量数据同步功能,可以实现在本地应用不停服的情况下,平滑完成MongoDB数据库的迁移工作。 本小节简单介绍使用DTS进行MongoDB->RDS For MongoDB数据迁移的任务配置流程。 迁移类型简介对于MongoDB->云数据库 MongoDB数据迁移,DTS支持全量数据迁移及增量数据迁移,这个迁移类型的功能及限制如下。 全量数据迁移 数据传输DTS将源数据库迁移对象的存量数据全部迁移到目标实例。 增量数据迁移 增量数据迁移将迁移过程中,本地MongoDB实例的增量更新数据同步到云数据库MongoDB,最终本地MongoDB同云数据库MongoDB进入动态数据同步的过程。使用增量数据迁移,可以实现在本地MongoDB正常提供服务的时候,平滑完成MongoDB->RDS For MongoDB的数据迁移。 迁移功能 MongoDB版本支持支持MongoDB 3.0,3.2 两个版本 MongoDB全量数据迁移支持 支持database 迁移支持collection 迁移支持index 迁移 MongoDB增量数据迁移支持 支持document 新增、删除、更新 操作的同步支持collection新建、删除 操作的同步支持database 新建、删除 操作的同步支持index 新建、删除 操作的同步 迁移权限要求当使用DTS进行MongoDB-> 云数据库MongoDB迁移时,不同迁移类型,对源跟目标MongoDB实例的迁移帐号权限要求如下: 迁移类型 全量数据迁移 增量数据迁移 本地MongoDB read 待迁移库的readadmin的read权限local的read权限 目的MongoDB实例 readWrite readWrite 迁移任务配置下面详细介绍使用DTS将本地的MongoDB迁移到云数据库MongoDB的任务配置流程。 迁移帐号创建迁移任务配置,需要提供本地自建MongoDB实例及目标MongoDB云数据库的迁移账号,迁移账号所需权限详见上面的 迁移权限要求 一节。 如果您的本地MongoDB或MongoDB云数据库的迁移账号尚未创建,那么可以参考如下流程创建迁移账号: db.createUser({user:'username',pwd:'password',roles:[{role:'rolename1',db:'database_name1'},{role:'rolename2',db:'database_name2'}]}) 参数说明: username: 要创建的账号password: 上面账号对应的密码rolename1/rolename2:待授权给username的角色名,例如上面的read, readWritedatabase_name1/database_name2: 只将database_name1/database_name2上的角色role1/role2授权给username 关于MongoDB的角色授权也可以参考 MongoDB Create User说明 迁移任务配置当上面的所有前置条件都配置完成后,就可以开始正式的数据迁移了。下面详细介绍迁移任务配置流程。 进入数据传输DTS控制台,点击右上角的创建迁移任务,开始迁移任务配置。本地MongoDB跟目标MongoDB实例的连接信息配置。 这个步骤主要配置 迁移任务名称,本地MongoDB连接信息及目标MongoDB云数据库连接信息。其中: 任务名称 DTS为每个任务自动生成一个任务名称,任务名称没有唯一性要求。您可以根据需要修改任务名称,建议为任务配置具有业务意义的名称,便于后续的任务识别。 源实例信息 实例类型:选择 有公网IP的自建数据库数据库类型: 选择 MongoDB主机名或IP地址: 配置MongoDB访问地址,这个地址必须为公网访问方式端口:本地MongoDB实例的监听端口数据库名称:连接MongoDB实例的默认数据库名数据库账号:本地MongoDB实例的连接账号数据库密码:本地MongoDB实例连接账号对应的密码 目标实例信息 实例类型:选择 MongoDB实例MongoDB实例ID: 配置迁移的目标MongoDB实例的实例ID。 DTS支持经典网络的MongoDB实例。如果您的MongoDB实例为VPC网络的实例,那么需要切换到经典网络模式后,再使用DTS进行迁移数据库名称:连接MongoDB的默认数据库名数据库账号:连接MongoDB实例的连接账号数据库密码:上面数据库账号对应的密码 当配置完连接信息后,点击右下角 授权白名单并进入下一步 进行白名单授权。这个步骤DTS会将DTS服务器的IP地址添加到目标MongoDB云数据库的白名单中,避免因为MongoDB实例设置了白名单,DTS服务器连接不上MongoDB实例导致迁移失败。 选择迁移对象及迁移类型。 迁移类型 对于MongoDB,支持 全量数据迁移、增量数据迁移。 如果只需要进行全量迁移,那么迁移类型选择:全量数据迁移。 如果需要进行不停机迁移,那么迁移类型选择:全量数据迁移+增量数据迁移。 迁移对象 这个步骤需要选择要迁移的对象。迁移对象选择的粒度可以为:库、collection/function 两个粒度。默认情况下,对象迁移到MongoDB实例后,对象名跟本地MongoDB实例一致。如果您迁移的对象在源实例跟目标实例上名称不同,那么需要使用DTS提供的对象名映射功能,详细使用方式可以参考库表列映射。 预检查。 在迁移任务正式启动之前,会先进行前置预检查,只有预检查通过后,才能成功启动迁移。预检查的内容及修复方式可以参考本文末尾的 预检查简介 一节。 如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。 启动迁移任务。 当预检查通过后,可以启动迁移任务,任务启动成功后,可以在任务列表中查看迁移的具体状态及迁移进度。 至此,完成本地MongoDB数据库到MongoDB实例的数据迁移任务配置。 预检查DTS在启动迁移之前,会进行前置预检查,本小节简单介绍MongoDB->RDS For MongoDB的预检查内容: 检查项 检查内容 备注 源库连接性检查 检查DTS服务器跟本地MongoDB实例的连通性 (1) 填写信息是否有误?如果填写信息有误,请修改后重新预检查(2) 检查端口是否配置从其他服务器连接访问 目标库连接性检查 检查DTS服务器跟目标MongoDB实例的连通性 检查填写信息是否有误,如果有误请先修改后重新预检查 源库版本检查 检查本地MongoDB的版本,DTS是否支持 请先升级版本到3.2后,重新预检查 源库权限检查 检查本地MongoDB提供的迁移账号的权限是否满足需求 如果检查失败,请参照 迁移账号创建 一节授权后,重新预检查 目的库权限检查 检查目的MongoDB数据库提供的迁移账号的权限是否满足需求 如果检查失败,请参照 迁移账号创建 一节授权后,重新预检查 增量拓扑冲突检查 检查MongoDB实例上是否有其他增量迁移任务正在运行 如果检查失败,那么需要结束或删除其他的增量迁移任务后,重新预检查
    踩1 评论0
  • 提交了问题 2018-05-27

    请将该文件尽快删除

  • 提交了问题 2018-05-23

    8G 主从版的redisQPS能达到多少

  • 提交了问题 2018-05-15

    有没有移动端上传回调android的demo

  • 提交了问题 2018-05-14

    为什么我的网站显示404

  • 提交了问题 2018-05-12

    404页面设置了出不来

  • 提交了问题 2018-05-06

    RDS数据库如何保证数据安全性

  • 回答了问题 2018-04-27

    外网地址如何关闭掉

    详细解答可以参考官方帮助文档 您可以根据业务需求设置选择实例的连接类型,即内网连接或外网连接。系统会默认提供内网地址,所以本文将主要介绍如何申请外网地址、如何设置内外网的连接地址以及如何释放外网地址。 背景信息 RDS提供两种连接地址,即内网地址和外网地址。实例的访问模式和实例规格对连接地址的选择有如下限制。 实例系列 实例版本 访问模式 连接地址 单机基础版 MySQL 5.7 SQL Server 2012 标准模式 内网地址 外网地址 内网地址和外网地址 双机高可用版 MySQL 5.5/5.6 SQL Server 2008 R2 PostgreSQL 9.4 PPAS 9.3 标准模式 内网地址 外网地址 高安全模式 内网地址 外网地址 内网地址和外网地址 金融版 MySQL 5.6 标准模式 内网地址 外网地址 高安全模式 内网地址 外网地址 内网地址和外网地址 连接地址的使用场景如下所示: 单独使用内网地址: 系统默认提供内网地址,您可以直接修改连接地址。 适用于应用部署在与您的RDS实例在同一地域的ECS上且RDS实例与ECS的网络类型相同时。 单独使用外网地址: 适用于应用部署在与您的RDS在不同地域的ECS上时。 适用于应用部署在阿里云以外的系统上时。 同时使用内外网地址: 适用于应用中的模块同时部署在与您的RDS实例在同一地域且网络类型相同的ECS上和与您的RDS实例在不同地域的ECS上时。 适用于应用中的模块同时部署在与您的RDS实例在同一地域且网络类型相同的ECS上和阿里云以外的系统上时。 注意事项 在访问数据库前,您需要将访问数据库的 IP 地址或者 IP 段加入白名单,操作请参见设置白名单。 RDS 会针对外网地址流量收取一定费用,详细收费标准请参见云数据库 RDS 详细价格信息。 外网地址会降低实例的安全性,请谨慎选择。为了获得更快的传输速率和更高的安全级别,建议您将应用迁移到与您的 RDS 在同一地域的阿里云服务器 ECS 上。 申请外网地址 登录 RDS 管理控制台。 选择目标实例所在地域。 单击目标实例的 ID,进入基本信息页面。 在左侧导航栏中选择数据库连接,进入数据库连接页面。 单击申请外网地址,如下图所示。 在弹出的信息确认框中单击确定,生成外网地址。 修改内外网连接地址 您可以根据需求修改内网或者外网的连接地址,操作步骤如下。 登录 RDS 管理控制台。 选择目标实例所在地域。 单击目标实例的 ID,进入基本信息页面。 选择菜单中的数据库连接,进入数据库连接页面。 选择实例连接标签页。 在数据库连接模块中单击修改连接地址。 在弹出的窗口中设置内外网连接地址及端口号,单击确定,如下图所示。 参数说明: 连接类型:根据需要修改的连接类型选择内网地址或者外网地址。 连接地址:地址样式为xxx.sqlserver.rds.aliyuncs.com,其中xxx为自定义字段,由字母和数字组成,开头需小写字母,8~64 个字符,如extranet4example。 端口:RDS 对外提供服务的端口号,取值范围是3200~3999之间的任意一个整数。 释放外网地址 若您需要释放外网地址,可执行如下操作步骤。 说明 该操作只能在高安全模式下执行。关于访问模式的设置,请参见设置访问模式。 登录 RDS 管理控制台。 选择目标实例所在地域。 单击目标实例的 ID,进入基本信息页面。 选择菜单中的数据库连接,进入数据库连接页面。 选择实例连接标签页。 在数据库连接模块中单击释放外网地址,如下图所示。 在弹出的确认信息界面单击确认,释放外网地址。
    踩1 评论0
  • 回答了问题 2018-04-25

    在URL中携带Callback参数怎么计算签名

    详细解答可以参考官方帮助文档 用户只需要在发送给OSS的请求中携带相应的Callback参数,即能实现回调。 现在支持CallBack的API 接口有:PutObject、PostObject、CompleteMultipartUpload。 构造CallBack参数 CallBack参数是由一段经过base64编码的Json字串,用户关键需要指定请求回调的服务器URL(callbackUrl)以及回调的内容(callbackBody)。详细的Json字段如下: 字段 含义 选项 callbackUrl 文件上传成功后OSS向此url发送回调请求,请求方法为POST,body为callbackBody指定的内容。正常情况下,该url需要响应“HTTP/1.1 200 OK”,body必须为JSON格式,响应头Content-Length必须为合法的值,且不超过3MB。 支持同时配置最多5个url,以”;”分割。OSS会依次发送请求直到第一个返回成功为止。 如果没有配置或者值为空则认为没有配置callback。 支持HTTPS地址。 为了保证正确处理中文等情况,callbackUrl需做url编码处理,比如http://example.com/中文.php?key=value&中文名称=中文值 需要编码成 http://example.com/%E4%B8%AD%E6%96%87.php?key=value&%E4%B8%AD%E6%96%87%E5%90%8D%E7%A7%B0=%E4%B8%AD%E6%96%87%E5%80%BC 必选项 callbackHost 发起回调请求时Host头的值,只有在设置了callbackUrl时才有效。 如果没有配置 callbckHost,则会解析callbackUrl中的url并将解析出的host填充到callbackHost中 可选项 callbackBody 发起回调时请求body的值,例如:key=$(key)&etag=$(etag)&my_var=$(x:my_var)。 支持OSS系统变量、自定义变量和常量,支持的系统变量如下表所示 。自定义变量的支持方式在PutObject和CompleteMultipart中是通过callback-var来传递,在PostObject中则是将各个变量通过表单域来传递。 必选项 callbackBodyType 发起回调请求的Content-Type,支持application/x-www-form-urlencoded和application/json,默认为前者。 如果为application/x-www-form-urlencoded,则callbackBody中的变量将会被经过url编码的值替换掉,如果为application/json,则会按照json格式替换其中的变量。 可选项 示例json串如下 { 'callbackUrl':'121.101.166.30/test.php', 'callbackHost':'oss-cn-hangzhou.aliyuncs.com', 'callbackBody':'{\'mimeType\':${mimeType},\'size\':${size}}', 'callbackBodyType':'application/json' } { 'callbackUrl':'121.43.113.8:23456/index.html', 'callbackBody':'bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&imageInfo.height=${imageInfo.height}&imageInfo.width=${imageInfo.width}&imageInfo.format=${imageInfo.format}&my_var=${x:my_var}' } 其中callbackBody中可以设置的系统变量有,其中imageInfo针对于图片格式,如果为非图片格式都为空: 系统变量 含义 bucket bucket object object etag 文件的etag,即返回给用户的etag字段 size object大小,CompleteMultipartUpload时为整个object的大小 mimeType 资源类型,如jpeg图片的资源类型为image/jpeg imageInfo.height 图片高度 imageInfo.width 图片宽度 imageInfo.format 图片格式,如jpg、png等 自定义参数 用户可以通过callback-var参数来配置自定义参数。 自定义参数是一个Key-Value的Map,用户可以配置自己需要的参数到这个Map。在OSS发起POST回调请求的时候,会将这些参数和上一节所述的系统参数一起放在POST请求的body中以方便接收回调方获取。 构造自定义参数的方法和callback参数的方法是一样的,也是以json格式来传递。该json字符串就是一个包含所有自定义参数的Key-Value的Map。 说明 用户自定义参数的Key一定要以x:开头,且必须为小写。否则OSS会返回错误。 假定用户需要设定两个自定义的参数分别为x:var1和x:var2,对应的值分别为value1和value2,那么构造出来的json格式如下: { 'x:var1':'value1', 'x:var2':'value2' } 构造回调请求 构造完成上述的callback和callback-var两个参数之后,一共有三种方式传给OSS。其中callback为必填参数,callback-var为可选参数,如果没有自定义参数的话可以不用添加callback-var字段。这三种方式如下: 在URL中携带参数。 在Header中携带参数。 在POST请求的body中使用表单域来携带参数。 说明 在使用POST请求上传Object的时候只能使用这种方式来指定回调参数。 这三种方式只能同时使用其中一种,否则OSS会返回InvalidArgument错误。 要将参数附加到OSS的请求中,首先要将上文构造的json字符串使用base64编码,然后按照如下的方法附加到OSS的请求中: 如果在URL中携带参数。把callback=[CallBack]或者callback-var=[CallBackVar]作为一个url参数带入请求发送。计算签名CanonicalizedResource时 ,将callback或者callback-var当做一个sub-resource计算在内 如果在Header中携带参数。把x-oss-callback=[CallBack]或者x-oss-callback-var=[CallBackVar]作为一个head带入请求发送。在计算签名CanonicalizedOSSHeaders时,将x-oss-callback-var和x-oss-callback计算在内。如下示例:PUT /test.txt HTTP/1.1 Host: callback-test.oss-test.aliyun-inc.com Accept-ncoding: identity Content-Length: 5 x-oss-callback-var: eyJ4Om15X3ZhciI6ImZvci1jYWxsYmFjay10ZXN0In0= User-Agent: aliyun-sdk-python/0.4.0 (Linux/2.6.32-220.23.2.ali1089.el5.x86_64/x86_64;2.5.4) x-oss-callback: eyJjYWxsYmFja1VybCI6IjEyMS40My4xMTMuODoyMzQ1Ni9pbmRleC5odG1sIiwgICJjYWxsYmFja0JvZHkiOiJidWNrZXQ9JHtidWNrZXR9Jm9iamVjdD0ke29iamVjdH0mZXRhZz0ke2V0YWd9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSZpbWFnZUluZm8uaGVpZ2h0PSR7aW1hZ2VJbmZvLmhlaWdodH0maW1hZ2VJbmZvLndpZHRoPSR7aW1hZ2VJbmZvLndpZHRofSZpbWFnZUluZm8uZm9ybWF0PSR7aW1hZ2VJbmZvLmZvcm1hdH0mbXlfdmFyPSR7eDpteV92YXJ9In0= Host: callback-test.oss-test.aliyun-inc.com Expect: 100-Continue Date: Mon, 14 Sep 2015 12:37:27 GMT Content-Type: text/plain Authorization: OSS mlepou3zr4u7b14:5a74vhd4UXpmyuudV14Kaen5cY4= Test 如果需要在POST上传Object的时候附带回调参数会稍微复杂一点,callback参数要使用独立的表单域来附加,如下面的示例:--9431149156168 Content-Disposition: form-data; name='callback' eyJjYWxsYmFja1VybCI6IjEwLjEwMS4xNjYuMzA6ODA4My9jYWxsYmFjay5waHAiLCJjYWxsYmFja0hvc3QiOiIxMC4xMDEuMTY2LjMwIiwiY2FsbGJhY2tCb2R5IjoiZmlsZW5hbWU9JChmaWxlbmFtZSkmdGFibGU9JHt4OnRhYmxlfSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==如果拥有自定义参数的话,不能直接将callback-var参数直接附加到表单域中,每个自定义的参数都需要使用独立的表单域来附加,举个例子,如果用户的自定义参数的json为{ 'x:var1':'value1', 'x:var2':'value2' }那么POST请求的表单域应该如下:--9431149156168 Content-Disposition: form-data; name='callback' eyJjYWxsYmFja1VybCI6IjEwLjEwMS4xNjYuMzA6ODA4My9jYWxsYmFjay5waHAiLCJjYWxsYmFja0hvc3QiOiIxMC4xMDEuMTY2LjMwIiwiY2FsbGJhY2tCb2R5IjoiZmlsZW5hbWU9JChmaWxlbmFtZSkmdGFibGU9JHt4OnRhYmxlfSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ== --9431149156168 Content-Disposition: form-data; name='x:var1' value1 --9431149156168 Content-Disposition: form-data; name='x:var2' value2同时可以在policy中添加callback条件(如果不添加callback,则不对该参数做上传验证)如:{ 'expiration': '2014-12-01T12:00:00.000Z', 'conditions': [ {'bucket': 'johnsmith' }, {'callback': 'eyJjYWxsYmFja1VybCI6IjEwLjEwMS4xNjYuMzA6ODA4My9jYWxsYmFjay5waHAiLCJjYWxsYmFja0hvc3QiOiIxMC4xMDEuMTY2LjMwIiwiY2FsbGJhY2tCb2R5IjoiZmlsZW5hbWU9JChmaWxlbmFtZSkiLCJjYWxsYmFja0JvZHlUeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn0='}, ['starts-with', '$key', 'user/eric/'], ] } 发起回调请求 如果文件上传成功,OSS会根据用户的请求中的callback参数和自定义参数(callback-var参数),将特定内容以POST方式发送给应用服务器。 POST /index.html HTTP/1.0 Host: 121.43.113.8 Connection: close Content-Length: 181 Content-Type: application/x-www-form-urlencoded User-Agent: ehttp-client/0.0.1 bucket=callback-test&object=test.txt&etag=D8E8FCA2DC0F896FD7CB4CB0031BA249&size=5&mimeType=text%2Fplain&imageInfo.height=&imageInfo.width=&imageInfo.format=&x:var1=for-callback-test 返回回调结果 比如应用服务器端返回的回应请求为: HTTP/1.0 200 OK Server: BaseHTTP/0.3 Python/2.7.6 Date: Mon, 14 Sep 2015 12:37:27 GMT Content-Type: application/json Content-Length: 9 {'a':'b'} 返回上传结果 再给客户端的内容为: HTTP/1.1 200 OK Date: Mon, 14 Sep 2015 12:37:27 GMT Content-Type: application/json Content-Length: 9 Connection: keep-alive ETag: 'D8E8FCA2DC0F896FD7CB4CB0031BA249' Server: AliyunOSS x-oss-bucket-version: 1442231779 x-oss-request-id: 55F6BF87207FB30F2640C548 {'a':'b'} 需要注意的是,如果类似CompleteMultipartUpload这样的请求,在返回请求本身body中存在内容(如XMl格式的信息),使用上传回调功能后会覆盖原有的body的内容如{'a':'b'},希望对此处做好判断处理。 回调签名 用户设置callback参数后,OSS将按照用户设置的callbackUrl发送POST回调请求给用户的应用服务器。应用服务器收到回调请求之后,如果希望验证回调请求确实是由OSS发起的话,那么可以通过在回调中带上签名来验证OSS的身份。 生成签名 签名在OSS端发生,采用RSA非对称方式签名,私钥加密的过程为:authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + ‘\n’ + body, md5)) 说明 其中private_key为私钥,只有oss知晓,path为回调请求的资源路径,query_string为查询字符串,body为回调的消息体,所以签名过程由以下几步组成: 获取待签名字符串:资源路径经过url解码后,加上原始的查询字符串,加上一个回车符,加上回调消息体 RSA签名:使用秘钥对待签名字符串进行签名,签名的hash函数为md5 将签名后的结果做base64编码,得到最终的签名,签名放在回调请求的authorization头中 如下例:POST /index.php?id=1&index=2 HTTP/1.0 Host: 121.43.113.8 Connection: close Content-Length: 18 authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA== Content-Type: application/x-www-form-urlencoded User-Agent: ehttp-client/0.0.1 x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ== bucket=yonghu-testpath为/index.php,query_string为?id=1&index=2,body为bucket=yonghu-test,最终签名结果为kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA== 验证签名 验证签名的过程即为签名的逆过程,由应用服务器验证,过程如下:Result = rsa_verify(public_key, md5(url_decode(path) + query_string + ‘\n’ + body), base64_decode(authorization))字段的含义与签名过程中描述相同,其中public_key为公钥, authorization为回调头中的签名,整个验证签名的过程分为以下几步: 回调请求的x-oss-pub-key-url头保存的是公钥的url地址的base64编码,因此需要对其做base64解码后获取到公钥,即public_key = urlopen(base64_decode(x-oss-pub-key-url头的值))这里需要注意,用户需要校验x-oss-pub-key-url头的值必须以http://gosspublic.alicdn.com/或者https://gosspublic.alicdn.com/开头,目的是为了保证这个publickey是由OSS颁发的。 获取base64解码后的签名signature = base64_decode(authorization头的值) 获取待签名字符串,方法与签名一致sign_str = url_decode(path) + query_string + ‘\n’ + body 验证签名result = rsa_verify(public_key, md5(sign_str), signature) 以上例为例: 获取到公钥的url地址,即aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==经过base64解码后得到http://gosspublic.alicdn.com/callback_pub_key_v1.pem 签名头kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA==做base64解码(由于为非打印字符,无法显示出解码后的结果) 获取待签名字符串,即url_decode(“index.php”) + “?id=1&index=2” + “\n” + “bucket=yonghu-test”,并做md5 验证签名 应用服务器示例 以下为一段python示例,演示了一个简单的应用服务器,主要是说明验证签名的方法,此示例需要安装M2Crypto库import httplib import base64 import md5 import urllib2 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer from M2Crypto import RSA from M2Crypto import BIO def get_local_ip(): try: csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) csock.connect(('8.8.8.8', 80)) (addr, port) = csock.getsockname() csock.close() return addr except socket.error: return '' class MyHTTPRequestHandler(BaseHTTPRequestHandler): ''' def log_message(self, format, *args): return ''' def do_POST(self): #get public key pub_key_url = '' try: pub_key_url_base64 = self.headers['x-oss-pub-key-url'] pub_key_url = pub_key_url_base64.decode('base64') if not pub_key_url.startswith('http://gosspublic.alicdn.com/') and not pub_key_url.startswith('https://gosspublic.alicdn.com/'): self.send_response(400) self.end_headers() return url_reader = urllib2.urlopen(pub_key_url) #you can cache it pub_key = url_reader.read() except: print 'pub_key_url : ' + pub_key_url print 'Get pub key failed!' self.send_response(400) self.end_headers() return #get authorization authorization_base64 = self.headers['authorization'] authorization = authorization_base64.decode('base64') #get callback body content_length = self.headers['content-length'] callback_body = self.rfile.read(int(content_length)) #compose authorization string auth_str = '' pos = self.path.find('?') if -1 == pos: auth_str = urllib2.unquote(self.path) + '\n' + callback_body else: auth_str = urllib2.unquote(self.path[0:pos]) + self.path[pos:] + '\n' + callback_body print auth_str #verify authorization auth_md5 = md5.new(auth_str).digest() bio = BIO.MemoryBuffer(pub_key) rsa_pub = RSA.load_pub_key_bio(bio) try: result = rsa_pub.verify(auth_md5, authorization, 'md5') except: result = False if not result: print 'Authorization verify failed!' print 'Public key : %s' % (pub_key) print 'Auth string : %s' % (auth_str) self.send_response(400) self.end_headers() return #do something accoding to callback_body #response to OSS resp_body = '{'Status':'OK'}' self.send_response(200) self.send_header('Content-Type', 'application/json') self.send_header('Content-Length', str(len(resp_body))) self.end_headers() self.wfile.write(resp_body) class MyHTTPServer(HTTPServer): def __init__(self, host, port): HTTPServer.__init__(self, (host, port), MyHTTPRequestHandler) if '__main__' == __name__: server_ip = get_local_ip() server_port = 23451 server = MyHTTPServer(server_ip, server_port) server.serve_forever()其它语言实现的应用服务器如下: Java版本: 下载地址:点击这里 运行方法:解压包运行java -jar oss-callback-server-demo.jar 9000(9000就运行的端口,可以自己指定) PHP版本: 下载地址:点击这里 运行方法:部署到Apache环境下,因为PHP本身语言的特点,取一些数据头部会依赖于环境。所以可以参考例子根据所在环境修改。 Python版本: 下载地址:点击这里 运行方法:解压包直接运行python callback_app_server.py,运行该程序需要安装rsa的依赖。 C#版本: 下载地址:点击这里 运行方法:解压后参看 README.md。 Go版本: 下载地址:点击这里 运行方法:解压后参看 README.md。 Go版本: 下载地址:点击这里 运行方法:解压后参看 README.md。 Ruby版本: 下载地址:点击这里 运行方法: ruby aliyun_oss_callback_server.rb 特别须知 如果传入的callback或者callback-var不合法,则会返回400错误,错误码为”InvalidArgument”,不合法的情况包括以下几类: PutObject()和CompleteMultipartUpload()接口中url和header同时传入callback(x-oss-callback)或者callback-var(x-oss-callback-var)参数 callback或者callback-var(PostObject()由于没有callback-var参数,因此没有此限制,下同)参数过长(超过5KB) callback或者callback-var没有经过base64编码 callback或者callback-var经过base64解码后不是合法的json格式 callback参数解析后callbackUrl字段包含的url超过限制(5个),或者url中传入的port不合法,比如{'callbackUrl':'10.101.166.30:test', 'callbackBody':'test'} callback参数解析后callbackBody字段为空 callback参数解析后callbackBodyType字段的值不是”application/x-www-form-urlencoded”或者”application/json” callback参数解析后callbackBody字段中变量的格式不合法,合法的格式为${var} callback-var参数解析后不是预期的json格式,预期的格式应该为{'x:var1':'value1','x:var2':'value2'...} 如果回调失败,则返回203,错误码为”CallbackFailed”,回调失败只是表示OSS没有收到预期的回调响应,不代表应用服务器没有收到回调请求(比如应用服务器返回的内容不是json格式),另外,此时文件已经成功上传到了OSS 应用服务器返回OSS的响应必须带有Content-Length的Header,Body大小不要超过1MB。 Callback支持的地域 Callback目前支持的地域如下:华北 2(北京)、华东 1(杭州)、华北 1(青岛)、华东 2(上海)、上海金融云、华南 1(深圳)、香港、华北 5(呼和浩特)、华北 3(张家口)、中东东部 1(迪拜)、亚太东北 1(日本)、欧洲中部 1(法兰克福)、亚太东南 1(新加坡)、美国东部 1(弗吉尼亚)、美国西部 1(硅谷)、亚太东南 2 (悉尼)以及亚太东南 3(吉隆坡)。
    踩1 评论0
  • 回答了问题 2018-04-22

    RDS变更实例规格请求参数

    详细解答可以参考官方帮助文档 描述 该接口用于对按时付费实例的规格或者存储空间变更配置,使用该接口时必须满足如下条件,否则实例规格会变更失败: 实例状态为运行中 实例当前无正在运行的备份 请求参数中必须至少指定实例规格(DBInstanceClass)或存储空间(DBInstanceStorage)。 若降低磁盘空间配置,输入的磁盘空间不能小于实际使用空间大小的1.1倍。 当前只支持对常规实例和只读实例变更配置,不支持灾备实例和临时实例。 请求参数 名称 类型 是否必须 描述 Action String 是 系统规定参数,取值为ModifyDBInstanceSpec。 DBInstanceId String 是 待升降级的实例。 PayType String 是 计费方式,取值为Postpaid,按时付费。 DBInstanceClass String 否 实例规格,详见实例规格表。 DBInstanceStorage Integer 否 自定义存储空间,取值范围如下且取值必须为5的整数倍: MySQL为[5,2000] SQL Server为[10,2000] PostgreSQL和PPAS为[5,2000] 返回参数 名称 类型 描述 - 详见公共参数。 请求示例 https://rds.aliyuncs.com/?Action=ModifyDBInstanceSpec &DBInstanceId=rdsaiiabnaiiabn &PayType=Postpaid &DBInstanceStorage=10 & 返回示例 XML格式 3C5CFDEE-F774-4DED-89A2-1D76EC63C575 JSON格式 { 'RequestId': ' 3C5CFDEE-F774-4DED-89A2-1D76EC63C575 ' }
    踩1 评论0
  • 回答了问题 2018-04-17

    企业邮箱解析为生效 , 我的企业邮箱全段时间我看状态还是已生效 今天上来看 就变成为生效

    详细解答可以参考官方帮助文档问题场景:企业邮箱成功开通后,邮箱域名已经设置解析【企业邮箱域名解析设置方法】,但是在会员中心 > 产品管理 > 企业邮箱 > 邮箱管理 基本信息页面查看到解析状态显示 解析未生效 。 原因分析:由于域名解析设置后,会经由邮箱系统对域名mx解析进行验证,该验证为定时验证,若验证任务未完成,会显示为“解析未生效”。 解决方案:为在上图中单击 检查域名解析 按钮,一般情况下5-10分钟即可成功通过验证、状态变更为 域名解析已生效 后,即可进行邮件收发。 注: 请留意,如您绑定邮箱域名使用的为,或者这类二级域名,需对此二级域名设置对应邮箱解析后, 状态才会自动刷新显示为解析已生效,届时邮箱域后缀为或; 如需使用邮箱域后缀 为,请绑定邮箱业务使用域名为,即顶级域名,再按照上述说明设置解析验证生效状态。 如果问题还未能解决,请联系售后技术支持。
    踩1 评论0
  • 回答了问题 2018-04-03

    添加CDN后如何设置源站开启gzip呢?

    详细解答可以参考官方帮助文档 如果在使用CDN服务时,出现了回源流量大于访问流的情况,如下图:这类问题一般是由于源站没有开启Gzip压缩,但是CDN开启了Gzip压缩导致的。对于文本等类型的内容,Gzip的压缩比较高,所以如果源站没有开启Gzip压缩,但是客户访问CDN时,CDN进行了Gzip压缩,就可能会出现CDN回源带宽比访问带宽还高的情况,所以建议在源站上开启Gzip功能。此外,由于使用CDN时,会添加一些CDN必须使用的header信息,比如Via的header等等,有时源站已经设置了Gzip,如下图:但是当在请求中带有Via的header时,源站可能会无法正确的响应Gzip,如下图:如果是这种情况,建议在源站设置一下全部开启Gzip的规则。以nginx为例,可以进行如下设置:      gzip_proxied            any;  其它的web服务,请参考进行类似的修改。如果问题还未能解决,请联系售后技术支持。
    踩1 评论0
  • 提交了问题 2018-02-10

    云虚拟主机访问显示“非常抱歉该页面暂时无法访问”

  • 回答了问题 2018-01-16

    提示备案号被收回,还能找回备案号吗?

    详细解答可以参考官方帮助文档 备案号一经注销,便不可恢复,且网站无法访问。建议尽快重新提交域名备案,待管局审核完成后,网站便可重新开通访问。
    踩1 评论0
  • 提交了问题 2018-01-13

    在哪里注销备案主体信息

正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息