Batch file 自动将PEM文件拆分为多个证书
我需要找到一种方法来自动化将一个PEM文件拆分为多个PEM文件的过程。我正在考虑使用一个批处理脚本,该脚本将抓取PEM,并在每次发现时进行分离: -----开始证书----- 到 -----结束证书----- 然而,这似乎有点“黑客”,我希望OpenSSL会有一个工具,可以做到这一点,但我似乎找不到任何东西 这样做的最佳方式是什么 我希望OpenSSL会有一个工具,可以做到这一点 我不知道有什么OpenSSL函数或OpenSSL工具可以做到这一点。从源代码来看,Batch file 自动将PEM文件拆分为多个证书,batch-file,ssl,scripting,openssl,certificate,Batch File,Ssl,Scripting,Openssl,Certificate,我需要找到一种方法来自动化将一个PEM文件拆分为多个PEM文件的过程。我正在考虑使用一个批处理脚本,该脚本将抓取PEM,并在每次发现时进行分离: -----开始证书----- 到 -----结束证书----- 然而,这似乎有点“黑客”,我希望OpenSSL会有一个工具,可以做到这一点,但我似乎找不到任何东西 这样做的最佳方式是什么 我希望OpenSSL会有一个工具,可以做到这一点 我不知道有什么OpenSSL函数或OpenSSL工具可以做到这一点。从源代码来看,PEM\u bytes\u rea
PEM\u bytes\u read\u bio
可能是执行此操作的功能。但它没有记录,所以我不确定。(函数名以大写字母开头-PEM.*
。各种小写字母-PEM.*
是私有的,不应使用)
如果您手头有,那么解析例程的源代码在/crypto/pem/pem_lib.c
中。这就是实现PEM\u bytes\u read\u bio
的地方
然而,这似乎有点“黑客” 好吧,这并不是那么简单——你必须卷起袖子,把它编码好。您可能可以使用Bison和Flex来创建解析器和lexer。你如何从外壳上称它是一个不同的故事。使用lexer,我认为您可以在O(n)中解析PEM对象
我需要找到一种方法来自动化将一个PEM文件拆分为多个PEM文件的过程。。。这样做的最佳方式是什么 我在上为Crypto++编写了类似的代码。它增加了对PEM编码密钥的支持,包括加密密钥。CufOT++是一个C++库,但同样的通用算法应该与你选择的语言很好地结合。 Crypto++中感兴趣的例程称为
PEM_NextObject
,它位于源文件PEM-rd.cpp
中。您可以在页面底部的ZIP文件中找到源文件<代码>PEM_NextObject查找了四项:
- 前导的
----BEGIN
- 下面是
----
- 尾随的
----END
- 下面是
----
字符串
,并将该字符串连接到累加器中。然后,我将使用find
在累加器中定位令牌(一些手动放弃,因为它们是安全字符串)。如果我没有找到一个特定的索引,我会读另一行
搜索令牌时,第一个令牌的搜索从位置0开始。在找到上一个索引后开始下一次搜索。例如,索引2的搜索从索引1加上令牌的大小开始;索引3的搜索从索引2加上令牌的大小开始。如果找不到标记,我只搜索当前行,如果标记跨越前一次读取和当前读取,则继续搜索10个字符
我使用索引而不是迭代器,因为如果容器的大小增加,迭代器将失效。连接可能会导致这种情况。幸运的是,索引始终有效,因为它只是字符串开头的偏移量。在bash(或您选择的任何东西)中可能没有这个问题
如果我读到流的末尾而没有找到所有四个索引,那么我抛出了一个错误
如果我找到了所有四个索引,那么我就有了声称是PEM编码的东西。我丢弃了所有的前导字符,并删除了尾随空格。因此,PEM对象位于(Index1)
到(Index4+5)
(+5表示后面的----
)
因为我可能解析了无效的PEM对象(即,----BEGIN FOO-----
和----END BAR-----
),所以我需要另一个例程来分类解析的PEM对象的类型。该函数称为PEM\u GetType
该算法应该能够很好地工作,因为从算法分析的角度来看,该算法并不过分,而且PEM对象通常很小(小于2K或4K)。我认为分析是O(n+m*10),其中m是文件中的行数。m*10基于扫描64个字符的行以查找具有10个字符“倒带”的令牌,读取另一行,然后再次扫描令牌。回想一下,我“倒带”了一点,以防令牌跨越行
如果没有PEM对象且文件较大,则此算法执行正常。我很确定,在更坏的情况下,它也会运行在O(n+m*10)中。如果n>>m
,那么它本质上是一个O(n)函数,因为m*10
只是一个大的边界c
您可能还对服务器故障和堆栈溢出感兴趣
-----开始证书------到------结束证书----- 显示证书时,还有其他类型的对象。例如,公钥和加密私钥。如果需要解密加密密钥,则需要提升/借用/使用OpenSSL
EVP_BytesToKey
是一种非标准操作,因此它成为一种复制/粘贴操作,以确保互操作性。我似乎记得EVP_BytesToKey
相当于PKCS#5派生如果EVP_BytesToKey
产生的字节数小于等于16。如果生成了17个或更多,那么OpenSSL将使用“非标准”扩展
如果您对测试感兴趣,请查看
pem create keys.sh
。它会创建格式错误的PEM编码密钥(不是证书)。例如,它将连接多个不带换行符的键,它将删除一个尾随破折号,它将删除一个尾随破折号,然后连接另一个