普通软件开发中使用HTTPS即HTTP+SSL进行单项认证通信就能够满足接口之间通信安全的需求,但是对于一些设计金融,支付,银行相关业务,软件系统设计涉密数据等的软件系统一般接口间通信必须双向验证,信息做好防串改工作
HTTPS双向验证区别于单项验证(单项验证开发所有客户端即不对客户端做证书验证),不仅客户端要验证服务器端证书,服务器端也要验证客户端证书,是否进行双向验证取决于服务端。双向验证更能保障服务器端接口的访问安全性,谁获得过证书,谁才能访问,比之于单向验证更有安全性,如下图所示。
双向认证协议的加密需要借助OPENSSL开源工具,以及一些常用的WEB服务器中间件,如NGINX,APACHE,TOMCAT,WEBLOGIC等,下面以LINUX服务下NGINX为例说明双向认证协议的配置过程。
服务器端证书的生成与配置
- 首先确保服务器已经安装nginx与OpenSSL,其安装可参考相关文章
- 生成CA 私钥, ca.key
openssl genrsa -out ca.key 4096
- 生成CA数字证书,即跟证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
- 生成 server 端私钥
openssl genrsa -out server.key 4096
- 生成 server 端数字证书请求
openssl req -new -key server.key -out server.csr
- 用 CA 私钥签发 server 的数字证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650
- 生成 client 端的私钥
openssl genrsa -out client.key 4096
- 生成 client 端数字证书请求
openssl req -new -key client.key -out client.csr
- 用 CA 私钥签发 client 的数字证书
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650
- Nginx配置如下图所示
客户端完成验证与接口的访问
客户端请求接口时需要加载证书并发起http请求,当服务器端验证成功后才能完成后续的通信工作,客户端实现根据不同的开发语言有不同的实现方式,下列已JAVA与PHP为例说明主要实现过程
- PHP语言完成客户端双向验证协议的接口请求
- JAVA语言完成客户端双向验证协议的接口请求
防串改实现思路是:
1.客户端第一次访问(基于双向验证,携带固定的账户密码等)服务器端程序时服务前端下发随机签名秘钥(该秘钥通过AES系列算法进行加密),完成通信接口的第一次通信握手
2.客户端利用签名秘钥SHA1加密算法对传送数据进行加密处理并以POST方式发送到服务前端
3.服务器根据签名秘钥使用对应解密算法进行数据解密及验证,主要是从解密数据中验证其下发的签名秘钥是否正确,若验证通过则进行业务数据通信传输。
4.其中签名秘钥也可以是双方约定的固定值无需完成第一次接口通信握手
文章来源,北京羲和时代https://www.ixiera.com/web/kehu/zsk/342.html