1. 环境准备与基础概念
在银河麒麟服务器操作系统上构建私有CA并签发代码签名证书,首先需要理解几个核心概念。就像盖房子需要打地基一样,搭建证书体系也需要先做好准备工作。
什么是私有CA?简单来说,它就像你自己家的"派出所",可以给自己人发"身份证"(证书)。与公共CA(如VeriSign)不同,私有CA颁发的证书只在你的组织内部被信任,特别适合企业内部软件分发和安全管控。
在开始之前,请确保你的银河麒麟系统已经安装好OpenSSL工具包。可以通过以下命令检查:
rpm -qa openssl如果系统提示未安装,使用yum命令安装(在线环境):
yum install -y openssl openssl-devel如果是离线环境,需要提前下载好对应架构的RPM包,用rpm命令手动安装。这里有个小技巧:银河麒麟V10通常自带OpenSSL 1.1.1版本,建议先检查现有版本是否满足需求,避免版本冲突。
2. 配置OpenSSL环境
OpenSSL的配置文件是整套体系的"交通规则",位于/etc/pki/tls/openssl.cnf。这个文件定义了证书生成的各项参数,就像城市规划图一样重要。
2.1 关键目录结构
先来看看默认的PKI目录结构:
/etc/pki/ ├── CA/ # CA根目录 │ ├── certs/ # 已签发证书存放处 │ ├── crl/ # 证书吊销列表 │ ├── newcerts/ # 新签发证书备份 │ └── private/ # 私钥保管处(务必保密!) └── tls/ └── openssl.cnf # 主配置文件建议先在/etc/pki/CA下创建必要的文件:
mkdir -p /etc/pki/CA/{certs,crl,newcerts,private} touch /etc/pki/CA/index.txt echo "01" > /etc/pki/CA/serial chmod 700 /etc/pki/CA/private2.2 修改openssl.cnf
找到配置文件中的[ CA_default ]段,确保以下关键参数正确:
dir = /etc/pki/CA # CA根目录 certificate = $dir/cacert.pem # CA证书路径 private_key = $dir/private/cakey.pem # CA私钥路径对于代码签名证书,特别要注意keyUsage设置。在[ usr_cert ]段添加:
keyUsage = digitalSignature, nonRepudiation extendedKeyUsage = codeSigning这就像给证书打上"仅限代码签名"的标签,避免证书被滥用。
3. 创建根证书
建立私有CA就像成立一家公司,首先需要注册营业执照(根证书)。这个过程分为三步:生成私钥 → 创建证书请求 → 自签名。
3.1 生成CA私钥
使用2048位RSA算法生成私钥:
openssl genrsa -aes256 -out /etc/pki/CA/private/cakey.pem 2048这里使用了AES256加密私钥,系统会提示输入密码。如果觉得每次输入密码麻烦,可以去掉-aes256参数,但安全性会降低。
3.2 创建证书请求
生成CSR(证书签名请求):
openssl req -new -key /etc/pki/CA/private/cakey.pem \ -out /etc/pki/CA/careq.pem \ -config /etc/pki/tls/openssl.cnf这里会交互式询问证书信息,有几个字段需要注意:
- Country Name:使用两位国家代码,如CN
- Common Name:建议用公司域名,如"Company Root CA"
- Organizational Unit:可以填写"Certificate Authority"
3.3 自签名根证书
最后一步给自己颁发证书:
openssl ca -create_serial -out /etc/pki/CA/cacert.pem \ -days 3650 -keyfile /etc/pki/CA/private/cakey.pem \ -selfsign -extensions v3_ca \ -infiles /etc/pki/CA/careq.pem这里设置了10年有效期(3650天)。完成后,可以用命令查看证书详情:
openssl x509 -in /etc/pki/CA/cacert.pem -noout -text4. 签发代码签名证书
有了根证书,现在可以给开发者或构建服务器颁发代码签名证书了。这就像公司给员工发工作证。
4.1 生成签名密钥对
先为签名证书创建私钥:
openssl genrsa -aes256 -out codesign.key 20484.2 创建证书请求
生成CSR时,特别注意CN字段要标识使用者身份:
openssl req -new -key codesign.key \ -out codesign.csr \ -config /etc/pki/tls/openssl.cnf在交互过程中,建议这样填写:
- Organization Name:软件开发商名称
- Common Name:最好包含"Code Signing"字样
4.3 签发证书
使用CA签发代码签名证书:
openssl ca -config /etc/pki/tls/openssl.cnf \ -extensions usr_cert -days 730 -notext \ -in codesign.csr -out codesign.crt这里设置了2年有效期(730天)。关键点是-extensions usr_cert,它会应用之前在配置文件中设置的Key Usage。
5. 证书格式转换与使用
不同平台需要不同格式的证书文件,就像电器需要适配不同国家的插座。
5.1 生成PFX/PKCS12文件
Windows平台通常使用PFX格式:
openssl pkcs12 -export -inkey codesign.key \ -in codesign.crt -certfile /etc/pki/CA/cacert.pem \ -out codesign.pfx系统会提示设置导出密码,这个密码在安装证书时需要输入。
5.2 生成P7B证书链
有些场景需要完整的证书链:
openssl crl2pkcs7 -nocrl -certfile codesign.crt \ -certfile /etc/pki/CA/cacert.pem \ -out codesign.p7b -outform DER5.3 在银河麒麟上使用证书
对二进制文件签名的典型命令:
openssl smime -sign -binary -in app.bin \ -out app.signed -signer codesign.crt \ -inkey codesign.key -certfile /etc/pki/CA/cacert.pem验证签名:
openssl smime -verify -binary -in app.signed \ -content app.bin -CAfile /etc/pki/CA/cacert.pem6. 常见问题排查
在实际操作中可能会遇到这些问题:
问题1:签名时报错"unable to load CA private key"
- 检查私钥路径是否正确
- 如果私钥有密码保护,确保正确输入
问题2:系统不信任签名
- 确保根证书已导入系统的信任存储
- 检查证书的扩展密钥用法是否包含代码签名
问题3:证书链验证失败
- 使用
openssl verify -CAfile cacert.pem codesign.crt检查链完整性 - 确保证书没有过期
有个实用技巧:可以用openssl x509 -purpose -in cert.crt查看证书的预期用途,确认是否适合代码签名。