1. 为什么需要为多IP地址生成自签名证书在开发和测试环境中我们经常需要模拟真实的生产环境。比如你可能同时运行着多个内部服务器每个服务器都有自己的IP地址或者你在本地搭建了一个微服务架构每个服务都运行在不同的端口和IP上。这时候如果要用HTTPS协议进行通信就需要为每个IP地址配置SSL证书。商业证书虽然好用但有两个明显缺点一是价格昂贵特别是需要覆盖多个IP时二是申请流程繁琐需要验证域名所有权等信息。而自签名证书就完美解决了这些问题 - 完全免费、即时生成、配置灵活。我去年负责的一个物联网项目就遇到这种情况需要在测试环境中为12个设备IP配置HTTPS用自签名证书两天就搞定了所有配置。2. 准备工作OpenSSL环境搭建2.1 检查OpenSSL安装OpenSSL是我们生成证书的核心工具。在开始前先确认你的系统是否已经安装openssl version如果看到版本号比如OpenSSL 1.1.1说明已经安装。如果提示命令未找到就需要先安装Ubuntu/Debian:sudo apt update sudo apt install opensslCentOS/RHEL:sudo yum install opensslMacOS: 通常系统自带如果没有可以用Homebrew安装brew install opensslWindows: 推荐使用Chocolatey包管理器安装choco install openssl2.2 创建证书工作目录建议专门创建一个目录存放证书相关文件mkdir ssl_certs cd ssl_certs这样能避免文件散落在各处后续管理也更方便。我在实际项目中吃过亏曾经把证书文件放在临时目录结果系统清理时全丢了不得不重新生成。3. 生成基础自签名证书3.1 创建私钥私钥是证书安全的基础一定要妥善保管。生成2048位RSA私钥的命令如下openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048这里有几个实用技巧密钥长度建议2048位太短不安全太长影响性能可以添加-aes256参数加密私钥这样使用时需要密码生产环境建议将私钥权限设置为600chmod 600 server.key3.2 创建证书签名请求(CSR)CSR包含了证书的基本信息。单IP证书的生成方式openssl req -new -key server.key -out server.csr \ -subj /CCN/STBeijing/LBeijing/OMyCompany/OUDev/CN192.168.1.1这里-subj参数的各部分含义C国家代码CN表示中国ST省/州L城市O组织名称OU部门名称CN通用名称这里填IP地址4. 使用SAN扩展支持多IP4.1 理解SAN扩展Subject Alternative NameSAN扩展允许一个证书绑定多个IP或域名。这是现代证书的标配功能特别是在微服务架构中特别有用。我去年给一个Kubernetes集群配置证书就用了SAN来覆盖所有节点的IP。4.2 创建配置文件新建extfile.cnf文件内容如下[req] distinguished_name req_distinguished_name req_extensions v3_req [req_distinguished_name] countryName CN stateOrProvinceName Beijing localityName Beijing organizationName MyCompany organizationalUnitName Dev commonName 192.168.1.1 [v3_req] basicConstraints CA:FALSE keyUsage nonRepudiation, digitalSignature, keyEncipherment subjectAltName alt_names [alt_names] IP.1 192.168.1.1 IP.2 192.168.1.2 IP.3 192.168.1.34.3 生成带SAN的CSR使用配置文件生成CSRopenssl req -new -key server.key -out server.csr -config extfile.cnf这里有个常见坑点如果遇到unable to find distinguished_name错误可能是因为配置文件格式不对确保每个节都有正确的头部声明。5. 生成最终证书5.1 自签名证书生成使用以下命令生成有效期365天的证书openssl x509 -req -days 365 -in server.csr -signkey server.key \ -out server.crt -extfile extfile.cnf -extensions v3_req重要参数说明-days证书有效期测试环境可以设短些-extfile和-extensions确保SAN扩展被包含5.2 验证证书内容生成后检查证书内容是否正确openssl x509 -in server.crt -text -noout重点关注这些部分Validity时间段是否正确Subject中的CN是否为首要IPX509v3 extensions中是否包含所有IP6. 实际应用与问题排查6.1 在Nginx中配置将证书应用到Nginx的配置示例server { listen 443 ssl; server_name 192.168.1.1; ssl_certificate /path/to/server.crt; ssl_certificate_key /path/to/server.key; # 其他配置... }配置后测试nginx -t # 测试配置 systemctl restart nginx # 重启服务6.2 常见问题解决问题1浏览器不信任证书解决方法将证书导入系统或浏览器的信任库。以Chrome为例访问chrome://settings/certificates在Authorities标签导入server.crt勾选Trust this certificate for identifying websites问题2证书链不完整虽然自签名证书没有中间证书但有些客户端会报这个警告。可以创建一个简单的CA链# 生成CA私钥和证书 openssl req -x509 -newkey rsa:2048 -days 365 -keyout ca.key -out ca.crt # 用CA签发服务器证书 openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt问题3SAN不生效确保配置文件中正确指定了v3_req扩展生成证书时包含了-extfile和-extensions参数所有IP地址格式正确不要带http://等前缀7. 进阶技巧与最佳实践7.1 自动化脚本对于需要频繁生成证书的场景可以编写脚本自动化流程。这是我常用的bash脚本模板#!/bin/bash # 配置参数 IP_LIST(192.168.1.1 192.168.1.2 192.168.1.3) DAYS365 KEY_SIZE2048 # 生成私钥 openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:$KEY_SIZE # 生成配置文件 echo [req] distinguished_name req_distinguished_name req_extensions v3_req [req_distinguished_name] countryName CN stateOrProvinceName Beijing localityName Beijing organizationName MyCompany organizationalUnitName Dev commonName ${IP_LIST[0]} [v3_req] basicConstraints CA:FALSE keyUsage nonRepudiation, digitalSignature, keyEncipherment subjectAltName alt_names [alt_names] extfile.cnf # 添加IP到SAN for i in ${!IP_LIST[]}; do echo IP.$((i1)) ${IP_LIST[$i]} extfile.cnf done # 生成CSR和证书 openssl req -new -key server.key -out server.csr -config extfile.cnf openssl x509 -req -days $DAYS -in server.csr -signkey server.key -out server.crt -extfile extfile.cnf -extensions v3_req echo 证书生成完成7.2 安全建议私钥保护私钥文件应该设置严格的访问权限600并且不要提交到代码仓库证书轮换即使自签名证书也要定期更换建议设置日历提醒日志监控监控服务的证书过期时间避免服务中断测试验证用OpenSSL命令验证证书链是否完整openssl verify -CAfile ca.crt server.crt在实际运维中我建议把证书有效期设置为提醒周期比如90天证书30天提醒这样能养成良好的证书管理习惯。曾经因为忘记更新证书导致凌晨两点被报警叫醒处理生产事故这个教训让我深刻认识到证书管理的重要性。