一. 准备知识
非对称加密的数据,加解密的流程是这样的:
公钥 + 原文 = 密文 -> 密文 + 私钥 = 原文
私钥 + 原文 = 密文 -> 密文 + 公钥 = 原文
常见的对称加密方式有AES,RC4,RC5,RC6和DES等
常见的非对称加密方式有RSA,ECC(椭圆加密)和DSA
权威机构会将自己的公钥提供给社会大众,目的就是可以验证某个证书是否是经过该机构认证过的(加密过的),如果证书可以使用该机构的公钥解密出来数据,说明这个证书是可信任的。
SSL/TLS的主要作用有三个:
A. 加密通信: 提供加密算法用于对通信数据进行加解密
B. 身份验证: 确认通信双方的身份是否合法(通过交换证书来验证)
C. 完整性: 发送数据同时对数据进行签名(对发送数据做HASH处理,生成摘要,然后使用私钥对摘要做加密),接收方收到数据后同样对数据做一次hash,生成摘要,然后使用发送方的公钥解密签名数据获取摘要,两个摘要相同才说明数据没有被中间方修改过。
x509是一种标准,是公钥证书(包含了身份信息和公钥)的格式标准
二. 证书更新流程
一般8155上面,证书都是存放在QNX侧的TEE环境中,更新是需要QNX上的相关应用来执行的,流程如下:
QNX:
1.检查证书的有效期
1.1 QNX上有一个TEE的守护进程(nio_qseecom_service)用于和TEE环境内的应用做通信,证书一般存放在TEE环境中。
1.2 QNX上的其他进程想要和TEE环境交互,例如获取或者安装证书,就需要和TEE的守护进程(nio_qseecom_service)交互,方式为UNIX DOMAIN SOCKET
1.3 通过REQUEST/RESPONSE的方式从TEE获取到证书和公钥,TEE中存放的公钥的格式一般是DER的(二进制),而不是PEM(文本),需要使用SSL的d2p_PKCS8PrivateKey函数进行转换
1.4 通TEE返回的证书文件中获取有效期(BIO_new_mem_buf -> PEM_read_bio_X509 -> X509_get_notBefore/X509_get_notAfter -> X509_free
2.如果证书有效期不到半年了,那么可以启动证书更新,向云端申请新的证书
2.1 向云端申请新的证书一般通过HTTPS POST的方式,同时,url中的格式一般带有车辆的认证信息,例如VID,还有时间戳等,具体需要云端平台给出规格说明
2.2 HTTPS通信需要提供公钥,然后在HTTP的BODY中提供当前的证书,云端返回的RESPONSE中带有更新后的(主要是更新了证书有效期)证书
CURL* curl;
struct curl_slist *headers; // 字符串链表,每个字符串元素作为HTTP REQUEST HEADER中的一行
curl_slist_append // 通过该函数将headers中的内容添加到REQUEST HEADER中
curl_global_init
curl_easy_init(curl)
curl_easy_setopt
CURLOPT_URL // HTTPS通信的url
CURLOPT_POST // 表示是否使用HTTP POST Method 1:使用Post 0:不适用Post
CURLOPT_POSTFIELDS // HTTPS POST BODY字符串
CURLOPT_WRITEFUNCTION // 用于处理HTTPS RESPONSE的回调函数
CURLOPT_WRITEDATA // 保存用于存放HTTPS RESPONSE的字符串
CURLOPT_HTTPHEADER // HTTPS REQUEST HEADERS
CURLOPT_SSLVERSION // SSL版本
CURLOPT_SSLCERTTYPE // 证书的编码格式 PEM/DER
CURLOPT_SSLKEYTYPE // 公钥的编码格式 PEM/DER
CURLOPT_SSL_VERIFYPEER // 用于控制客户端是否验证服务器的SSL证书 0:不验证 1:验证
CURLOPT_CAINFO // CA证书的路径,CA证书用于验证服务器的SSL证书
CURLOPT_CAPATH // 功能类似CURLOPT_CAINFO,但是可以提供多个CA证书
struct ssl_auth auth; // 携带客户端证书和公钥
auth.cert // 客户端证书内容
auth.key // 客户端公钥内容
auth.trust_chain // 客户端证书信任链
auth.cert_len // 客户端证书大小
auth.key_len // 客户端公钥大小
CURLOPT_SSL_CTX_FUNCTION // 回调函数,ssl户将上面的ssl_auth结构体传给该函数,该函数中作如下工作:
1. 通过BIO_new_mem_buf,PEM_read_bio_X509,PEM_read_bio_PrivateKey解析出证书和公钥中的内容
2. SSL_CTX_use_certificate 设置客户端证书
3. SSL_CTX_use_PrivateKey 设置客户端公钥
4. SSL_CTX_load_verify_locations CA提供的证书信任链文件路径
CURLOPT_SSL_CTX_DATA // 验证使用到的公钥和证书,就是上面的ssl_auth类型的结构体
2.3 收到更新的证书后,需要和TEE的守护进程(nio_qseecom_service)打交道,把新的证书安装到TEE环境中。
3 通过HTTPS向云端返回安装新证书的结果,和上面下载的步骤类似,参数不同而已。