关于为客户端自签SSL证书的生成、颁发、鉴权与JWT + Token
群里,有同行对自签SSL证书与Restful概念混淆,特撰写本文
第一篇 正确理解SSL证书的Restful API访问
有朋友一遇到Rest、Restful,立马下意识的问:“我客户端的组件代码该如何配置参数,才能识别我的自签SSL证书”?比如这位网友:
“请教一下,看了TRestClient的属性,没有发现支持自签名https站点访问的证书配置,是不是调用自签名的https服务器的Restful API只能改用TIdHTTP?”
这样的提问,首先反应出概念不清晰、模棱两可,因为提问的本质是数字证书的鉴权问题,它根本与客户端开发组件的属性无关、与该属性中是否包含证书配置无关,否则它就不叫Restful。至于Indy的做法,只是它私有的做法,并非Rest公共的做法:
一、关于Restful:
1、跨平台跨操作系统的服务
2、跨语言的服务
3、跨开发工具且与客户端任何第三方开发组件无关
比如:服务端提供了SSL自签证书的生成服务、颁发服务、鉴权服务,并且这些服务是Restful的服务。
二、SSL及其证书
1、无论第三方证书颁发机构
2、还是你自签证书
SSL:安全套接字层安全协议。
数字证书:基于“国际数字证书管理机构”统一认可的算法的数字文件。
其中包含了申请的认证的这些基本记录:
2.1、Expiry date of the certificate过期时间、
2.2、Start date of the certificate开始时间、
2.3、Subject of the certificate证书主题、
2.4、Issuer of the certificate证书颁发者、
2.5、ProtocolName of the certificate证书的协议名、
2.6、Algorithm Signature of the certificate证书的算法签名、
2.7、Algorithm Encryption of the certificate证书的加密算法、
2.8、Encryption's KeySize of the certificate证书的加密密钥大小。
如果证书的协议及算法符合SSL要求的,则生成的证书文件为SSL证书。
第二篇 SSL数字证书的生成、颁发与鉴权
一、自签SSL证书的生成
概念:按照符合SSL要求的算法,用代码生成SSL证书文件,包含上述最基本的证书记录。
二、自签SSL证书的颁发
主要目的:识别客户端、对应生成的证书:针对目标的客户端为其生成可唯一识别的SSL证书文件,在合法客户端软件初次访问时,被下载到客户端设备进行物理存储。
三、鉴权
1、现目前主流: JWT + Token
Json web token (JWT): 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该Token也可直接被用于认证,也可被加密。
服务端:生成、颁发、鉴权
客户端:获取服务端颁发的Token令牌。
现目前广泛被BAT使用的实现方式为,比如 CA + ServiceAccountToken:
1.1、手机号 + 手机验证码+密码(双因素认证)
这里Token令牌是什么:就是你的手机请求并接收到的唯一的验证码,且有时效性控制(比如5分钟之内有效)。
主要控制点:您的手机别丢失。
如果在加上密码验证或指纹验证或人脸识别:就会万无一失。
鉴权:服务端比对为你的手机请求的加密后的验证码。
1.2、邮箱号 + 邮件链接点击回调验证+密码(双因素认证)
这里Token令牌是什么:就是用你的邮箱请求并接收到的唯一的验证邮件,且有时效性控制(比如5分钟之内有效)。
主要控制点:您的邮箱别被盗号。
如果在加上密码验证或指纹验证或人脸识别:就会万无一失。
鉴权:服务端比对为你邮箱请求的邮件的加密后的邮件头信息。
1.3、人脸识别
这里Token令牌是什么:就是你的面部影像,就代表你本人。
主要控制点:您被被绑架啦。
鉴权:服务端比对之前为你生成的面部影像。
2、过去传统的做法
以下这些做法,需要客户端设备操作系统权限,并在客户端设备操作系统上安装,比较繁琐,客户操作起来困难,所以现在并非主流鉴权的方式:
2.1、客户端下载、服务端鉴权:下载后,OS加载安装,通常用于类似银行的U盾的双因素认证,令牌就是U盾;U盾插在客户端设备时,鉴权其数字证书颁发的合法性。比如: CA + 客户端证书 + 客户端私钥。
2.2、TSession方式鉴权:(略,网上很多这样的文章)比如: CA + 用户名 + 用户密码。主要考虑会话Session的生命周期问题: 可以参考百度搜索:JWT
3、如果实在要用传统的方法,将鉴权放到客户端进行
那么如果用delphi开发的话,可以从继承并重写这个类的如下方法入手:
uses System.Net.HttpClient;
function DoGetSSLCertificateFromServer(const ARequest: THTTPRequest): TCertificate; virtual; abstract;
其中,TCertificate :
uses System.Net.URLClient;
/// <summary> Record to store the information of a certificate.</summary>
TCertificate = record
/// <summary> Expiry date of the certificate</summary>
Expiry: TDateTime;
/// <summary> Start date of the certificate</summary>
Start: TDateTime;
/// <summary> Subject of the certificate</summary>
Subject: string;
/// <summary> Issuer of the certificate</summary>
Issuer: string;
/// <summary> ProtocolName of the certificate</summary>
ProtocolName: string; // deprecated;
/// <summary> Algorithm Signature of the certificate</summary>
AlgSignature: string;
/// <summary> Algorithm Encryption of the certificate</summary>
AlgEncryption: string; // deprecated;
/// <summary> Encryption's KeySize of the certificate</summary>
KeySize: Integer;
end;
喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享:
本文澄清了自签SSL证书与Restful概念的混淆,详细解释了SSL证书的生成、颁发及鉴权过程,重点介绍了JWT+Token在鉴权中的应用。
2457

被折叠的 条评论
为什么被折叠?



