文章目录
openssl3.2 - exp - PEM <==> DER
概述
想将客户端私钥 + 服务端公钥 数据转成 C数组, 放到客户端工程中.
用openssl默认生成好的证书, 公钥, 私钥等数据, 都是PEM格式的.
PEM格式的数据有明显的标记, 可以看到PEM数据的用途.
如果有人逆向客户端程序, 很容易看到线索.
就想着, 将PEM格式文件转为DER格式文件, 然后将DER格式文件转成数组, 再放入客户端程序来用, 这样好一些.
查资料时, 看到大部分例子都是拿证书(x509)做的例子.
看了openssl帮助, 不同的openssl对象(证书, 纯公钥, 纯私钥, DH参数...), 进行PEM和DER互转时, 用的openssl命令都是不同的.
针对不同的openssl对象, 先选好对应的对象命令, 然后才能正确的互转.
笔记
加密用的私钥(带口令保护) - PEM => DER
私钥都是有密码的, 转换时要给出密码.
密码有不同格式:
:pass - 文本密码
:env - 在环境变量中的密码
:stdin - 需要密码时, 现输入密码.
:file - 在文件中的密码
openssl pkey -in my_enc_priv_key.pem -passin pass:my_priv_key_pwd -out app_key.der -outform DER
可以看出, 如果要自动运行转换, 用哪种密码输入方式都不太安全.
最好还是不带 -passin 参数, 这样需要密码时, openssl.exe自己弹出提示需要密码, 然后自己就在命令行自己输入密码好了, 这样安全一些. 不过麻烦啊.
加密用的私钥(不带口令保护) - DER => PEM
openssl pkey -in app_key.der -out app_key3.pem -outform PEM
感觉咋原来PEM带口令保护的, 转成DER之后, 口令被搞没了...
又验证了一次, 果真, 从带口令保护的PEM(加密的私钥)转成DER后, 口令被搞没了.
如果想要导出后的DER/PEM带口令, 需要加选项 -passout
将不带口令的PEM转成带口令的PEM
openssl pkey -in app_key3.pem -out app_key5_pwd.pem -outform PEM -passout pass:111111 -aes-256-cbc
支持口令的算法
算法不能有 EVP_CIPH_FLAG_AEAD_CIPHER 标记, 模式不能是 EVP_CIPH_XTS_MODE
有以上2点的算法不能用在命令行程序的参数输入上.
通过openssl实现中的opt_cipher(), 可以看到以上2点的判断.
如果想知道哪种算法支持命令行口令, 就需要将全部算法都列出来, 然后过滤掉有上面2点的算法, 剩下的算法就都是可以用在命令行上的.
另外开一篇笔记, 先这样.
对于支持口令加密的算法列表, 已经写程序+手工验证, 一共126种算法可用(openssl3.2 - exp - 可以在命令行使用的口令算法名称列表).
备注
经过实验, 可以看出
转换就是转换, 带口令就是带口令, 相互之间没关联.
如果要操作的PEM/DER是带口令保护的, 就需要给出口令选项 -passin pass:xxx, 来完成口令验证.
如果要转换后的PEM/DER带口令保护, 就需要给出口令选项 -passout pass:xxx -cipher, 其中cipher需要是openssl支持的算法名称.
PEM/DER之间的转换分为4种, PEM=>DER; DER=>PEM; PEM=> PEM, DER=>DER. 可以加选项是否带口令保护.
如果想让程序只能打开自己的带口令保护的PEM/DER, 可以将程序校验和(e.g. 加沙后的PE校验的SHA512 )相关内容作为口令, 这样就能做到一个程序只能用自己的唯一证书(程序先写好, 然后给程序发带口令保护的证书, 然后程序正常工作.).
如果逆向的人将程序改了, 证书就不能打开成功, 后续操作(非对称/对称解密)就会失败. 间接的保护了程序被非授权用户使用.