You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Linux脚本反转CER文件中的证书块?

如何用Linux脚本反转CER文件中的证书块?

假设你有一个名为mycert.cer的文件,内容如下:

-----BEGIN CERTIFICATE-----
this is sentence1
this is sentence2
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence3
this is sentence4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence5
this is sentence6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence7
this is sentence8
-----END CERTIFICATE-----

期望输出为:

-----BEGIN CERTIFICATE-----
this is sentence7
this is sentence8
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence5
this is sentence6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence3
this is sentence4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence1
this is sentence2
-----END CERTIFICATE-----

你尝试了以下命令,但得到错误结果:

tac -s'-----BEGIN CERTIFICATE-----' mycert.cer | awk '/-----BEGIN CERTIFICATE-----/, /-----END CERTIFICATE-----/'

错误输出:

-----BEGIN CERTIFICATE-----
this is sentence3
this is sentence4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence1
this is sentence2
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE----------BEGIN CERTIFICATE-----

解决方案

方法1:使用awk分组反转

这个方法会把每个证书块作为整体存储,最后反向输出:

awk '
    /-----BEGIN CERTIFICATE-----/ { if (block != "") blocks[++n] = block; block = "" }
    { block = block $0 "\n" }
    END { 
        blocks[++n] = block; 
        for (i = n; i >= 1; i--) print blocks[i] 
    }
' mycert.cer

原理:

  • 遇到证书开始标记时,将之前积累的块存入数组(如果存在),重置当前块
  • 逐行积累当前块的内容
  • 处理完所有行后,将最后一个块存入数组,从后往前遍历数组输出每个块

方法2:结合tac和sed修正分隔符问题

你之前用tac的问题在于分隔符被截断,且处理后开头分隔符重复。可以通过自定义分隔符规避这个问题:

sed 's/-----BEGIN CERTIFICATE-----/XXXSEPXXX&/' mycert.cer | tac -s'XXXSEPXXX' | sed '/^XXXSEPXXX/d'

原理:

  • 先用sed给每个证书开始标记前加自定义分隔符XXXSEPXXX
  • 用tac以该分隔符为单位反转内容
  • 最后用sed清理掉多余的自定义分隔符

方法3:使用csplit拆分后反向合并

如果系统自带csplit工具,可先拆分证书块再反向合并:

csplit -z mycert.cer '/-----BEGIN CERTIFICATE-----/' '{*}' && cat xx[0-9][0-9] | tac && rm xx[0-9][0-9]

原理:

  • csplit按证书开始标记将文件拆分为多个临时文件(xx00、xx01等)
  • tac反向输出这些临时文件的内容
  • 最后删除临时文件

内容的提问来源于stack exchange,提问作者user1068636

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:15:20