关于为客户端自签SSL证书的生成、颁发、鉴权与JWT + Token

本文澄清了自签SSL证书与Restful概念的混淆,详细解释了SSL证书的生成、颁发及鉴权过程,重点介绍了JWT+Token在鉴权中的应用。

关于为客户端自签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;

喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享:

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专讲冷知识

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值