Certbot生成的PFX证书在Hololens2 Unity应用加载时抛CryptographicException
问题描述
我们的Hololens2应用基于未弃用的MixedReality-WebRTC库开发,原证书过期后需替换新证书且不能修改源码。通过Linux服务器上的Certbot生成SSL证书后,得到以下文件:
/etc/letsencrypt/live/<myurl>/privkey.pem /etc/letsencrypt/live/<myurl>/cert.pem /etc/letsencrypt/live/<myurl>/fullchain.pem
按照文档执行命令生成PFX:
openssl pkcs12 -inkey privkey.pem -in cert.pem -certfile fullchain.pem -export -out app.pfx
将PFX放到Windows 10的Unity项目中,执行以下C#代码时抛出System.Security.Cryptography.CryptographicException: Input data cannot be coded as a valid certificate异常:
var certificate = new X509Certificate2(path_to_pfx, "MyPassword");
尝试读取字节数组加载也失败:
byte[] contents = File.ReadAllBytes(path_to_pfx); var certificate = new X509Certificate2(contents, "MyPassword");
当前环境:Unity 2020.3.28f1(基于Mono 5.11.0,无法升级),曾尝试在Windows用OpenSSL生成PFX,同样无效。此前GoDaddy证书导出的PFX可正常加载,但有其他问题,现寻求Certbot证书生成PFX的加载解决方案。
解决方案
针对Mono 5.11的兼容性限制,推荐以下几种方案:
方案1:生成PFX时指定兼容旧版Mono的加密算法
旧版Mono对AES加密的PFX支持有限,生成时强制使用SHA1+3DES算法组合:
openssl pkcs12 -inkey privkey.pem -in cert.pem -certfile fullchain.pem -export -out app.pfx -certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -macalg SHA1
执行时输入设置的密码,生成的PFX可匹配Mono 5.11的解析逻辑。
方案2:精简证书链,仅包含服务器证书和中间证书
Certbot的fullchain.pem包含根证书,旧版Mono可能无法识别其格式。改用chain.pem(仅中间证书)生成PFX:
openssl pkcs12 -inkey privkey.pem -in cert.pem -certfile /etc/letsencrypt/live/<myurl>/chain.pem -export -out app.pfx -certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -macalg SHA1
方案3:通过Windows证书管理器重新导出PFX
将Certbot的PEM文件复制到Windows后,利用系统工具生成兼容PFX:
- 双击
cert.pem,选择“安装证书”,导入到本地计算机-个人证书存储 - 双击
chain.pem,导入到本地计算机-中间证书颁发机构存储 - 打开“证书管理器”,找到导入的服务器证书,右键选择「所有任务→导出」
- 选择「是,导出私钥」,选择PFX格式,勾选「包括所有证书路径中的证书」,设置密码后完成导出
- 将导出的PFX替换Unity项目中的文件
方案4:(备选,若允许修改一行代码)添加密钥存储标志
如果能修改加载代码的一行,添加X509KeyStorageFlags可解决权限或解析问题:
var certificate = new X509Certificate2(path_to_pfx, "MyPassword", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
内容的提问来源于stack exchange,提问作者P-ratt
相关产品推荐
相关产品推荐

