一、ios p12 证书中的参数
博主遇到的问题是,当我们后端与ios传输一个加密的p12的证书时,首先后端对证书、私钥进行加密,
后端采用nodejs,加密p12证书需要用到 node-forge库
可参照实例demo
/**
* 生成p12证书 base64
*/
async function createP12(data, uuid) {
try {
let pki = forge.pki;
let cert = forge.pki.certificateFromPem(data.certificatePem);
let sk_forge = forge.pki.privateKeyFromPem(data.keyPair.PrivateKey);
let pkcs12 = forge.pkcs12.toPkcs12Asn1(sk_forge, cert, "123456", {
friendlyName: uuid,
algorithm: '3des'
});
let p12Der = forge.asn1.toDer(pkcs12).getBytes();
let p12b64 = forge.util.encode64(p12Der);
return p12b64;
} catch (err) {
throw err;
}
}
后端在生成p12证书时候用到data,data是由aws iot自动生成的,里面会包含证书和私钥
123456是加解密用到的密码
3des是用到的加密算法
最坑爹的就是friendlyName这个参数,最开始后端不是用的随机数uuid,用的统一的“default”,
我们的ios是可以切换账户,而且不同的账户需要用不同的证书,这个friendlyName对应的就是ios的certificate id;
在测试的过程中,第一个账号登录,certificate id用“default”解开p12的data,使用都是ok的;
最坑爹的是切换了一个账户,然后又用certificate id=“default”去解,应该是有缓存机制,取的还是上一个用户的证书
然后变更了思路,后台加密证书用随机数,然后ios再用同一个随机数去解,这样每次都能取到不同的用户证书了。
就这一个小问题花了两天时间解决,因为没有相关的文档,ios也没有介绍 certificate id的作用,只好自己摸索了,所以记下来希望给更多的人帮助踩坑。