1. 银河麒麟与OpenSSL证书服务器的完美组合
在国产化替代的大背景下,银河麒麟服务器操作系统凭借其高安全性和稳定性,正在越来越多的关键领域替代传统Linux发行版。作为国产操作系统的代表,银河麒麟V10 SP1版本对OpenSSL的支持已经相当成熟,能够完美胜任企业级证书服务器的搭建工作。
我最近在一个金融项目中负责证书服务器的迁移工作,将原本运行在CentOS上的证书服务完整迁移到了银河麒麟平台。实测下来,整个迁移过程非常顺畅,性能表现甚至比原系统提升了约15%。这主要得益于银河麒麟对国产硬件的深度优化,特别是在加密运算方面的加速支持。
OpenSSL作为SSL/TLS协议的开源实现,是目前最流行的证书管理工具。在银河麒麟上,OpenSSL的默认安装路径是/etc/pki/tls/,这个目录结构清晰,包含了证书服务器所需的所有关键文件。与CentOS相比,银河麒麟的OpenSSL配置更加注重安全性,默认就启用了更强的加密算法。
2. 环境准备与OpenSSL配置
2.1 系统环境检查
在开始之前,我们需要确认系统环境是否符合要求。执行以下命令检查银河麒麟版本和OpenSSL版本:
cat /etc/os-release openssl version银河麒麟V10 SP1通常预装的是OpenSSL 1.1.1版本,这个版本支持最新的加密标准,也兼容传统的证书操作。如果系统没有安装OpenSSL,可以通过以下命令安装:
yum install -y openssl openssl-devel对于离线环境,需要提前下载好对应架构的RPM包。银河麒麟支持x86和ARM两种架构,务必确认下载的包与系统架构匹配。我曾经在一个政府项目中就遇到过因为架构不匹配导致的安装失败,浪费了半天时间排查。
2.2 OpenSSL核心配置文件解析
OpenSSL的配置文件位于/etc/pki/tls/openssl.cnf,这是整个证书体系的"大脑"。这个文件主要分为四个关键部分:
- 默认段:定义基础配置和路径
- CA段:证书颁发机构相关设置
- req段:证书请求相关设置
- tsa段:时间戳相关设置
对于证书服务器来说,最需要关注的是CA段的配置。以下是一个典型的CA段配置示例:
[ CA_default ] dir = /etc/pki/CA certs = $dir/certs crl_dir = $dir/crl database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/cacert.pem serial = $dir/serial crlnumber = $dir/crlnumber private_key = $dir/private/cakey.pem在实际项目中,我建议将dir修改为/etc/pki/CA,这样更符合银河麒麟的目录规范。同时要确保所有路径对应的目录都存在,否则后续操作会报错。
3. 根证书的创建与管理
3.1 生成CA私钥
根证书是整个证书体系的信任基础,其安全性至关重要。我们使用2048位RSA算法生成私钥:
openssl genrsa -aes256 -out /etc/pki/CA/private/cakey.pem 2048这里使用了aes256加密私钥,系统会提示输入密码。一定要记住这个密码,后续每次使用私钥时都需要提供。我曾经因为忘记密码不得不重新生成整套证书体系,教训深刻。
对于生产环境,建议将私钥的权限设置为仅root可读:
chmod 400 /etc/pki/CA/private/cakey.pem3.2 创建根证书
有了私钥后,我们可以创建自签名的根证书。首先准备必要的文件:
touch /etc/pki/CA/index.txt echo 1000 > /etc/pki/CA/serial然后生成根证书:
openssl req -new -x509 -days 3650 -key /etc/pki/CA/private/cakey.pem \ -out /etc/pki/CA/cacert.pem -config /etc/pki/tls/openssl.cnf这个命令会交互式地询问证书信息,包括国家、省份、组织等。在企业环境中,这些信息需要统一规范,特别是以下几个字段:
- Country Name (2 letter code):国家代码,CN表示中国
- State or Province Name:省份全称
- Organization Name:公司全称
- Common Name:根证书的通用名,建议使用"公司名 Root CA"的格式
生成的cacert.pem就是我们的根证书,可以分发给所有需要验证证书的客户端。
4. 多域名证书的签发实战
4.1 多域名证书的优势与场景
传统的SSL证书通常只绑定一个域名,这在现代Web应用中越来越不够用。多域名证书(SAN证书)允许一个证书绑定多个域名,非常适合以下场景:
- 同一服务的不同域名访问
- 主域名和多个子域名
- 包含备用域名和IP地址
- 微服务架构中的服务间通信
我在一个电商平台项目中就使用多域名证书同时覆盖了api.example.com、static.example.com和支付专用的pay.example.com,大大简化了证书管理工作。
4.2 创建多域名证书请求
首先为应用服务器生成私钥:
openssl genrsa -out /etc/pki/CA/private/server.key 2048然后创建证书请求配置文件server.cnf:
[req] distinguished_name = req_distinguished_name req_extensions = v3_req prompt = no [req_distinguished_name] C = CN ST = Beijing L = Beijing O = Example Inc OU = IT Dept CN = www.example.com [v3_req] keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = www.example.com DNS.2 = api.example.com DNS.3 = pay.example.com IP.1 = 192.168.1.100使用这个配置文件生成证书请求:
openssl req -new -key /etc/pki/CA/private/server.key \ -out /etc/pki/CA/certs/server.csr -config server.cnf4.3 签发多域名证书
使用CA的根证书签发服务器证书:
openssl ca -in /etc/pki/CA/certs/server.csr \ -out /etc/pki/CA/certs/server.crt \ -cert /etc/pki/CA/cacert.pem \ -keyfile /etc/pki/CA/private/cakey.pem \ -extensions v3_req -config /etc/pki/tls/openssl.cnf这个过程会使用CA的私钥对证书请求进行签名,生成最终的服务器证书server.crt。查看证书内容可以确认包含的所有域名:
openssl x509 -in /etc/pki/CA/certs/server.crt -noout -text在输出中应该能看到X509v3 Subject Alternative Name字段,列出了所有绑定的域名和IP地址。
5. 证书的部署与验证
5.1 证书格式转换
不同系统对证书格式的要求不同。银河麒麟默认生成PEM格式的证书,而Windows系统通常使用PFX格式。我们可以进行格式转换:
openssl pkcs12 -export -inkey /etc/pki/CA/private/server.key \ -in /etc/pki/CA/certs/server.crt -out server.pfx这个命令会生成一个包含私钥和证书的PFX文件,适合在IIS等Windows服务中使用。记得设置一个强密码来保护PFX文件。
5.2 证书链文件
为了让客户端能够验证服务器证书,需要提供完整的证书链。创建证书链文件:
cat /etc/pki/CA/certs/server.crt /etc/pki/CA/cacert.pem > chain.pem在Nginx配置中,可以这样使用证书链:
server { listen 443 ssl; server_name www.example.com; ssl_certificate /path/to/chain.pem; ssl_certificate_key /path/to/server.key; # 其他SSL配置... }5.3 证书验证
验证证书是否有效:
openssl verify -CAfile /etc/pki/CA/cacert.pem /etc/pki/CA/certs/server.crt如果一切正常,输出应该是"/etc/pki/CA/certs/server.crt: OK"。
在实际部署中,我习惯用openssl s_client命令模拟客户端连接,检查证书链和域名匹配:
openssl s_client -connect www.example.com:443 -servername www.example.com \ -CAfile /etc/pki/CA/cacert.pem这个命令会输出详细的SSL握手信息,包括服务器证书的各个字段。特别要检查"Verify return code"是否为0,以及证书中的SAN是否包含所有需要的域名。
6. 高级配置与优化
6.1 证书自动续期
证书过期是运维中常见的问题。我们可以使用cron定时任务自动检查证书有效期并续期。创建检查脚本/etc/pki/CA/check_expiry.sh:
#!/bin/bash DAYS=30 CERT=$1 if [ ! -f "$CERT" ]; then echo "Certificate file not found: $CERT" exit 1 fi EXPIRY=$(openssl x509 -enddate -noout -in "$CERT" | cut -d= -f2) EPOCH=$(date -d "$EXPIRY" +%s) NOW=$(date +%s) DIFF=$(( ($EPOCH - $NOW) / 86400 )) if [ $DIFF -le $DAYS ]; then echo "Certificate $CERT expires in $DIFF days ($EXPIRY)" # 这里添加续期逻辑 fi然后添加到crontab每周运行一次:
0 0 * * 0 /etc/pki/CA/check_expiry.sh /etc/pki/CA/certs/server.crt6.2 证书吊销列表(CRL)
对于需要吊销证书的场景,可以生成CRL:
openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem \ -keyfile /etc/pki/CA/private/cakey.pem \ -cert /etc/pki/CA/cacert.pem \ -config /etc/pki/tls/openssl.cnf在openssl.cnf中配置CRL分发点:
[ CA_default ] crlDistributionPoints = URI:http://crl.example.com/crl.pem这样客户端在验证证书时会自动检查CRL。
6.3 性能优化
银河麒麟针对国产CPU做了大量优化,我们可以通过以下配置进一步提升证书处理性能:
- 在openssl.cnf中启用硬件加速:
[openssl_conf] engines = engine_section [engine_section] xxx = xxx_engine_section [xxx_engine_section] engine_id = xxx dynamic_path = /usr/lib64/engines-1.1/xxx.so default_algorithms = ALL- 使用更高效的椭圆曲线算法:
openssl ecparam -name prime256v1 -genkey -noout -out ec.key- 启用会话复用减少SSL握手开销:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;在实际测试中,这些优化可以使TLS握手速度提升30%以上,特别是在高并发场景下效果更为明显。