如何在Xcode构建时通过Shell脚本访问并加密PEM文件?
问题解答
关于你提到的OpenSSL命令的纠正
你给出的命令openssl pkcs12 -in path.p12 -out encrypted.key.pem -nocerts -nodes并不是用.p12加密.pem文件,它的实际作用是:从PKCS#12格式的证书文件(.p12)中提取出私钥,并导出为未加密的PEM格式文件。各参数含义:
-nocerts:只导出私钥,不包含证书部分-nodes:导出的私钥不设置额外加密(即输出的PEM文件是明文私钥)
如果你的需求是用.p12里的密钥来加密另一个.pem文件,这个命令并不适用,需要用其他OpenSSL命令组合实现。
Xcode构建阶段访问项目文件并执行加密操作的步骤
1. 定位项目中的文件路径
在Xcode构建脚本中,可通过环境变量${SRCROOT}获取项目根目录路径。假设你的.p12和.pem文件直接放在项目根目录下,那么它们的路径分别是:
.p12文件路径:${SRCROOT}/your_file.p12.pem文件路径:${SRCROOT}/target_file.pem
如果文件在子文件夹里(比如Resources目录),路径就是${SRCROOT}/Resources/your_file.p12,依此类推。
2. 添加Run Script构建阶段
- 打开Xcode,选中你的Target
- 切换到
Build Phases标签页 - 点击左上角的
+按钮,选择New Run Script Phase - 将新的Run Script阶段拖到合适的位置(比如在
Copy Bundle Resources之前)
3. 编写Shell脚本
根据你的实际需求修改脚本内容:
- 如果是从.p12导出私钥(即你原来的命令场景),脚本示例:
# 设置文件路径 P12_PATH="${SRCROOT}/your_file.p12" OUTPUT_PEM_PATH="${SRCROOT}/output_key.pem" # 执行导出命令,注意替换为你的.p12密码 openssl pkcs12 -in "$P12_PATH" -out "$OUTPUT_PEM_PATH" -nocerts -nodes -passin pass:your_p12_password
- 如果是用.p12中的密钥加密目标.pem文件,需要先从.p12导出公钥,再用公钥加密.pem,脚本示例:
# 1. 从.p12导出公钥到临时文件 P12_PATH="${SRCROOT}/your_file.p12" TEMP_PUB_KEY="${SRCROOT}/temp_pubkey.pem" openssl pkcs12 -in "$P12_PATH" -nokeys -clcerts -out "$TEMP_PUB_KEY" -passin pass:your_p12_password # 2. 用公钥加密目标.pem文件 TARGET_PEM="${SRCROOT}/target_file.pem" ENCRYPTED_OUTPUT="${SRCROOT}/encrypted_target.pem" openssl rsautl -encrypt -pubin -inkey "$TEMP_PUB_KEY" -in "$TARGET_PEM" -out "$ENCRYPTED_OUTPUT" # 3. 删除临时公钥文件(可选) rm "$TEMP_PUB_KEY"
4. 安全处理密码
不要把密码明文写在脚本里,建议通过以下方式设置:
- 在Xcode的Scheme中添加环境变量:编辑Scheme -> Run -> Arguments -> Environment Variables,添加
P12_PASSWORD并设置值 - 脚本中用
${P12_PASSWORD}代替明文密码,比如-passin pass:${P12_PASSWORD}
内容的提问来源于stack exchange,提问作者nirav
相关产品推荐
相关产品推荐

