如何通过OpenSSL命令或Ansible模块从fullchain提取根证书与中间证书
从fullchain证书文件中提取根证书与中间证书
你可以通过OpenShell命令或Ansible模块实现需求,以下是具体方案:
使用OpenSSL命令实现
方法1:基于证书块顺序提取(适用于固定顺序的fullchain)
如果你的fullchain.crt始终遵循「服务器证书→中间证书→根证书」的顺序,直接用文本处理工具跳过第一个证书块即可:
使用sed命令
sed -n '/-----BEGIN CERTIFICATE-----/{:a;N;/-----END CERTIFICATE-----/!ba;2,$p}' fullchain.crt > intermediate_root.crt
说明:该命令会匹配每个完整的证书块,从第2个证书块开始打印,自动跳过第一个服务器证书。
使用awk命令
awk '/-----BEGIN CERTIFICATE-----/{i++} i>=2' fullchain.crt > intermediate_root.crt
说明:通过计数证书块的起始标记,仅打印第2个及之后的证书内容。
方法2:基于证书属性识别(适用于任意顺序的fullchain)
如果证书块顺序不固定,可以通过OpenSSL检查证书是否为CA证书(根/中间证书通常包含CA:TRUE属性):
#!/bin/bash input="fullchain.crt" output="intermediate_root.crt" # 分割fullchain为单个证书文件 csplit -z "$input" '/-----BEGIN CERTIFICATE-----/' '{*}' # 遍历每个分割后的证书,筛选CA证书 for cert in xx*; do if [ -s "$cert" ]; then openssl x509 -in "$cert" -noout -text | grep -q "CA:TRUE" && cat "$cert" >> "$output" fi done # 清理临时文件 rm -f xx*
说明:用csplit分割每个证书块,再逐一检查证书的CA属性,符合条件的证书会被写入目标文件。
使用Ansible模块实现
方式1:调用shell命令执行提取
直接在Ansible playbook中执行上述文本处理命令:
- name: 从fullchain提取根与中间证书(固定顺序场景) ansible.builtin.shell: | awk '/-----BEGIN CERTIFICATE-----/{i++} i>=2' fullchain.crt > intermediate_root.crt args: chdir: /path/to/your/cert/directory creates: intermediate_root.crt # 避免重复执行
方式2:基于CA属性动态提取
如果需要兼容任意证书顺序,使用以下playbook:
- name: 动态提取fullchain中的CA证书 ansible.builtin.shell: | csplit -z fullchain.crt '/-----BEGIN CERTIFICATE-----/' '{*}' for cert in xx*; do if [ -s "$cert" ]; then openssl x509 -in "$cert" -noout -text | grep -q "CA:TRUE" && cat "$cert" >> intermediate_root.crt fi done rm -f xx* args: chdir: /path/to/your/cert/directory creates: intermediate_root.crt
内容的提问来源于stack exchange,提问作者sangul
相关产品推荐
相关产品推荐

