云服务器内容精选

  • 操作步骤 5G消息功能目前仅面向华为云企业用户,需要先参考企业账号如何完成实名认证中操作,完成企业账号实名认证。 申请使用5G消息。 使用企业账号登录5G消息产品页,单击“公测体验”,进入5G消息控制台。 单击“立即申请”,申请使用5G消息功能。 企业用户按照界面提供的模板填写申请信息,申请通过后会收到邮件,邮件中包含服务号信息。 若5G消息中包含多媒体文件,华为云企业用户需要进行ITA注册,申请视频短信签名,购买视频短信服务,申请视频短信模板。 企业用户需要提供如下信息给ITA工程师,ITA工程师在ITA管理台配置后,企业用户才可使用5G消息功能。 视频短信模板审核通知回调地址:https://appcuberun.cn-north-4.huaweicloud.com/fgsms/v1/vms/template-audit-notice 视频短信状态报告回调地址:https://appcuberun.cn-north-4.huaweicloud.com/fgsms/v1/vms/status-report-notice 5G消息上行地址:https://appcuberun.cn-north-4.huaweicloud.com/fgsms/v1/smschannel/{chatbotid}/inbound 5G消息状态通知地址:https://appcuberun.cn-north-4.huaweicloud.com/fgsms/v1/smschannel/{chatbotid}/deliveryinfonotification 5G消息撤销状态通知地址:https://appcuberun.cn-north-4.huaweicloud.com/fgsms/v1/smschannel/{chatbotid}/revokemessagestatusnotification 5G消息媒体审核通知地址:https://appcuberun.cn-north-4.huaweicloud.com/fgsms/v1/vms/{chatbotid}/audit-notification。由于5G消息中多媒体文件需要送审,运营商审核通过后,企业用户才可使用多媒体文件。审核结果,会下发到企业用户。在这之前,华为云企业用户需要将AstroZero的如下回调地址提供给ITA工程师,ITA工程师在ITA管理台配置后,审核结果才会自动下发到企业用户。 其中,“{chatbotid}”为ChatBotID,企业用户参考1中操作,登录AstroZero运行环境,打开5G消息应用,在浏览器网址中可获取到该值。 图1 获取ChatBotID 使用企业账号开通Astro轻应用服务。 在Astro轻应用运行环境,可以创建并开发5G消息应用。一个5G消息应用对应一个ChatBot服务号。您可以在5G消息应用中开发5G消息内容、编排ChatBot服务号中的智能对话。
  • 创建镜像仓库 用平台管理员账号登录Octopus平台。 在左侧菜单栏中,单击“镜像仓库 ”。 单击“新建”,填写基本信息。 图1 创建镜像仓库 名称:输入镜像仓库的名称,只能包含数字、英文、中文、下划线、中划线。 用途:根据需求,下拉框选择用途。 描述:简单描述镜像仓库,最大长度为255。 使用范围:仅支持团队,即租户内所有配置了该镜像相关权限的用户都可见可编辑。 单击“确定”,在镜像仓库列表即可查看新建的镜像仓库。
  • 准备工作 如果您已有一个华为账号,请忽略此步骤。如果您还没有华为账号,请参考以下步骤创建。 打开华为云官网,单击“注册”。 根据提示信息完成注册,详细操作请参见“ 注册华为账号 并开通华为云”。 注册成功后,系统会自动跳转至您的个人信息界面。 参考个人账号如何完成实名认证或企业账号如何完成实名认证,完成个人或企业账号实名认证。 为账号充值。 配置审计 服务本身为免费服务,但使用资源记录器时资源转储OBS桶和 消息通知 SMN主题至少需要配置一个,因此资源记录器使用的消息通知服务( SMN )或 对象存储服务 (OBS)可能会产生相应的费用,具体请参见SMN计费说明和OBS计费说明。 您需要确保账号有足够的余额,避免因账号余额不足或欠费导致资源记录器的相关功能无法使用,从而影响Config的其他功能也无法使用。如何充值请参见账户充值。 开启并配置资源记录器。 资源清单中的资源数据依赖于资源记录器所收集的资源数据,因此必须保持资源记录器的开启状态。
  • 操作场景 本章节指导您如何通过Config的资源清单页面查看和筛选您账号下的资源,便于您了解拥有的资源及其所在区域、资源状态等信息。 资源清单中的资源数据依赖于资源记录器所收集的资源数据,如果相关资源无法在资源清单页面查询到,请确认资源记录器是否开启,或该资源类型是否被资源记录器收集资源数据,或Config暂不支持该服务或资源类型。 资源数据同步到Config存在延迟,因此资源发生变化时不会实时更新“资源清单”中的数据。对于已开启资源记录器的用户,Config会在24小时内校正资源数据。
  • 操作步骤 登录管理控制台。 单击页面左上角的图标,在弹出的服务列表中,选择“管理与监管”下的“配置审计 Config”,进入“资源清单”页面。 “资源清单”页面默认展示在资源记录器配置的监控范围内且您拥有的资源信息。 通过选择服务、资源类型和区域来筛选资源,其中全局级服务无需选择区域。 在页面中部的搜索框中通过多种筛选条件进行更精细的资源筛选。 筛选条件 说明 名称 资源名称支持模糊搜索,并且忽略大小写。 资源ID 资源ID支持模糊搜索,但不忽略大小写。 资源状态 通过资源状态对资源进行筛选。 资源状态分为以下两种: 保有中:资源正常使用中。 已删除:资源已删除。 标签 直接在搜索框列表中选择一个标签键,然后再选择此标签键相关的一个标签值或所有标签值,资源列表将自动筛选并展示此标签关联的资源。 企业项目 通过企业项目筛选框选择企业项目,资源列表将自动筛选并展示此企业项目下的资源。 说明: 根据企业项目筛选资源的功能必须要先开通企业项目才可以使用,因此该筛选条件并非对每个用户可见。
  • 入门实践 当您购买并连接了GeminiDB Redis数据库实例后,可以根据自身的业务需求使用GeminiDB Redis提供的一系列常用实践。 表1 常用最佳实践 实践 描述 数据迁移 阿里云数据库Redis/Tair到GeminiDB Redis的迁移 本实践主要介绍阿里云数据库Redis/Tair到GeminiDB Redis的迁移方案。使用阿里云的数据迁移工具DTS中的数据迁移功能,该功能支持将阿里云Redis服务的数据迁移至其他Redis服务中,利用该工具避开阿里云 Redis服务屏蔽sync和psync命令限制,实现数据从阿里云Redis服务迁移至华为云GeminiDB Redis中。 腾讯云Redis到GeminiDB Redis的迁移 本实践主要介绍腾讯云Redis到GeminiDB Redis的迁移方案。使用腾讯云的数据迁移工具DTS中的数据同步功能,该功能支持将腾讯云 Redis服务的数据迁移至E CS 自建Redis中,利用该工具避开腾讯云 Redis服务屏蔽分片实际IP,实现数据从腾讯云 Redis服务迁移至华为云GeminiDB Redis中。 自建Redis到GeminiDB Redis的迁移 本实践主要介绍自建Redis到GeminiDB Redis的迁移方案。使用Redis-Shake迁移工具进行源端Redis到目标端GeminiDB Redis的迁移。迁移过程支持全量+增量迁移,支持单机/主从/Cluster集群/RDB文件等多种Redis数据源。 RDB文件恢复到GeminiDB Redis(推荐) 本实践主要介绍RDB到GeminiDB Redis的迁移方案。使用Redis-Shake迁移工具进行源端RDB到目标端GeminiDB Redis的迁移。迁移过程支持全量+增量迁移。 Kvrocks到GeminiDB Redis的迁移 本实践主要介绍Kvrocks到GeminiDB Redis的迁移方案。使用开源工具kvrocks2redis进行Kvrocks到GeminiDB Redis的迁移,在此基础上,从GeminiDB Redis源码层面对Kvrocks的namespace功能进行适配。 Pika到GeminiDB Redis的迁移 本实践主要介绍Pika到GeminiDB Redis的迁移方案。pika-port伪装成Pika的从节点运行,通过主从复制的方式进行数据迁移。Pika主节点通过比较pika-port和自己的binlog偏移量判断做全量迁移还是增量迁移。如果需要做全量迁移,Pika主节点会将全量数据快照发送给pika-port,pika-port将解析后的快照数据发送给GeminiDB Redis。全量迁移结束后进入增量迁移,pika-port将增量数据解析后以redis命令的形式发送给GeminiDB Redis。 SSDB到GeminiDB Redis的迁移 本实践主要介绍SSDB到GeminiDB Redis的迁移方案。ssdb-port作为源端SSDB数据库的主节点的从节点(replica)运行,通过主从复制的方式进行数据迁移。将获取到的数据解析、转换为Redis支持的格式,并发送到配置文件中指定的Redis实例。全量同步完成后,SSDB中新增的数据也会同步到Redis实例中。 LevelDB到GeminiDB Redis的迁移 本实践主要介绍LevelDB到GeminiDB Redis的迁移方案。使用自研迁移工具leveldb-port,和LevelDB部署在相同机器上,准备好配置文件,启动迁移即可自动完成全量与增量的迁移。 RocksDB到GeminiDB Redis的迁移 本实践主要介绍RocksDB到GeminiDB Redis的迁移方案。使用自研迁移工具rocksdb-port,和RocksDB部署在相同机器上,准备好配置文件,启动迁移即可自动完成全量与增量的迁移。 AWS ElasticCache for Redis数据库到GeminiDB Redis的迁移 本实践主要介绍AWS ElasticCache for Redis到GeminiDB Redis的迁移方案。AWS ElasticCache for Redis通过备份导出RDB文件后,通过Redis-Shake迁移工具的数据恢复(restore)将数据迁移到GeminiDB Redis。 数据备份 管理自动备份 介绍如何在数据库实例的备份时段中创建数据库实例的自动备份,系统根据您指定的备份保留期保存数据库实例的自动备份。 管理手动备份 介绍如何为数据库实例手动备份数据,用户可以通过手动备份恢复数据,从而保证数据可靠性。 数据恢复 恢复备份到新实例 介绍如何使用已有的自动备份或手动备份恢复实例数据到新建实例,恢复后的数据与该备份生成时的实例数据一致。 日志管理 慢日志 GeminiDB Redis支持查看数据库级别的慢日志,执行时间的单位为ms。通过该日志,可查找出执行效率低的语句,以便优化。 父主题: 快速入门
  • 入门实践 当您购买并连接了GeminiDB Cassandra数据库实例后,可以根据自身的业务需求使用GeminiDB Cassandra提供的一系列常用实践。 表1 常用最佳实践 实践 描述 数据库规范 基本设计规范 介绍GeminiDB Cassandra的基本设计规范。 数据库对象使用规范 介绍数据库对象的使用规范。 数据库使用约束规范 介绍数据库的使用约束规范。 查询规范 介绍GeminiDB Cassandra的查询规范。 变更实例 修改实例名称 GeminiDB Cassandra支持修改数据库实例名称,以方便您区分和识别实例。 重置管理员密码 GeminiDB Cassandra支持重置数据库管理员密码,建议您定期修改密码,以提高系统安全性,防止出现密码被破解等安全风险。 变更实例的CPU和内存规格 当用户购买的实例的CPU和内存规格无法满足业务需要时,可以在控制台进行CPU和内存规格变更。 数据备份 管理自动备份 介绍如何在数据库实例的备份时段中创建数据库实例的自动备份,系统根据您指定的备份保留期保存数据库实例的自动备份。 管理手动备份 介绍如何为数据库实例手动备份数据,用户可以通过手动备份恢复数据,从而保证数据可靠性。 设置跨区域备份策略 介绍如何为数据库实例设置跨区域备份策略,用户可以在异地区域使用目标区域的备份文件恢复到新的GeminiDB Cassandra实例,用来恢复业务。 创建库表级备份 介绍如何为数据库实例创建库表级备份,当数据库或表被恶意或误删除,可依赖实例的备份保障数据安全。 数据恢复 恢复备份到新实例 介绍如何使用已有的自动备份或手动备份恢复实例数据到新建实例,恢复后的数据与该备份生成时的实例数据一致。 恢复备份到指定时间点 介绍如何使用已有的自动备份,恢复实例数据到指定时间点。 日志管理 慢日志 GeminiDB Cassandra支持查看数据库级别的慢日志,执行时间的单位为ms。通过该日志,可查找出执行效率低的语句,以便优化。 父主题: 快速入门
  • 入门实践 当您购买并连接了GeminiDB Influx数据库实例后,可以根据自身的业务需求使用GeminiDB Influx提供的一系列常用实践。 表1 常用最佳实践 实践 描述 使用规范 使用规范和建议 从命名、TAG、FIELD、查询等方面介绍GeminiDB Influx使用上的一些规范和建议,用于解决常见的使用错误,低效,难以维护等问题。 解决方案 运维平台数据库解决方案 该解决方案帮助用户快速在华为云上部署数据库运维监控系统Prometheus,用户可以通过部署界面完成参数配置,完成GeminiDB Influx和弹性云服务ECS资源的创建及监控业务的配置。 变更实例 修改实例名称 GeminiDB Influx支持修改数据库实例名称,以方便您区分和识别实例。 重置管理员密码 GeminiDB Influx支持重置数据库管理员密码,建议您定期修改密码,以提高系统安全性,防止出现密码被破解等安全风险。 变更实例的CPU和内存规格 当用户购买的实例的CPU和内存规格无法满足业务需要时,可以在控制台进行CPU和内存规格变更。 数据备份 管理自动备份 介绍如何在数据库实例的备份时段中创建数据库实例的自动备份,系统根据您指定的备份保留期保存数据库实例的自动备份。 管理手动备份 介绍如何为数据库实例手动备份数据,用户可以通过手动备份恢复数据,从而保证数据可靠性。 数据恢复 恢复备份到新实例 介绍如何使用已有的自动备份或手动备份恢复实例数据到新建实例,恢复后的数据与该备份生成时的实例数据一致。 父主题: 快速入门
  • 共享Bundle Id相关说明 ScreenShareExtension插件bundle Id格式: 主App bundle Id + ScreenShareExtension ScreenShareExtensionSetupUI插件bundle Id格式: 主App bundle Id + ScreenShareExtensionSetupUI 例: 主App bundle Id:com.xx.xx ScreenShareExtension插件bundIe Id:com.xx.xx.ScreenShareExtension ScreenShareExtensionSetupUI插件bundIe Id:com.xx.xx.ScreenShareExtensionSetupUI iOS端屏幕共享需要添加iOS Extension并实现相关代码,以下步骤用于说明如何集成SDK进行屏幕共享Extension的开发。
  • OBS服务环境搭建 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 注册云服务账号 使用OBS之前必须要有一个云服务账号。 打开浏览器。 登录公有云网站www.huaweicloud.com。 在页面右上角单击“注册”。 按需填写注册信息并单击“同意协议并注册”。 开通OBS服务 使用OBS服务之前必须先充值,才能正常使用OBS服务。 登录OBS管理控制台。 单击页面右上角的“费用与成本”,单击左侧资金管理。 单击“充值”,系统自动跳转到充值窗口。 根据界面提示信息,对账户进行充值。 充值成功后,关闭充值窗口,返回管理控制台首页。 单击“对象存储服务”,开通并进入OBS管理控制台。 创建访问密钥 OBS通过用户账号中的AK和SK进行签名验证,确保通过授权的账号才能访问指定的OBS资源。以下是对AK和SK的解释说明: AK:Access Key ID,接入键标识,用户在对象存储服务系统中的接入键标识,一个接入键标识唯一对应一个用户,一个用户可以同时拥有多个接入键标识。对象存储服务系统通过接入键标识识别访问系统的用户。 SK:Secret Access Key,安全接入键,用户在对象存储服务系统中的安全接入键,是用户访问对象存储服务系统的密钥,用户根据安全接入键和请求头域生成鉴权信息。安全接入键和接入键标识一一对应。 创建访问密钥的操作步骤如下: 登录OBS控制台。 单击页面右上角的用户名,并选择“我的凭证”。 在“我的凭证”页面,单击左侧导航栏的“访问密钥”。 在“访问密钥”页面,单击“新增访问密钥”。 在弹出的“新增访问密钥”对话框中,输入登录密码和对应验证码。 用户如果未绑定邮箱和手机,则只需输入登录密码。 用户如果同时绑定了邮箱和手机,可以选择其中一种方式进行验证。 单击“确定”。 在弹出的“下载确认”提示框中,单击“确定”后,密钥会直接保存到浏览器默认的下载文件夹中。 打开下载下来的“credentials.csv”文件即可获取到访问密钥(AK和SK)。 每个用户最多可创建两个有效的访问密钥。 为防止访问密钥泄露,建议您将其保存到安全的位置。如果用户在此提示框中单击“取消”,则不会下载密钥,后续也将无法重新下载。如果需要使用访问密钥,可以重新创建新的访问密钥。 父主题: 快速入门
  • 使用前需知 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 请确认您已经熟悉OBS的基本概念,如桶(Bucket)、对象(Object)、访问密钥(AK和SK)等。 您可以先参考OBS客户端通用示例,了解OBS Android SDK接口调用的通用方式。 使用OBS客户端进行接口调用操作完成后,没有异常抛出,则表明返回值有效;如果抛出异常,则说明操作失败,此时应可SDK自定义异常实例中获取错误信息。 使用OBS客户端进行接口调用成功后,均会返回包含响应头信息的SDK公共响应头实例(或其子类实例)。 当前各区域特性开放不一致,部分特性只在部分区域开放,使用过程中如果接口HTTP状态码为405,请确认该区域是否支持该功能特性。 父主题: 快速入门
  • 配置桶允许跨域请求 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 要使用OBS BrowserJS SDK访问OBS服务的桶,必须配置该桶允许跨域请求(桶的CORS),推荐为桶的CORS配置的规则如下: 配置项 配置值 说明 AllowedOrigin * 允许任意请求来源。 说明: 也可以配置具体的 域名 或IP。 AllowedMethod PUT、GET、POST、DELETE、HEAD 允许所有的HTTP方法。 AllowedHeader * 允许请求中携带任意头域。 ExposeHeader ETag x-obs-request-id x-obs-api Content-Type Content-Length Cache-Control Content-Disposition Content-Encoding Content-Language Expires x-obs-id-2 x-reserved-indicator x-obs-version-id x-obs-copy-source-version-id x-obs-storage-class x-obs-delete-marker x-obs-expiration x-obs-website-redirect-location x-obs-restore x-obs-version x-obs-object-type x-obs-next-append-position 允许响应中返回指定的附加头域。 须知: 附加头域:指定浏览器可以暴露给客户端的响应消息头。 比如在浏览器环境中,需要获取ETag值,由于ETag不属于标准响应头,就需要添加到扩展头域。 您可以从这里参考各客户端工具配置CORS的详细步骤。 父主题: 快速入门
  • 使用npm命令下载安装 运行npm -v命令查看npm版本并确保npm已安装。 运行npm install esdk-obs-browserjs命令执行安装。 如果您使用的是Windows操作系统,当运行npm命令时提示“不是内部或外部命令”,请在Path环境变量中增加npm的安装目录(一般为Node.js的安装目录)。 您可能需要重启电脑使环境变量生效。 如果您使用npm安装依赖时出现网络错误,请使用代理。
  • 购买须知 第一次使用公有云服务时,系统将自动为您创建一个虚拟私有云,包括安全组、网卡。同时,用户可根据需要自行创建一个虚拟私有云,更多关于虚拟私有云的信息,请参考《虚拟私有云用户指南》。 用户可使用系统自动创建的安全组,也可以根据需要自行创建一个安全组使用,安全组规则的配置会影响弹性云服务器的正常访问与使用。 为确保集群能正常创建/部署,需保证安全组规则22端口开放。具体配置方法请参见:为安全组添加安全组规则 一站式HPC服务使用弹性文件服务SFS作为文件共享存储,更多关于弹性文件系统的信息,请参见《弹性文件服务用户指南》。
  • 获取cn-north-4区域的桶列表 示例中使用通用的Apache Http Client。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 package com.obsclient; import java.io.*; import java.util.ArrayList; import java.util.List; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.InputStreamEntity; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; public class TestMain { /* 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。*/ public static String accessKey = System.getenv("HUAWEICLOUD_SDK_AK"); //取值为获取的AK public static String securityKey = System.getenv("HUAWEICLOUD_SDK_SK"); //取值为获取的SK public static void main(String[] str) { listAllMyBuckets(); } private static void listAllMyBuckets() { CloseableHttpClient httpClient = HttpClients.createDefault(); String requesttime = DateUtils.formatDate(System.currentTimeMillis()); HttpGet httpGet = new HttpGet("http://obs.cn-north-4.myhuaweicloud.com"); httpGet.addHeader("Date", requesttime); /** 根据请求计算签名**/ String contentMD5 = ""; String contentType = ""; String canonicalizedHeaders = ""; String canonicalizedResource = "/"; // Content-MD5 、Content-Type 没有直接换行, data格式为RFC 1123,和请求中的时间一致 String canonicalString = "GET" + "\n" + contentMD5 + "\n" + contentType + "\n" + requesttime + "\n" + canonicalizedHeaders + canonicalizedResource; System.out.println("StringToSign:[" + canonicalString + "]"); String signature = null; try { signature = Signature.signWithHmacSha1(securityKey, canonicalString); // 增加签名头域 Authorization: OBS AccessKeyID:signature httpGet.addHeader("Authorization", "OBS " + accessKey + ":" + signature); CloseableHttpResponse httpResponse = httpClient.execute(httpGet); // 打印发送请求信息和收到的响应消息 System.out.println("Request Message:"); System.out.println(httpGet.getRequestLine()); for (Header header : httpGet.getAllHeaders()) { System.out.println(header.getName() + ":" + header.getValue()); } System.out.println("Response Message:"); System.out.println(httpResponse.getStatusLine()); for (Header header : httpResponse.getAllHeaders()) { System.out.println(header.getName() + ":" + header.getValue()); } BufferedReader reader = new BufferedReader(new InputStreamReader( httpResponse.getEntity().getContent())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = reader.readLine()) != null) { response.append(inputLine); } reader.close(); // print result System.out.println(response.toString()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } } 其中Date头域DateUtils的格式为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.obsclient; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Locale; import java.util.TimeZone; public class DateUtils { public static String formatDate(long time) { DateFormat serverDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH); serverDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); return serverDateFormat.format(time); } } 签名字符串Signature的计算方法为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.obsclient; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import java.security.InvalidKeyException; import java.util.Base64; public class Signature { public static String signWithHmacSha1(String sk, String canonicalString) throws UnsupportedEncodingException { try { SecretKeySpec signingKey = new SecretKeySpec(sk.getBytes("UTF-8"), "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); mac.init(signingKey); return Base64.getEncoder().encodeToString(mac.doFinal(canonicalString.getBytes("UTF-8"))); } catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) { e.printStackTrace(); } return null; } }