这篇文章内容接上一篇。上一篇文章给出了使用openssl提供的api建立server与client并指定PSK与加密套件的代码。在TLS1.3中,加密套件被缩减至5种,PSK也成为TLS1.3协议中的标配。这篇文章则会介绍一下怎么样利用TLS1.3中已有的加密算法定义新的加密套件。
加密套件(cipher suites)简介
加密套件会在握手阶段被确定。加密套件的定义在TLS1.3之前与TLS1.3中有着一定区别。在TLS1.3中,被使用的五种加密套件如下(图源与介绍来自知乎,见文末参考资料):
以TLS_AES_128_CCM_SHA256
为例,TLS表明该加密组件用于TLS协议,AES表明使用AES对称加密算法,128表示密钥长度为128位,CCM表明分组加密模式,SHA256是HKDF过程使用的哈希算法。
OpenSSL中的加密套件定义
想要添加新的加密套件,首先需要找到OpenSSL中TLS1.3的加密套件是如何定义的。通过命令行工具,我们可以输出目前TLS1.3中支持的加密套件,根据源码我们可以找到其定义。当然,也可以选择全局搜索相关变量名找到关联代码,从而定位定义位置。TLS1.3的加密套件定义在ssl/s3_lib.c
中,如下:
1 | /* The list of available TLSv1.3 ciphers */ |
我们查看SSL_CIPHER的定义,可以看到各个成员的详细意义。
1 | /* CipherSuite length. SSLv3 and all TLS versions. */ |
定义新的加密套件
其中所有定义均为宏定义的常量,我们为这个结构体添加新成员,并增加相应的宏定义,即可为OpenSSL定义新的TLS1.3加密套件。这里我们选择增加加密套件TLS_AES_256_GCM_SHA512
,向tls13_ciphers增加如下的成员即可。
1 | { |
部分变量没有进行定义,我们增加其定义即可。注意定义保持一致。如果使用编辑器的快速跳转注意不要跳转到系统库中了。
1 | //tls1.h |
1 | //ssl_local.h |
1 | // tls1.h |
之后进行编译就结束了,将上一篇文章中设置的加密套件设置为TLS_AES_256_GCM_SHA512,并在PSK选用的加密套件id设置为0x1306即可。需要注意的是,如果没有安装在默认的路径,在编译时可能需要作额外的设置。我折腾了很久还是没有折腾出来,最后选择安装在了默认的路径。