老wu最近做的物联网网关项目,网关设备需求调用云端的REST API接口,该云端完结了某些事务逻辑,然后将资源封装成一个个URI接口,供应外部体系调用。
关于REST API来说,作为程序猿的你应该很熟悉了,咱们身边的许多根底服务设备都对外供给了REST API 接口,比方咱们要查城市气候信息,咱们会调用气候服务的REST API,咱们要查询导航地图信息,咱们会调用高德地图的REST API,咱们要查询快递物流信息,咱们能够调用顺丰后台的REST API,关于智能设备来说,咱们会调用科大讯飞的智能语音REST API、要做人脸辨认,咱们会求情Face Plus Plus 的 REST API等等。
云端将算法、数据、设备资源等封装成WEB 服务,完结端与端之间的架构解耦,端与端之间不用关怀对方是怎么完结的,用的什么编程言语来完结,能够相互独立开发、测验、运转、布置。现在干流的Web服务完结计划中,由于REST形式与杂乱的SOAP和XML-RPC比较愈加简练,越来越多的web服务开端选用REST风格规划和完结。
REST(英文:Representational State Transfer,又称具象状况传输)是Roy Thomas Fielding博士于2000年在他的博士论文中提出来的一种万维网软件架构风格,意图是便于不同软件/程序在网络(例如互联网)中相互传递信息。留意,REST是一种架构风格,而不是一种技术规范,它与HTTP、TCP、IP等RCF界说的协议规范不相同,REST并不是一种规范规范而是一种规划风格,REST一般依据运用HTTP,URI,和XML及JSON这些现有的广泛盛行的协议和规范。
咱们知道,关于依据公网链路的数据传输,数据包是很简单被监听和篡改的,也便是说关于明文传输的数据来说,是无法确保数据是安全可信的,这关于着重数据安全可信的服务(如:网银付出,用户登录,物联网设备操控等等)来说非常重要。为了确保数据传输进程中的安全可信,需求树立加密的数据链路,选用加密后的数据包完结密文传输,咱们无法确保公网数据链路无法被监听,可是数据包以密文传输,即便数据包被截取,也无法获取明文语义,能够确保原始数据信息不被盗取和篡改。
传输层安全协议(Transport Layer Security 缩写: TLS),以及其前身安全套接层(Secure Sockets Layer 缩写: SSL)是一种安全协议,意图是为网际网络通讯,供给安全及数据完整性确保。为了供给对网络服务器的身份认证,维护交流数据的隐私与完整性,1994年网景公司推出HTTPS协议,以SSL进行加密,这是SSL的来源。IETF将SSL进行规范化,1999年发布第一版TLS规范文件。随后又发布RFC 5246 (2008年8月)与 RFC 6176 (2011年3月)。在浏览器、电子邮件、即时通讯、VoIP、网络传真等运用程序中,广泛选用了TLS协议。首要的网站,如Google、Facebook等也以这个协议来创立安全衔接,发送数据。现在已成为互联网上保密通讯的工业规范。
SSL包含记载层(Record Layer)和传输层,记载层协议承认传输层数据的封装格局。传输层安全协议运用X.509认证,之后运用非对称加密算法来对通讯方做身份认证,之后交流对称密钥作为会话密钥(Session key)。这个会话密钥是用来将通讯两方交流的数据做加密,确保两个运用间通讯的保密性和牢靠性,使客户与服务器运用之间的通讯不被进犯者偷听。
超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种网络安全传输协议。在计算机网络上,HTTPS经由超文本传输协议进行通讯,但运用SSL/TLS来加密数据包。HTTPS的首要思维是在不安全的网络上创立一安全信道,并可在运用恰当的加密包和服务器证书可被验证且可被信赖时,对偷听和中心人进犯供给合理的防护。
HTTPS运用SSL/TLS来加密数据包,TLS协议是与运用层协议独立无关的。高层的运用层协议(例如:HTTP、FTP、Telnet等等)能通明的创立于TLS协议之上。TLS协议在运用层协议通讯之前就现已完结加密算法、通讯密钥的洽谈以及服务器认证工作。在此之后运用层协议所传送的数据都会被加密,然后确保通讯的私密性。
SSL/TLS协议选用公钥加密算法,也便是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。在客户端和服务器开端交流TLS所维护的加密信息之前,他们有必要安全地交流或协议加密密钥和加密数据时要运用的暗码。也便是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。可是,在树立起密文加密之前,数据是以明文传输的,也便是公钥是以明文传输的,怎么确保公钥不被篡改?解决办法是:将公钥放在数字证书中。只需证书是可信的,公钥便是可信的。也便是要经过一个“握手阶段(handshake)”。
TLS经过运用一个握手进程洽谈出一个有状况的衔接以传输数据。经过握手,客户端和服务端洽谈各种参数用于创立安全衔接:
-
当客户端衔接到支撑TLS协议的服务器要求创立安全衔接并排出了受支撑的暗码组合(加密暗码算法和加密哈希函数),握手开端。
-
服务器从该列表中决议加密和散列函数,并告诉客户端。
-
服务器发回其数字证书,此证书一般包含服务器的称号、受信赖的证书公布组织(CA)和服务器的公钥。
-
客户端承认其公布的证书的有用性。
-
为了生成会话密钥用于安全衔接,客户端运用服务器的公钥加密随机生成的密钥,并将其发送到服务器,只要服务器才干运用自己的私钥解密。
-
运用随机数,两边生成用于加密和解密的对称密钥。这便是TLS协议的握手,握手结束后的衔接是安全的,直到衔接(被)封闭。假如上述任何一个进程失利,TLS握手进程就会失利,而且断开一切的衔接。
也便是首要服务器发回其数字证书,此证书一般包含服务器的称号、受信赖的证书公布组织(CA)和服务器的公钥。客户端收到服务器回应今后,首要验证服务器证书。假如证书不是可信组织公布、或许证书中的域名与实践域名不共同、或许证书现已过期,就会向拜访者显现一个正告,由其挑选是否还要持续通讯。假如证书没有问题,客户端就会从证书中取出服务器的公钥。
关于高安全要求的运用场合,服务器还会需求承认客户端的身份,就会再包含一项恳求,要求客户端供给”客户端证书”。比方,金融组织往往只允许认证客户连入自己的网络,就会向正式客户供给USB密钥,里边就包含了一张客户端证书。
服务器是否是可信的,咱们会依据服务器发回的数字证书,验证证书的服务器称号与咱们要拜访的HTTPS服务域名是否共同,证书公布组织是否是受信赖的以及证书是否在有用期内。
在暗码学和计算机安全范畴,根证书(root certificate)是一个无签名或自签名的辨认根证书公布组织(CA)的公钥证书。根证书是公开密钥根底建规划划中的一部分。大多数常用的商用计划依据ITU-T X.509规范,其一般包含一个来自证书公布组织的数字签名。证书公布组织能够在一个树结构中签发多个证书,根证书便是这个树结构中最顶层的证书,其私钥用于“签名”其他证书。在根证书之后的一切证书都会承继根证书的可信赖性——根证书的签名有点相似“公平”一个实际国际中的身份。进一步向下的证书还依赖于中心组织对它的信赖,这一般被称为“隶属证书公布组织”。
咱们的操作体系中会自带受信赖的根证书办法组织的数字签名证书,假如您的服务器端SSL证书由全球信赖的证书公布组织(CA)验证服务器身份后公布的,便能很便利的验证其合法性,可是需求额定的费用,需求依据证书的有用年限,向这些证书公布组织付必定的维护费。
还有一种办法是选用自签名的数字证书,然后手动或许程序主动将数字证书加入到受信赖的证书公布组织中,完结数字证书的授信承认。
老wu这儿运用的REST API服务将运用自签名的数字证书,依据TLS 1.2协议,选用服务器端证书和客户端证书双向认证的办法,完结数据的加密牢靠传输。
运用OpenSSL 生成服务器端及客户端证书
咱们运用OpenSSL这款开源东西来生成服务器和客户端SSL衔接运用的自签名证书。
假如你运用的是MAC OS 或许 Linux,OpenSSL默许现已装置,假如运用的是Windows体系,能够经过装置Git 东西,运用Git东西自带的shell或许运用OpenSSL的Windows装置版,经过这个链接进行下载:
http://slproweb.com/products/Win32OpenSSL.html
生成服务器证书私钥
在shell里输入指令
openssl genrsa -out server.key 2048
会在当时目录下生成一个server.key文件
接下来运用方才生成的server.key证书私钥生成生成服务器证书恳求(CSR)文件
openssl req -new -key server.key -out server.csr
回车履行指令后提示要输入您的相关信息。填写阐明:
1.Country Name:
填您地点国家的 ISO 规范代号,如我国为 CN,美国为 US
2.State or Province Name:
填您单位地点地省/自治区/直辖市,如广东省或 Guangdong
3.Locality Name:
填您单位地点地的市/县/区,如广州市或 Guangzhou
4.Organization Name:
填您单位/组织/企业合法的称号,如吴川斌的博客或www.mr-wu.cn
5.Organizational Unit Name:
填部分称号,如技术支撑部或 Technical support
6.Common Name:
填域名,如:api.mr-wu.cn。在多个域名时,填主域名,这项非常重要,咱们在验证服务器证书时,会验证Common Name与http恳求的url域名是否匹配,假如不匹配,ssl会回来过错。
7.Email Address:
8.‘extra’attributes
都能够不填写,按回车越过直至指令履行结束。
这儿要着重一下,除第 1、6、7、8 项外,2-5 的信息填写请一致运用中文或许英文填写,便是说中英文不要混用。
指令成功履行后,会在当时目录下生成certreq.csr这个文件
接下来生成服务器端证书
openssl x509 -req -days 2000 -in server.csr -signkey server.key -out server.crt
证书选用x509格局,-days 外表证书的有用期 老wu这儿设置为2000天。指令成功履行后,在当时目录下生成server.crt证书文件。
接下来生成客户端证书
生成客户端的办法和进程与上边描绘的生成服务器证书进程是相同的。
履行指令
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 2000 -in client.csr -signkey client.key -out client.crt
现在,服务器端的私钥及数字证书和客户端的私钥和数字证书咱们都成功生成了,接下要咱们要把服务器端的私钥和数字证书以及客户端的数字证书上传到服务器端的HTTP Server里,然后进行装备,让HTTP Server 敞开SSL衔接并监听443端口。
老wu这儿运用的Nginx,详细的装备办法以你运用的HTTP Server版别为准
1
2
3
4
5
6
7
8
9
10
11
|
listen 443 ssl http2 敞开SSL 加密传输并监听于 443接口
ssl on; 敞开ssl 加密传输
ssl_certificate /etc/nginx/ssl/api.mr-wu.cn.key/server.crt; 服务器证书途径
ssl_certificate_key /etc/nginx/ssl/api.mr-wu.cn.key/server.key; 服务器私钥途径
ssl_client_certificate /etc/nginx/ssl/api.mr-wu.cn.key/client.crt; 客户端证书途径
ssl_verify_client on; 敞开客户端衔接需求证书认证功用
|
然后能够运用 curl 指令进行服务器端SSL衔接的测验
1
|
curl -v -s -k --key client.key --cert client.crt https: //api.mr-wu.com
|
假如您发现无法拜访,假如运用的云体系,例如阿里云,它会对服务器创立安全组,只允许敞开的端口通孔,这儿要把443接口装备到安全组中。
HTTPS Web Server建立好了,至于REST API怎么去完结,老wu这儿就不详细讲了,用PHP结构、NodeJS结构仍是JAVA结构都能够,便是装备Nginx的反向署理就好了。
接下来便是QT5 程序经过SSL来衔接云端的REST API了,在依据QT5的程序完结中,咱们运用QNetworkAccessManager类来办理网络衔接恳求,运用QNetworkRequest类来进行完结HTTP 的 post、get、delete等操作,运用QSslConfiguration类来完结SSL的衔接装备,包含CA证书的装备,客户端证书及客户端私钥的装备,设置SSL 协议的版别,认证形式等等。
QT5这儿有一个坑点,便是QT5对OpenSSL的编程完结了支撑,可是却没有顺便对应的二进制运转库,这就会使得你的程序代码编译是正确经过的,可是在IDE里头运转调试时,会报SSL过错:
1
2
3
4
5
6
7
8
9
|
QSslSocket: cannot call unresolved function SSLv23_client_method QSslSocket: cannot call unresolved function SSL_CTX_new QSslSocket: cannot call unresolved function SSL_library_init QSslSocket: cannot call unresolved
本文来自网络,不代表快递资讯网立场。转载请注明出处: http://www.llaiot.com/popular-logistics-information/2893.html
|