对于一些高安全性要求的企业内项目,我们有时希望能够对客户端进行验证。这个时候我们可以使用Https的双向认证机制来实现这个功能。
单向认证:保证server是真的,通道是安全的(对称密钥);双向认证:保证client和server是真的,通道是安全的(对称密钥);
要实现这么一个完整的安全体系,需要一个CA或者openssl自建CA来管理签发客户端证书。作为项目要求的场景可能是这样的,一个前端网站专门用于签发证书,通过电子邮件发送下载客户端证书邮件到移动端,用户点击邮件里的链接下载证书,一次性有效,无法重复下载。
移动端应用可以继续使用帐号登录,服务端会验证帐号与客户端证书的对应关系,这样就实现了用户帐号和设备的绑定,用户帐号只能在安装了用户的客户端证书的移动端登录。
这里技术细节在于nginx 对通过客户端证书的验证的请求,对其add_header 把客户端证书的信息带入后端。服务器在请求处理之前先验证用户与客户端证书对应关系是否正确,正确才进行后续处理。
nginx中设置 ssl_client_certificate
到你的CA证书路径 ,这样nginx只会接收已被签发的客户端证书.
启用 ssl_verify_client,则开启双向认证
.
nginx中存在一些变量可以使用 $ssl_client_cert
(full certificate), $ssl_client_s_dn
(the subject name of the client certificate), $ssl_client_serial
(the serial number your CA has issued for their certificate) $ssl_client_verify
(which you should check for SUCCESS)
.我们都过add_header可以把这些变量带到后端服务器上处理