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

相关推荐
Lsetea3 天前
证书没到期却报certificate has expired:OpenSSL定位中间证书与系统时间
运维·https·ssl证书·openssl·证书链
Lsetea4 天前
Nginx报No required SSL certificate was sent:mTLS客户端证书排查
运维·nginx·https·ssl·openssl
Lsetea5 天前
部署证书后提示“证书名称与输入不匹配”:Safari 报错的三层排查
nginx·https·safari·ssl证书·openssl
Lsetea6 天前
OpenSSL快速生成域名证书:含SAN的自签命令、验证与排错
nginx·https·ssl证书·openssl·自签证书
Lsetea10 天前
CDN换了SSL证书仍显示旧证书?按边缘节点、SNI和缓存逐层排查
https·cdn·ssl证书·openssl·tls
Lsetea11 天前
Nginx HTTPS证书域名不匹配:用SAN与SNI定位 ERR_CERT_COMMON_NAME_INVALID
nginx·https·ssl证书·openssl·tls
bosins15 天前
Windows IIS 配置本地HTTPS 全流程指南:自签名证书 + 端口绑定 + 避坑详解
powershell·openssl
Lsetea19 天前
Nginx报SSL_CTX_use_PrivateKey failed:证书与私钥不匹配怎么排查
nginx·https·ssl证书·openssl·私钥
Lsetea21 天前
SSL证书快过期怎么自动检查:用OpenSSL checkend做7天预警与线上证书验收
https·ssl证书·openssl·systemd·证书监控
蜡台1 个月前
本机 局域网 搭建本地 HTTPS 域名完整方案
网络协议·http·https·openssl