赞
踩
摘要:要实现对基于阿里云物联网平台的设备的控制,就需要调用阿里云的API。这些API不会让我们随意调用,而是有相当严格的审核机制,确保数据的安全。这种机制就是“签名机制”,我们每调用一次可以对硬件进行操作的API,就需要提供一次“数字签名”,阿里云物联网平台对每个接口访问请求的发送者进行身份验证,所以无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名(Signature)信息。阿里云只提供了数字签名的基本知识和一些代码,要想让这些代码跑起来,真正计算出来我们的数字签名,请看本文。
操作环境:win7 x64,eclipse 2021-06 (4.20.0),jdk15.0.1,
目录
提示:本文篇幅较长,适合新手跟着一步步做下来,单纯阅读,可能会显得枯燥。
阿里云的数字签名机制文档连接如下,大家可以通过这篇文章学习签名的方法是什么。
在摘要中已经提到了数字签名是为了安全,是将需要使用的内容通过某一种加密方式进行加密,然后再进行传输的机制。例如下面的这个URL请求,很长很长,使用等号=
连接编码后的请求参数名和参数值。使用与号&
连接编码后的请求参数。参数排序与步骤a的排序一致。
http://iot.cn-shanghai.aliyuncs.com/?MessageContent=aGVsbG8gd29ybGQ%3D&Action=Pub&Timestamp=2018-07-31T07:43:57Z&SignatureVersion=1.0&ServiceCode=iot&Format=XML&Qos=0&SignatureNonce=432101234567&Version=2018-01-20&AccessKeyId=testid&SignatureMethod=HMAC-SHA1&RegionId=cn-shanghai&ProductKey=12345abcde&TopicFullName=/12345abcde/testdevice/user/get
有一些符号是不能被URL传输的,需要进行变换,例如“/”和“=”等,就需要转换为特定的格式,上面的请求参数会转换成为下面的请求参数,注意,此时还没有加密,只是重新编码。
GET&%2F&AccessKeyId%3Dtestid%26Action%3DPub%26Format%3DXML%26MessageContent%3DaGVsbG93b3JsZA%25253D%26ProductKey%3D12345abcde%26Qos%3D0%26RegionId%3Dcn-shanghai%26ServiceCode%3Diot%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D432101234567%26SignatureVersion%3D1.0%26Timestamp%3D2018-07-31T07%253A43%253A57Z%26TopicFullName%3D%252F12345abcde%252Ftestdevice%252Fuser%252Fget%26Version%3D2018-01-20
那么加密后的结果是什么呢?一长串字符将转换成为下面的一小串字符。
+WylkkUnfSTNlT7oE9HdjiNT0NM=
得到签名之后,就可以应用到调用阿里云物联网平台的API操作中了,例如
http://iot.cn-shanghai.aliyuncs.com/?MessageContent=aGVsbG8gd29ybGQ%3D&Action=Pub&Timestamp=2018-07-31T07%253A43%253A57Z&SignatureVersion=1.0&ServiceCode=iot&Format=XML&Qos=0&SignatureNonce=432101234567&Version=2018-01-20&AccessKeyId=testid&Signature=%2BWylkkUnfSTNlT7oE9HdjiNT0NM%3D&SignatureMethod=HMAC-SHA1&RegionId=cn-shanghai&ProductKey=12345abcde&TopicFullName=%252F12345abcde%252Ftestdevice%252Fuser%252Fget
看上去比较简单,阿里云物联网平台也提供了参考代码,但是这些代码仅仅复制粘贴到vscode里面,还是无法直接执行的,您要想通过这几个源代码看到自己的数字签名是什么,还有很长很长的路要走。
为了让大家早日写出自己的APP,少走弯路,我使用eclipse调试成功数字签名计算的代码,在这里与大家分享一下。为什么选择eclipse而不是vscode的原因就不多说了,一句话,试出来的。
下载当前版本的eclipse,当您看到这个文章的时候,可能版本又更新了,我目前用的版本是 2021-06 (4.20.0)。
下载连接:https://www.eclipse.org/downloads/
下载的速度跟网速和时段有关,有的时候快一些。下载结束之后,安装即可。推荐默认安装
因为要使用java编程,所以推荐第二种安装。
因为机器上已经安装了jdk,所以推荐默认安装。
安装完毕后就可以启动了
花生提示:不要一看到环境变量就头晕,毕竟C是不用环境变量的,这个看上去很复杂。其实很简单。我画个图给大家看。我们知道,Java是一种解释性编程语言,它的运行需要在Java运行环境下才能被一边解释一边执行。在解释的过程中,需要与Java运行环境(虚拟机)不停地交互,需要运行Java的各种命令,而这些命令是由一长串的文件目录等组成的。要想对这些命令进行省略,达到只运行一个单词或者字母的目的,就需要“环境变量”,其实就是告诉操作系统,我调用的这个“单词”其实代表了“一句话”,照办就行。
环境变量需要设置3个,分别是JAVA_HOME,CLASS_PATH和path,具体的操作方式请自行网络学习。
需要注意的是
环境变量设置好后,打开命令行,输入java -version,会输出下图所示的界面。表示环境变量设置成功。如果不设置环境变量,java -version将被很长的一句指令代替。
初次运行,会提示设置工作目录,自己选择在一个硬盘分区中建立即可,这个目录设置的原则是“好记,好找”。例如我设置的是d:\eclipse_work。
为什么需要新建一个Java工程?是因为单独运行阿里云的源代码运行不了,还需要eclipse强大的自动化工程管理功能提供支持才能成功运行。
首先新建一个project
接着选择java project
为自己的工程起个名字,例如叫做AliyunSignature。
一直选择默认,就新建工程完毕了,起初是有一个module-info.java类,这个类非常重要,我们的依赖包就需要在这个文件里面进行设置。后面再详细介绍。
根据官方文档https://help.aliyun.com/document_detail/30563.html?spm=a2c4g.11186623.6.804.5b863f83S2O8xh
计算数字签名的java类有4个,我们需要将这些类一一新建,将源代码复制过来。
在src文件夹上右键选择新建class。
例如新建Config.java,我们为类起个名字叫做Config,注意这个名字要与文件名字相同。package写了一长串,是规范的用法,对于本文来说,圆点左右都是一个文件夹的名字。
例如com文件夹下有一个文件夹aliyun,aliyun文件夹下有一个iot文件夹。
在阿里云帮助文档中复制源代码
然后粘贴到Config.java相应的位置,注意有所取舍,不能将所有的代码都粘贴过来,因为新建类的时候,eclipse已经为我们把框架搭建好了。我们在这个文件中,需要将自己的accessKey和accessKeySecret两个参数填写进来。
accessKey和accessKeySecret两个参数的获取方法是登陆阿里云物联平台,然后点击头像,选取AccessKey管理选项,再逐步设置。
可以使用账号自身的,也可以使用RAM的,相当于子账号,新建之后会提示密码(accessKeySecret),一定要保存好。
按照相同的方法新建其他3个类。
文章开头讲了我们需要将传输的url字符串进行加密编码,就需要两个依赖包。其中StringUtils包的操作对象是 Java.lang.String 类型的对象,是 JDK 提供的 String 类型操作方法的补充,StringUtils 中一共有130多个方法,并且都是 static 的,所以我们可以这样调用 StringUtils.xxx()。
- import org.apache.commons.codec.binary.Base64;
- import org.apache.commons.lang3.StringUtils;
我们要把把无法网络传输的字符,如“/”“=”等转换为可以被读取的字符,这个步骤就需要base64编码。Base64
是网络上最常见的用于传输8Bit字节码
的编码方式之一,Base64就是一种基于64个可打印字符
来表示二进制数据
的方法。Base64可以用作HTTP表单和HTTP GET URL中的参数。这种方法有编码和解码两种操作,网上有很多这方面的例子,可以将一串乱码解读成为一句完整的话。
在eclipse中,我们按照阿里云的官方帮助文档https://help.aliyun.com/document_detail/30563.html?spm=a2c4g.11186623.6.804.5b863f83S2O8xh
将4个java文件复制粘贴后,eclipse就会自动提示我们这些源代码中有错误。错误是导入这两个包失败。所以我们需要手动导入这两个包。
从网络上搜索这两个包的名字是不可以的,因为他们对应的包的名字并不是本来的面目。他们与所需导入的jar包的对应关系如下图所示,分别需要导入的是commons.codec包和commons.lang3包。
下载的途径有很多,可以官方下载,也可以第三方下载,两个包都不大。下载后,请将其放在工程目录下的lib文件夹,如果没有这个文件夹,请自己新建一个。
安装jar包的方法也很简单,在工程名右键选择属性properties,然后点击“Java Build Path”选项,切换到Libraries选项卡,就可以导入了。导入的按钮名称是“Add External JARs”。
安装完的效果如下图所示。
安装完毕之后,并不是说源代码的错误自动消失了,这里有一个关键点,就是还要添加依赖。如下图所示,在import org.apache.commons.codec.binary.Base64还有错误提示,“The type org.apache.commons.binary.Base64 is not accessible”。同时,还自动提供了6种快速修复的方法,这里我们选择倒数第二个选项“Add 'requires commons.codec‘to module-info.java”,这句话就是“自动添加依赖”的意思,添加依赖到哪里呢?到module-info.java。如果您是初学者,自动添加是减少编程错误的唯二方法之一。
自动添加依赖之后的效果如下图所示,在module AliyunSignature中添加了依赖“requires commons.codec”。
同样的方式,添加另外一个包。
添加完两个包之后,自动提示的错误消失,可以编译运行了。
进行到这里,激动人心的时候就要到了。可以直接点击运行快捷键,在Console区域观察输出结果。
假如我们需要实际计算在阿里云物联网平台注册的设备的签名,就需要将一些信息修改。首先是accessKey和accessKeySecret。
accessKey和accessKeySecret两个参数相当于自己的阿里云物联平台的账号和密码,获取的方式是登陆阿里云,点击自己的头像,然后选择“AccessKey管理”,这样就可以获取两个参数了。如果没有,可以在打开的界面新建一个。注意,首次新建可以看到,要保存好,下次再看就看不到了。
然后需要在main.java填写设备的信息,分别是DeviceName和ProductKey。
修改完这两处之后,就可以运行查看一下效果了。
运行效果如下图。可以看到两种方法计算出来的签名不一样,这个不用担心,因为第一种方法没有修改DeviceName、ProductKey、accessKey和accessKeySecret,第二种方法已经修改为自己的这些市级参数了。
如下图所示,我们看到,第一种方法用的是一串相当长的字符串。而且几个参数没有改为实际设备的参数。与第二种方法相比,这种方法易读性差,所以阿里云也推荐使用第二种方法进行计算。
再看第二种方法,使用map对每一个参数进行分块式设置,明显好很多了。如果自己的设备发生改变,修改相应位置的参数即可。
至此,就完成了eclipse环境下阿里云物联网平台数字签名的程序就调试完毕了。
写的比较啰嗦,力图将每一个细节都讲到,希望能够帮助到大家。
源代码可以通过两种途径获取。
第一种是通过CSDN资源下载,链接是:
https://download.csdn.net/download/youngwah292/20469671
第二种是通过微信索取。
下一篇文章将介绍如何通过android studio制作安卓APP来实现数字签名,移动端实现数字签名,将为您打开一扇全面掌控物联网的大门,敬请期待!
作者长期致力于物联网知识的普及,关注我,带您玩转物联网。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。