openssl3.2 - exp - PEM <==> DER

文章目录

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 )相关内容作为口令, 这样就能做到一个程序只能用自己的唯一证书(程序先写好, 然后给程序发带口令保护的证书, 然后程序正常工作.).

如果逆向的人将程序改了, 证书就不能打开成功, 后续操作(非对称/对称解密)就会失败. 间接的保护了程序被非授权用户使用.

END

相关推荐
Lsetea1 天前
curl设置SSL_CERT_FILE仍报60:CURL_CA_BUNDLE与CA路径优先级排查
linux·https·ssl证书·openssl·curl
Lsetea2 天前
OpenSSL报certificate rejected:error 28与CA辅助信任属性排查
linux·https·ssl证书·openssl·证书链
Lsetea3 天前
OpenSSL报certificate revoked:error 23与CRL吊销层级排查
linux·https·ssl证书·openssl·crl
Lsetea4 天前
OpenSSL报certificate chain too long:error 22与verify_depth深度排查
linux·https·ssl证书·openssl·证书链
Lsetea5 天前
OpenSSL读取加密私钥报bad decrypt:passin与口令来源排查
linux·https·ssl证书·openssl·私钥
Lsetea5 天前
OpenSSL报CA signature digest algorithm too weak:error 68与签名摘要排查
https·ssl证书·openssl·签名算法·证书链
Lsetea6 天前
curl报91 No OCSP response received:cert-status与OCSP装订排查
https·ssl证书·openssl·curl·ocsp
Lsetea6 天前
OpenSSL报self-signed certificate in certificate chain:error 19与信任根排查
https·ssl证书·openssl·curl·证书链
Lsetea7 天前
curl报58 unable to set private key file:客户端证书与私钥加载排查
运维·https·ssl证书·openssl·curl