我在内部网络上运行了一台服务器。为了支持 SSL,我设置了一个内部 CA(使用 OpenSSL)并为该服务器颁发了证书。证书链如下:
Example Root CA V1
+-- server.example.com
我在服务器上安装了服务器证书,并在 Firefox 中导入了根证书,到目前为止一切正常。
由于根证书即将过期,我决定建立一个具有更深层次结构的全新 CA:
Example Root CA V2
+-- Example Signing CA V2
+-- server.example.com
我还创建了由签名 CA 签名的用户证书。
然后我在 Firefox 中添加了用户证书。新的根 CA 显示在“授权机构”下,中间证书(签名 CA)显示在“其他”下。对于根证书,我在“编辑信任”中设置了所有三个复选标记。
接下来,我更新了服务器上的证书。当我尝试连接到服务器时,Firefox 抱怨连接不安全:
server.example.com uses an invalid security certificate.
The certificate is not trusted because it was issued by an invalid CA certificate.
Error code: SEC_ERROR_CA_CERT_INVALID
单击错误代码显示:
https://server.example.com/
Issuer certificate is invalid.
HTTP Strict Transport Security: true
HTTP Public Key Pinning: false
Certificate chain:
然后是服务器证书、中间 CA 证书和根 CA 证书。
服务器运行 ownCloud 和 Webmin;到目前为止,我只替换了 Webmin 证书。Firefox 的版本是 50.1.0。
这里有什么问题?
答案1
解决了。显然,SEC_ERROR_CA_CERT_INVALID
这表明链中的某个证书未获得批准/信任,无法用于其用途。
检查我的证书后,我发现我的中级 CA 证书不是符合其 x509_v3 扩展的 CA 证书。我使用以下设置重新生成了中级证书:
X509v3 extensions:
X509v3 Extended Key Usage: critical
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 Basic Constraints:
CA:TRUE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment, Key Agreement, Certificate Sign, CRL Sign
然后我使用有效的中级证书再次签署了服务器证书请求,并将中级证书导入 Firefox。现在中级证书显示在“授权机构”下,而不是“其他”下。
唯一的挑战是在 Webmin 中替换证书,因为我实际上将自己锁定在了 Web UI 之外。
- SSH 进入服务器
sudo vi /etc/webmin/miniserv.conf
- 更改
ssl=1
为ssl=0
并保存 sudo /etc/init.d/webmin restart
- 通过纯 HTTP 登录 Webmin,并用好的证书替换该证书,然后再次注销。
sudo vi /etc/webmin/miniserv.conf
- 改
ssl=0
回ssl=1
并保存 sudo /etc/init.d/webmin restart
当我尝试通过 HTTPS 连接到我的服务器时,它成功了。
经验教训:使用 OpenSSL 签署证书请求时,无需验证以确保签名证书实际上是 CA 证书。一切似乎都运行正常,在第一次尝试连接到服务器之前,您不会收到错误或任何其他表示有问题的迹象。