-
DuerOS开放平台
-
技能开放平台
-
自定义技能
- 自定义技能简介
- 自定义技能创建
-
有屏技能
-
技能交互模型
-
自定义技能协议
- 处理DuerOS发送的请求
-
技能部署
-
技能开发样例
- 账户关联
-
技能测试
-
技能发布
-
技能付费
-
个性化服务
-
内容播报技能
-
小技能
-
平台能力扩展
-
SDK
-
预览版功能
- 全双工(Preview)
-
APP技能(Preview)
-
-
智能家居开放平台
- 品牌使用规范
-
开发者服务条款
技能与DuerOS通信过程中,双方都需要对接收到的请求信息进行认证,避免接收到恶意攻击者发来的请求,保证通信内容安全。
当DuerOS发送请求给技能时,技能需要回复DuerOS的请求。此时技能需要满足以下要求。
- 允许DuerOS访问技能部署的地址。
推荐使用百度云进行部署。百度云支持以下三种部署方式。- 通过百度云BAE部署,部署地址是https://cloud.baidu.com/doc/BAE/index.html。
- 通过百度云CCE部署,部署地址是https://cloud.baidu.com/doc/CCE/index.html。
- 通过百度云BCC部署,部署地址是https://cloud.baidu.com/doc/BCC/index.html。
- 技能必须使用HTTPS进行通信,以保证通信内容的安全。
- 技能必须对DuerOS的请求进行验证,避免恶意攻击者伪装成DuerOS向技能发送请求时。具体验证细节请参考验证签名过程。
当DuerOS向技能发送请求时,技能需要对发来的请求进行验证,验证过程如下。
- 从http head的signaturecerturl地址里面下载权威签名证书,然后从签名证书中获取公钥。地址signaturecerturl的格式为
协议
+域名
+url地址
+文件名
,其中协议
、域名
、url地址
是固定不变的。如https://duer.bdstatic.com/saiya/flow/dueros-api.baidu.com.cer.txt是一个signaturecerturl地址,可以从该地址下载一个PEM-encoded X.509的权威签名证书。在获取签名证书的过程中需要验证如下几项。- 协议必须是
https
。 - 域名必须是
duer.bdstatic.com
,大小写严格匹配。 - url必须以
saiya/flow/
开始,大小写严格匹配。 - 端口必须是443。
- 权威签名证书中的Subject Alternative Names(SANs)的值必须是
dueros-api.baidu.com
。
- 协议必须是
- 从http head中获取signature信息,并用base64解码signature得到str1。
- 通过公钥和str1解密得到sign1。如果解密成功,继续验证。如果解密失败则拒绝请求。
- 使用sha1计算消息body的内容得到sign2,并与sign1进行比较,如果一致则继续验证,如果不一致,则拒绝请求。
- 比较request请求消息中的timestamp字段与系统当前的时间,如果两者差值小于180秒,则认为当前请求合法,对请求进行处理。如果两者差值大于等于180秒,则拒绝请求。
下图展示了DuerOS生成签名过程和技能验证签名的过程。验证过程中的2-4步可以使用rsa_verify函数代替。
技能主动请求DuerOS时,DuerOS和技能需要满足如下条件。
- 技能需要使用RSA方法生成公钥和私钥,并将公钥上传到DBP平台。
- 技能需要按如下步骤生成签名,并将签名发送给DuerOS。
- 首先,对消息的body进行base64位加密得到str1。
- 其次,获取技能的botId和消息的时间戳timestamp。
- 再次,将str1、botId、timestamp、debug(或online)四个字符串按顺序连接成字符串str2。技能未上线时,使用字符串debug,技能上线后使用字符串online。
- 最后,将私钥和str2进行加密生成签名signature。
- DuerOS需要验证技能发送的请求,当恶意攻击者篡改技能发送的请求内容,DuerOS能够识别,不被欺骗。
当DuerOS收到技能发送的请求时,需要对技能发来的请求进行验证,验证步骤如下。
- 从http head中获取signature,并进行base64位解密获得str1。
- 从DBP平台上获取技能的公钥,并将公钥与str1通过解密获得sign1,如果解密失败则拒绝请求。
- 将body、botId、timestamp三个字符串按顺序连接成str2,并对str2生成摘要sign2,比较sign1与sign2是否相同,如果不同则决绝请求,如果相同,则继续验证。
- 比较请求消息中的timestamp字段与系统当前时间,如果两者差值小于180秒,则认为请求合法,对请求进行处理。如果两者差值大于等于180秒,则拒绝请求。
下图展示了技能生成签名过程和DuerOS验证签名的过程。DuerOS验证签名过程中的2-3步可以使用rsa_verify函数代替。
RSA方法生成的公钥和私钥是成对出现的,在DuerOS与技能通信过程中起着重要的作用。下面介绍RSA生成公钥和私钥的过程。
首先介绍OpenSSL安装。
-
Windows安装 下载OpenSSL并安装OpenSSL,下载地址是http://slproweb.com/products/Win32OpenSSL.html,安装后配置Windows环境变量。
- Linux用户可以使用系统自带的OpenSSL。
- MacOS用户可以使用系统自带的OpenSSL。
执行下面命令生成1024位私钥rsa_private_key.pem。
genrsa -out rsa_private_key.pem 1024
生成私钥的内容如下。
----BEGIN RSA PRIVATE KEY-----
YOUR_RSA_PRIVATE_KEY
-----END RSA PRIVATE KEY-----
执行下面的命令生成rsa_private_key.pem对应的公钥rsa_public_key.pem。
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
生成的公钥内容如下。
----BEGIN PUBLIC KEY-----
YOUR_PUBLIC_KEY
-----END PUBLIC KEY-----