- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要找出一种方法来自动将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/
我有一个数组列表: ArrayList allText = new ArrayList(); 其内容是这样的: [Alabama - Montgomery, Alaska - Juneau, Ariz
我有一个 timestamp 格式的开始和结束时间。我想将它们分成多个时间段,例如 1 小时。 $t1 = strtotime('2010-05-06 12:00:00'); $t2 = strtot
我需要将 span10 分成 3 列,但我无法将它们排列起来。我应该在 span10 中添加一个 span12 还是使用 offset 还是??
我有一个时间序列。我想从早上 8 点到第二天早上 7:59 分成 24 小时的区 block 。我知道如何按日期分组,但我尝试过使用 TimeGroupers 和 DateOffsets 处理这个 8
我收到“街道号码邮政编码城市”形式的地址(作为字符串)。我想要做的是将街道和号码与邮政编码和城市分开。通常你可以按空格分割。但有些街道名称中也有空格,例如:“Emile Van Ermengemlaa
我有一个用户列表。其中一些用户处于第一状态,而其他用户处于第二状态。所以我想要的是将这个列表显示为首先,它按排序顺序显示存在 = 1 的用户,然后按排序顺序显示存在 = 2 的用户。这里的排序是根据用
我感觉我搜索了整个网络,但找不到一种方法将不同高度的 div 很好地划分为 3 列,就像 http://www.ing.nl 上那样 headertekst headerteksttesth
Bootstrap 3 按钮下拉菜单出现问题。你可以在这里看到我的两个例子: http://www.bootply.com/W1dLusilMk http://www.bootply.com/GGBv
我在 php 中执行以下操作 foreach($QuestionAsekd as $k => $v){ $grp_name = $v['NAME']; $groupValues[$gr
我找到了一种用pandas解析html的绝妙方法。我的数据格式有点奇怪(见下文)。我想将这些数据拆分为 2 个单独的数据帧。 注意每个单元格如何由,分隔...是否有任何真正有效的方法来分割所有这些单元
HTML 看起来像这样,但我不允许对其进行更改。我只能编写 CSS 将其变成 2 列。 Povezave www.behance.net www.kiberpipa.org www.o
假设我有以下数据框“A” utilization utilization_billable service 1
我需要将 2 个文本框拉伸(stretch)到 100% 的浏览器宽度,以及一个提交按钮。所有三个都应该在一行中,我试图拉伸(stretch)它但它没有发生......有什么想法吗? 代码: .sea
我是一名优秀的程序员,十分优秀!