使用SVS实现签名验证
前言
最近开发了一个接口由于是给外部其他系统的调用的,所以为了接口安全性,我们需要选择一个符合业务需求的请求机制。根据和合作方的协商,我们决定采用了SVS
签名验证的方式来保证接口的安全性。
正文
数字签名
数字签名指的是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
它的基本原理是将原文用对称密钥加密传输,而将对称密钥用收方公钥加密发送给对方。收方收到电子信封,用自己的私钥解密信封,取出对称密钥解密得原文。
使用svs实现签名验证的基本流程
第一步:获取证书信息
证书信息的来源有2种:
- 采用证书通过
SSL
方式访问应用系统,SSL
在登录时已经获取了证书信息,然后把信息保存在COOKIE
中,SVS
需要签名时,直接从COOKIE
中取出信息就可以了。 - 调用
SVS
签名控件获得证书信息(第一次使用需要从IE
中安装ACTIVE
控件)。
第二步:调用证书的私钥对需要签名的原文进行签名
签名其实也就是一种加密方式,采用MD5
或者SHA1
的加密方式把用户的原文和证书的信息生成一段加密信息(包括PKCS7
签名、attached
签名、detached
签名和普通签名),然后保存倒数据库中作为记录。
第三步:验证签名
把签名信息取出来,采用相应的解密方法解密,获得证书信息和原文(在这个过程中不需要证书)。
HTTPS请求
我们在实际的应用过程中最常用的数字加密就是将HTTP
转化成HTTPS
请求,首先我们先了解一下HTTPS
和HTTP
的区别:
HTTPS
协议需要到ca
申请证书,一般免费证书较少,因而需要一定费用。HTTP
是超文本传输协议,信息是明文传输,HTTPS
则是具有安全性的ssl
加密传输协议。HTTP
和HTTPS
使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。HTTP
的连接很简单,是无状态的;HTTPS
协议是由SSL
+HTTP
协议构建的可进行加密传输、身份认证的网络协议,比HTTP
协议安全。
Https 请求/响应机制流程
- 客户端发起请求
- 客户端发送 验证包:
Client.random
随机数、session ID
、密文族(告诉服务自己加密方式)、Server_name
- 服务器接收 验证包:
sever.random
随机码、session ID
、服务器选择一个密文组 Certificate
,服务器发送证书, 数字证书:签发机构、过期时间、主体名称、公共密钥信息、指纹信息等待- 服务器发送结束
- 客户端验证:客户端从内置的
CA
根证书获取C.pub
,对服务器发送来的数字证书进行验签如果验证成功,会生成pre-master
- 客户端根据之前的:
Client.random
+sever.random
+pre-master
生成对称密钥将对称秘钥发送给服务器端,最后使用对称秘钥进行通信
这里我们以阿里云服务器nginx
配置openSSL
实现HTTPS
请求为例
第一步:下载nginx安装包,并放在指定位置
Nginx安装包下载地址
第二步:安装openSSL
模块
[root@ns3 ~]# systemctl stop firewalld
[root@ns3 ~]# iptables -F
[root@ns3 ~]# setenforce 0
[root@ns3 ~]# yum -y install pcre zlib pcre-devel zlib-devel
[root@ns3 ~]# tar xf nginx-1.16.0.tar.gz -C /usr/local/
[root@ns3 ~]#cd /usr/local/nginx-1.16.0
[root@ns3 ~]#./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module&&make && make install #后续需要的模块一次性安装
第三步:从阿里云申请两个对应的文件 XXX.key
和XXX.pem
,找到目录 /usr/local/nginx/conf
创建 cert
目录,将两个文件复制进去
第四步:配置nginx.conf
,并启动nginx
server {
listen 80;
server_name 域名.com;
# ssl
listen 443;
ssl on;
ssl_certificate cert/刚刚复制的文件名称.pem;
ssl_certificate_key cert/刚刚复制的文件名称.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root /root/project/ss;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
第五步:在阿里云的安全策略中开放443端口
第六步:验证