HTTPS已经是大势所趋,无论是浏览器安全提示还是各类合规要求,都推动着开发者给服务加上TLS加密。大多数SSL证书教程都以域名为中心,但现实场景中,我们经常会遇到只有公网IP、没有绑定域名的服务,比如临时测试环境、内网穿透节点、某些云主机直接通过IP对外提供服务。这时能否给IP地址本身签发一张被浏览器信任的SSL证书?答案是肯定的,但可选方案比域名证书少得多,坑也更多。本文将从证书原理讲起,逐一分析免费和付费两类方案的适用性,并给出实操命令与注意事项。

一、IP地址证书与域名证书有什么本质区别
要理解IP证书方案的局限性,先要知道证书是如何声明身份的。一张标准的SSL证书通过SAN(Subject Alternative Name,主题备用名称)字段列出它所保护的身份,常见的值是DNS名称,例如ippipp.com和www.ippipp.com。实际上SAN还支持另一种类型:IP Address,也就是直接写一个IP,例如192.0.2.10。浏览器在校验证书时会检查访问目标是否与SAN中的某一条匹配,IP地址访问就匹配IP类型的SAN条目。
这就带来了第一个关键差异:验证方式。域名证书可以通过DNS TXT记录或HTTP文件验证来证明申请者控制该域名,而IP证书只能验证申请者确实控制这台IP对应的服务器,验证手段通常是向该IP的80端口或443端口发起请求、放置验证文件。同时,IP证书只能是OV(组织验证)或DV(组织信息不展示)级别,不存在EV级别的IP证书,因为EV标准本身只针对域名。
第二个差异是签发方的支持度。CA/Browser Forum是浏览器厂商与证书颁发机构共同遵守的规范组织,从2015年起规范就允许SAN中包含IP地址,但真正愿意签发IP证书的CA并不多。Let's Encrypt曾在2025年短暂开放过对IP地址的短期证书支持,但随后因技术调整暂停了该服务,目前其生产环境已不再接受IP地址作为通用名称申请。因此在选择方案前,一定要先确认目标CA当前的政策状态。
二、免费方案:自签名证书与免费CA的现实情况
最常用的免费方案是自己生成证书。OpenSSL一条命令就能完成:先生成私钥,再用它签一张包含IP SAN的证书。虽然自签名证书不会被公共浏览器信任,但在内网环境、服务间通信、开发调试场景中完全够用,只要客户端预先把自签CA导入信任列表即可。下面是完整的生成命令,注意SAN配置必须通过copy_extensions或配置文件指定,命令行直接写CN是不生效的:
# 生成私钥 openssl genrsa -out ip.key 2048 # 生成带IP SAN的自签名证书 openssl req -x509 -new -nodes -key ip.key -sha256 -days 3650 \ -subj "/CN=192.168.1.100" \ -out ip.crt \ -addext "subjectAltName=IP:192.168.1.100"
生成后可以用openssl x509 -in ip.crt -text -noout查看证书详情,确认X509v3 Subject Alternative Name字段中出现了IP Address:192.168.1.100。如果这个字段缺失,浏览器会直接报不匹配错误,这是新手最常见的坑。
至于公共信任的免费CA,ZeroSSL的免费套餐目前只支持域名,不提供免费的IP证书;各云厂商(阿里云、腾讯云等)的免费证书同样限定域名。所以如果你的需求是让公网用户通过IP访问时浏览器不报警,免费公共CA这条路目前基本走不通,只能转向付费方案或通过给IP绑定一个域名来曲线救国,例如花十几块钱注册一个域名,解析到该IP,再用常规免费证书,这是性价比最高的替代思路。
三、付费IP证书的申请流程与部署
目前市场上支持公网IP证书的厂商包括GlobalSign、 Sectigo、DigiCert的部分产品线,以及国内一些代理渠道提供的公网IP OV证书。价格差异较大,国际大牌的IP证书一年可能数千元,而国内代理渠道的入门IP证书几百元起步。申请流程一般是:提交IP地址和组织或个人信息,CA向该IP的80端口(或指定端口)发送验证请求,申请者按指引放置验证文件,审核通过后签发证书。
这里有几个前置条件必须满足:第一,IP必须是公网IP,内网私有地址(如192.168.x.x、10.x.x.x)无法申请公共信任的证书;第二,80端口必须可被外网访问且未被其他服务占用,因为验证文件要放在这个端口的固定路径下;第三,部分CA要求IP的WHOIS或归属信息可查,某些云厂商的IP段可能需要额外说明用途。购买前建议先与客服确认你的IP段是否在可签发范围内,避免付款后无法通过审核。
拿到证书后部署到Nginx的配置如下,IP证书与域名证书的部署方式完全一致:
server {
listen 443 ssl;
server_name 192.168.1.100;
ssl_certificate /etc/nginx/ssl/ip.crt;
ssl_certificate_key /etc/nginx/ssl/ip.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
root /var/www/html;
}
}部署完成后用curl -v https://你的IP或浏览器访问验证,确认证书链完整且没有告警。如果报证书链不完整,通常是缺少中间证书,需要把CA提供的中间证书拼接在服务端证书之后。
四、常见问题与注意事项
第一,证书有效期与续期。付费IP证书有效期通常为一年,自签名证书可以自己定,但建议不要超过825天,因为现代浏览器对超长期证书会直接拒绝。第二,多IP场景。一张证书的SAN中可以同时包含多个IP,也有CA支持IP与域名混签,如果服务有多种访问入口,混签一张证书能简化管理。
第二,内网环境的信任分发。自签名证书用于内网时,需要把根证书分发到所有客户端的信任存储中,Windows可以通过组策略下发,Linux需要复制到/usr/local/share/ca-certificates后执行update-ca-trust或update-ca-certificates。Java应用还要单独用keytool导入到JDK的cacerts,否则即使系统层面信任了,Java程序依然会报错。
第三,安全层面的提醒。无论哪种证书,私钥文件务必设置严格权限(如600),不要提交到代码仓库。如果选择走绑定域名的替代路线,记得同时配置HTTP到HTTPS的301跳转,并保留域名证书的自动续期任务,避免证书过期导致服务不可用。综合来看,纯内网用自签名、临时公网服务优先考虑低成本域名加免费证书、正式商用且必须裸IP访问时再购买付费IP证书,按这个优先级决策通常不会出错。