gpt4 book ai didi

batch-file - 自动将PEM文件拆分为多个证书

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:03 25 4
gpt4 key购买 nike

我需要找出一种方法来自动将PEM文件拆分为多个PEM文件。我正在考虑利用一个批处理脚本,该脚本将在每次发现PEM时将其分离:


  ----- BEGIN证书-----





  -----结束证书-----


但是,这似乎有些“ hacky”。我希望OpenSSL拥有一个能够做到这一点的工具,但我似乎什么也找不到。

最好的方法是什么?

最佳答案

我希望OpenSSL拥有一个可能能够执行的工具


我不知道要使用OpenSSL函数或OpenSSL工具。从源头来看,PEM_bytes_read_bio可能是这样做的功能。但是它没有记录,所以我不确定。 (函数名称以大写字母-PEM_*开头。各种小写字母-pem_*是私有的,不应使用)。

如果方便使用OpenSSL sources,则解析例程的源代码位于<openssl src>/crypto/pem/pem_lib.c中。这就是实现PEM_bytes_read_bio的地方。




  但是,这似乎有些“ hacky”。


嗯,它并不是那么多技巧-您必须卷起袖子并编写代码。您也许可以使用Bison和Flex创建解析器和词法分析器。从外壳如何称呼它是另一回事。使用词法分析器,我认为您可以解析O(n)中的PEM对象。




  我需要找出一种自动将PEM文件拆分为多个PEM文件的过程。什么是最好的方法?


我在PEM Pack为Crypto ++编写了类似的文章。它增加了对PEM编码密钥(包括加密密钥)的支持。 Crypto ++是一个C ++库,但是相同的通用算​​法应该可以与您选择的语言一起很好地工作。

Crypto ++中感兴趣的例程称为PEM_NextObject,它位于源文件pem-rd.cpp中。您可以在页面底部的ZIP文件中找到源文件。 PEM_NextObject寻找了四个项目:


前导-----BEGIN
以下-----
尾随-----END
以下-----


我使用了四个索引-每个标记一个。我会一次读取64 + 1个字节,因为OpenSSL以64个字符输出其中断。我将一行读入string并将字符串连接到一个累加器中。然后,我将使用find将令牌定位在累加器中(有些放弃了,因为它们是安全字符串)。如果找不到特定的索引,我会读另一行。

搜索令牌时,对第一个令牌的搜索始于位置0。找到下一个索引后,开始下一个搜索。例如,从索引1开始加上索引的大小开始搜索索引2。搜索索引3从索引2加上令牌的大小开始。如果未找到令牌,我将仅搜索当前行和10个字符,以防令牌跨越先前的读取和当前的读取。

我使用索引而不是迭代器,因为如果增加容器的大小,则迭代器将无效。串联会导致这种情况。幸运的是,索引始终有效,因为它只是从字符串开头的偏移量。您在bash中(或您选择的任何东西)可能没有这个问题。

如果我在没有找到所有四个索引的情况下读到流的末尾,则抛出错误。

如果我找到所有四个索引,那么我就有声称是PEM编码的东西。我丢弃了所有前导字符,并修剪了结尾的空格。因此,PEM对象位于(Index1)(Index4 + 5)(尾随-----为+5)。

因为我可能已经解析了无效的PEM对象(即-----BEGIN FOO----------END BAR-----),所以我需要另一个例程来对已解析的PEM对象的类型进行分类。该功能称为PEM_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

您可能也对服务器故障上的How to split a PEM file和堆栈溢出上的Where is the PEM file format specified?感兴趣。




  ----- BEGIN证书-----至----- END证书-----


显示证书时,还有其他类型的对象。例如,公钥和加密的私钥。如果需要解密加密的密钥,则需要提升/借用/使用OpenSSL的EVP_BytesToKey

EVP_BytesToKey是非标准的,因此它成为复制/粘贴操作,以确保互操作性。我似乎还记得,如果EVP_BytesToKey产生的字节数等于或小于16,则EVP_BytesToKey等效于PKCS#5派生。如果产生了17个或更多,则OpenSSL使用“非标准”扩展名。



如果您对测试感兴趣,请查看pem-create-keys.sh。它创建格式错误的PEM编码的密钥(不是证书)。例如,它将串联多个键而没有换行符,它将删除尾随的破折号之一,并且它将删除尾随的破折号之一,然后串联另一个键。

关于batch-file - 自动将PEM文件拆分为多个证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25069638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com