内网 IP 自签名 SSL 证书申请:CentOS+Nginx 免费部署方案(测试环境专用)
温馨提示:这篇文章已超过67天没有更新,请注意相关的内容是否还可用!
最近测试服务器安全,了解了内网IP的SSL证书,之前从未关注,只是知道有IP证书这个事,没想到和还有内网IP的SSL证书,经过度娘之后,自己在本地内网环境简单测试了以下,还不错(没有什么意义哈),记录开始首先在 CentOS 系统的 Nginx 服务器上,为内网 IP(192.168.110.100)申请一个免费的 SSL 证书,用于内部测试。
由于公共 CA(证书颁发机构)如 Let's Encrypt 不提供直接面向 IP 地址的免费证书服务,因此我们将采用自签名证书(Self-Signed Certificate)的方案。这种方式完全免费,适合内部测试、开发和局域网环境使用。
自签名证书是由证书使用者自行创建和签名的,浏览器会默认提示“您的连接不是私密连接”,这是正常现象,因为它没有经过受信任的第三方 CA 的验证。你需要在测试客户端的浏览器中手动信任该证书。
安装必要的工具
我们将使用 `openssl` 工具来生成证书和私钥。大多数 CentOS 系统默认已安装,若未安装,请执行以下命令:
sudo yum install -y openssl
生成自签名 SSL 证书和私钥,为了方便管理,我们首先创建一个专门存放证书的目录,例如 `/etc/nginx/ssl`。
sudo mkdir -p /etc/nginx/ssl cd /etc/nginx/ssl
快速生成(推荐用于测试)
使用以下命令可以快速生成一个有效期为 3650 天(10 年)的证书和私钥。
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout nginx-selfsigned.key -out nginx-selfsigned.crt
执行后,脚本会要求你输入一些信息,如国家、省份、城市等。**对于内网测试,这些信息并不重要,可以随意填写或直接按回车跳过。**
国家名称(2个字母代码)[XX]:
州或省名称(全名)[]:
地点名称(例如,城市)[默认城市]:
组织名称(如公司)[默认有限公司]:
组织单位名称(例如,部门)[]:
通用名称(例如,您的姓名或服务器的主机名)[]:

命令执行完毕后,在 `/etc/nginx/ssl` 目录下会生成两个文件:
- `nginx-selfsigned.key`: 服务器的私钥,必须严格保密。
- `nginx-selfsigned.crt`: 自签名的公钥证书,可以公开。
分步生成(更灵活,适合需要证书链的场景)
这种方法会先生成一个证书请求文件(CSR),然后用私钥对其进行签名。
生成私钥:
sudo openssl genrsa -out nginx-selfsigned.key 2048
生成证书签名请求 (CSR):
sudo openssl req -new -key nginx-selfsigned.key -out nginx-selfsigned.csr
同样,在这一步需要填写信息,**Common Name 依然填写 `192.168.110.100`**。
用私钥给 CSR 签名,生成证书:
sudo openssl x509 -req -days 3650 -in nginx-selfsigned.csr -signkey nginx-selfsigned.key -out nginx-selfsigned.crt
两种方法最终得到的 `nginx-selfsigned.key` 和 `nginx-selfsigned.crt` 文件是等价的,你可以选择任意一种。
配置 Nginx 使用 SSL 证书
现在,我们需要修改 Nginx 的配置文件,使其监听 443 端口并使用我们刚刚生成的证书。
#SSL-START SSL相关配置 ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt; ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers EECDH+CHACHA20:EEDDH+CHACDA20-draft:EEDDH+AES256:RSA+AES256:EECDDH+AES256:RSA+AES256:EEAFH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_tickets on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000"; error_page 497 https://$host$request_uri; #SSL-END
检查配置文件语法是否正确:
sudo nginx -t
如果显示 `syntax is ok` 和 `test is successful`,则表示配置无误。
步骤四:在客户端浏览器中信任证书
在浏览器中访问:打开你的浏览器(推荐在另一台内网机器上测试),访问 `https://192.168.110.100`。
处理安全警告:此时,浏览器会显示一个“您的连接不是私密连接”或类似的安全警告。这是因为我们的证书是自签名的,未被浏览器信任的根 CA 所认证。

手动信任证书:
- **Chrome / Edge**: 点击“高级” -> “继续前往 192.168.110.100(不安全)”。
- **Firefox**: 点击“高级” -> “添加例外” -> “确认安全例外”。
一旦添加例外,浏览器就会信任这个证书,后续访问就不会再出现警告(直到证书过期)。

将证书导入WINDOWS,下载证书crt格式到本地,然后双击,新弹出的页面选择【安装证书】 ,如图默认选择下一步:

会弹出安全警告,点击【Y】是,即可完成导入,如图:

总结
至此已经成功地在 CentOS 的 Nginx 服务器上为你的内网 IP 配置好了 SSL 证书。虽然这是一个自签名证书,不被公网信任,但它完全满足内部测试和局域网环境的 HTTPS 需求。
不过我测试了,即便是导入的自签证书在浏览器依然是安全风险提示,这个目前不知道怎么解决,按理说证书文件已经导入,变成信任,不应该继续出现安全风险提示了,不理解,有知道问题的大佬希望您不吝指导,告诉小弟怎么操作才能正常显示,先行谢过~~~



发表评论