引:
数字证书有多种格式,对于经过base64编码的证书而言,如果你将所有内容合并成一行,微软操作系统还是能正确解析的,然而如果你使用OpenSSL的x509命令解析,就会报错,可见,微软的兼容行太强了,特别是对自己的东西。 今日工作中遇到合为一行的数字证书,在windows下可以被认出,然而在Linux下却不行,于是需要将一行的证书分解为64个字符一行的证书,然后加上-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----,本文解析两种方式,完成将一行证书变为N行base64编码证书的方式,两种方式均使用vim。 零.初始数据: MIICBzCCAa8CCqwerC6hedfrvjAJBgabcdjOPQQBMIGKMQswCQYDVQQGEwJDTjELMAkGA1UECBMCU0gxETAPBgNVBAcTCFNoYW5na5678RYwFAYDVQQKEw1Lb2FsIFNvZnR3YXJlMRIwEAzGFpMLEwlTU0wgR1qazXAxDzANBgsdfgMTBmVjYy1jYTEeMBwGCSqGSIb3DQEJARYPZWNjLWNhQGtvYWwuY29tMB4XDTExMDExODsdfgUxM1oXDTExMDIxNzA0NDUxM1owgY4xCzAJBgNVBAYTAkNOMQswCQY2323IEwJTSDERMA8GA1UEBxMIU2hhbmdoYWkxFjAUBgNVBAoTDUtvYWwgU29mdHdhcmUxEuiopgNVBAsTCVNTTCBHcm91cDERMA8GA1UEAxMIZWNjLXVzZXIxIDAeBgkqhkiG9w0BCQEWEWV12341c2VyQGtvYWwuY29tMFkwEwYHKoZIzj0CAQYIKoEcgUUBgi0DQgAEl1iWcIeqYpigXDziJ4GS9M+23bE8qemaJvjpBOEXveF0eMJUN2udNJzHW/WpvTZrJC/mZsXnY+gdkAQIrXWjAJBgcqhkjOPQQBA0cAMEQCIGiWpXNEp4aKT2GzACBUvs0tZQLTanULKX/vTHZCv4FAiAb2s9u4G2SxgiEpWzhdMIuM3WsgbrazxsxSfLLG1234567 以上是初始数据,以一整行的方式保存了整个数字证书(以经过本人改写,毕竟证书不能随意暴露...),需要将之整理成每64个字符一行的base64编码方式,也就是OpenSSL的pem格式证书(去除头尾)。一.动态的方式 所谓动态的方式就是用“人的操作方式”进行换行符号的插入,无非就是64个字符作为间隔向前推进,然后插入回车符,因此可以使用如下步骤: 1.定位到64个字符处: 64l 2.进入插入模式: i 3.拍入回车: Enter 4.退出插入模式 Esc 5.重复1-4,重复N次,视文件大小而定 从以上步骤,我们发现,人为的操作其实是一系列确定而且重复的操作,因此我们希望使用诸如宏的方式来完成这个任务,vim拥有宏录制的功能,命令模式下输入qX就可以录制名为X的宏,因此我们只需要以下步骤就可以完成一个一整行证书的base64编码: <q>b #q开始录制名字是b的宏 64<l> #光标右移64个字符 <i> #进入插入模式 <Enter> #插入换行 <Esc> #退出插入模式 <q> #结束录制宏b num<@><b> #将宏b执行num次,视文件行大小而定 6.效果:和静态方式一样,见静态方式。 动态的方式肯定能完成这个任务,然而还有静态的方式二.静态的方式 静态方式是计算机使用的方式,计算机使用程序完成这个任务,虽然计算机程序最终也是人编写的。计算机程序完成64间隔字符换行的方式使用一种算法,这种算法明显不符合人的思维方式。正如人类会使用等差数列求和公式计算等差数列和然而计算机必须使用递推或者递归方式一样,计算机程序没有归纳的能力,不会使用公式,只能按步骤进行。 1.在一个新窗口打开help手册 :help 2.打开change.txt这个help页 :help change ... 3.找到了替换语法 :[range]s[ubstitute]/{pattern}/{string}/[&][c][e][g][p][r][i][I] [count] For each line in [range] replace a match of {pattern} with {string}. For the {pattern} see |pattern|. {string} can be a literal string, or something special; see |sub-replace-special|. ... 显然在特定位置插入换行是一个“特殊”的需求 4.打开sub-replace-special :help sub-replace-special 5.找到了以下的解释 magic nomagic action \0 replaced with the whole matched pattern *\0* *s/\0* 在s/orig/string/g中,orig是一个位置,该位置只能由正则表达式指定,其正则表达式为:.{64},而string则是一个换行符号,根据上面的解释,string应该为\0\r 6.退出help :q 8.开始修改:s/.\{64\}/\0\r/g 9.效果 MIICBzCCAa8CCqwerC6hedfrvjAJBgabcdjOPQQBMIGKMQswCQYDVQQGEwJDTjEL MAkGA1UECBMCU0gxETAPBgNVBAcTCFNoYW5na5678RYwFAYDVQQKEw1Lb2FsIFNv ZnR3YXJlMRIwEAzGFpMLEwlTU0wgR1qazXAxDzANBgsdfgMTBmVjYy1jYTEeMBwG CSqGSIb3DQEJARYPZWNjLWNhQGtvYWwuY29tMB4XDTExMDExODsdfgUxM1oXDTEx MDIxNzA0NDUxM1owgY4xCzAJBgNVBAYTAkNOMQswCQY2323IEwJTSDERMA8GA1UE BxMIU2hhbmdoYWkxFjAUBgNVBAoTDUtvYWwgU29mdHdhcmUxEuiopgNVBAsTCVNT TCBHcm91cDERMA8GA1UEAxMIZWNjLXVzZXIxIDAeBgkqhkiG9w0BCQEWEWV12341 c2VyQGtvYWwuY29tMFkwEwYHKoZIzj0CAQYIKoEcgUUBgi0DQgAEl1iWcIeqYpig XDziJ4GS9M+23bE8qemaJvjpBOEXveF0eMJUN2udNJzHW/WpvTZrJCYp/mZsXnY+ gdkAQIrXWjAJBgcqhkjOPQQBA0cAMEQCIGiWpXNEp4aKT2GzACBUvs0tZQLTan/U LKX/vTHZCv4FAiAb2s9u4G2SxgiEpWzhdMIuM3WsgbrazxsxSfLLG1234567 10.然而!然而 然而为什么在这个任务中,计算机程序使用了公式(正则表达式),而人类的方式却使用了按照步骤的方式(录制宏)呢?... 注释:上述第9点是动态方式和静态方式共同的结果。