Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 自动将PEM文件拆分为多个证书_Batch File_Ssl_Scripting_Openssl_Certificate - Fatal编程技术网

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

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文件拆分为多个PEM文件的过程。我正在考虑使用一个批处理脚本,该脚本将抓取PEM,并在每次发现时进行分离:

-----开始证书-----

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

然而,这似乎有点“黑客”,我希望OpenSSL会有一个工具,可以做到这一点,但我似乎找不到任何东西

这样做的最佳方式是什么

我希望OpenSSL会有一个工具,可以做到这一点

我不知道有什么OpenSSL函数或OpenSSL工具可以做到这一点。从源代码来看,
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
  • 下面是
    ----
我使用了四个索引——每个标记一个索引。我会一次读取64+1字节,因为OpenSSL以64个字符输出其中断。我将一行读入一个
字符串
,并将该字符串连接到累加器中。然后,我将使用
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编码密钥(不是证书)。例如,它将连接多个不带换行符的键,它将删除一个尾随破折号,它将删除一个尾随破折号,然后连接另一个