Ubuntu Server下Shell脚本调用OpenSSL读取CSV批量生成证书问题
批量生成OpenSSL用户证书实现方案
核心逻辑是逐行解析CSV内容,跳过表头行后将各字段动态传入OpenSSL的-subj参数,同时避免生成的证书、密钥文件重名覆盖。
字段对应关系
先明确CSV字段和OpenSSL证书主题字段的映射规则:
- CSV
Country字段 → 证书国家字段/C= - CSV
place字段 → 证书省份/州字段/ST= - CSV
city字段 → 证书城市字段/L= - CSV
company字段 → 证书组织字段/O= - CSV
nameuser字段 → 证书通用名字段/CN= - CSV
email字段 → 证书邮箱字段/emailAddress=
可直接运行的完整脚本
#!/bin/bash # 配置项:指定你的CSV文件路径 CSV_PATH="user_list.csv" # 可选:指定证书输出目录,不存在则自动创建 OUTPUT_DIR="./user_certs" mkdir -p "$OUTPUT_DIR" # 校验CSV文件是否存在 if [ ! -f "$CSV_PATH" ]; then echo "错误:指定的CSV文件不存在,请检查路径配置" exit 1 fi line_count=0 # 逐行读取CSV内容,兼容最后一行无换行符的情况 while IFS=',' read -r Country place city company nameuser email || [ -n "$Country" ]; do line_count=$((line_count + 1)) # 跳过第一行表头 if [ $line_count -eq 1 ]; then continue fi # 去除字段首尾多余的空白字符 Country=$(echo "$Country" | xargs) place=$(echo "$place" | xargs) city=$(echo "$city" | xargs) company=$(echo "$company" | xargs) nameuser=$(echo "$nameuser" | xargs) email=$(echo "$email" | xargs) # 校验必填字段非空 if [ -z "$Country" ] || [ -z "$nameuser" ] || [ -z "$email" ]; then echo "警告:第${line_count}行必填字段缺失,已跳过" continue fi echo "正在生成用户【${nameuser}】的证书..." # 动态传入参数生成证书,以用户名作为文件名避免覆盖 openssl req -x509 \ -newkey rsa:4096 \ -keyout "${OUTPUT_DIR}/${nameuser}.key" \ -out "${OUTPUT_DIR}/${nameuser}.crt" \ -days 365 \ -nodes \ -subj "/C=${Country}/ST=${place}/L=${city}/O=${company}/CN=${nameuser}/emailAddress=${email}" if [ $? -eq 0 ]; then echo "用户【${nameuser}】证书生成完成" else echo "错误:用户【${nameuser}】证书生成失败(行号:${line_count})" fi done < "$CSV_PATH" echo "所有记录处理完成,证书已保存至${OUTPUT_DIR}目录"
使用说明
- 将脚本中
CSV_PATH的值修改为你实际存放用户信息的CSV文件路径 - 给脚本添加可执行权限:
chmod +x script.sh - 执行脚本即可批量生成:
./script.sh
适配特殊场景的调整建议
- 如果CSV中
nameuser字段存在/、空格等特殊字符导致文件名异常,可将输出文件名替换为行号或邮箱命名,例如"${OUTPUT_DIR}/user_${line_count}.key" - 如果CSV字段值本身包含逗号(字段通常会用双引号包裹),可安装
csvkit工具,用csvread命令替代原生IFS拆分逻辑,避免字段解析错位 - 如需调整证书有效期、密钥长度,直接修改脚本中
-days、rsa:4096对应的参数值即可
内容的提问来源于stack exchange,提问作者Jota
相关产品推荐
相关产品推荐

