自签名证书的使用,以及辟谣:自签名证书其实非常安全,但是需要你处理好客户端信任的问题

安全性

简中很多文章说自签名证书不安全,这要看你怎么用。

如果你是搭建面向公众的服务,例如网站 那么肯定不够安全的。 这是因为 普通用户无法通过简单并安全的方法验证你的证书是否真的是你的。因为没有权威ca存在了。

而如果是面向内部使用的,我们可以通过权威ca 或者 其他加密途径分发证书。或者通过证书指纹验证的方法来确保安全。

当然指纹验证严格说 也不够安全,虽然指纹被伪造的可能性也几乎没有。

我们只要 保证 证书分发的过程是安全的,那么自签名证书的安全性 甚至可以超过 可信ca颁发的证书(参考我朝某衙)。

碎碎念

ca机构运营是有成本的,所有权威证书需要付费无可厚非。但是自签证书并非不安全,资本的文章看看就好,多读书。
同样类似 ssh协议,默认情况下,和自签名证书的过程其实并无差距。那么ssh不安全吗?

自签名证书的优点

  • 和商业收费证书同样安全性,某些方便甚至超过收费证书
  • 可以灵活控制有效期,例如在某些特殊情况下,需要超长的有效期
  • 自主可控
  • 可以省略OCSP服务,速度会更快

OCSP 主要是方便检查证书是否有效的情况,也就是可以吊销掉已经签发出去的证书。但是OCSP会多了一个网络验证的操作,这也是某些在国内没有OCSP服务器的一些商业证书速度很慢的 原因。

自签名ca和域名/ip证书的过程

下面一个简单说一下,自己用openssl实现 自己的ca 并签发证书的过程

ca

CA私钥

1
openssl genpkey -algorithm RSA -out ca_private.key

CA请求文件

1
openssl req -new -key ca_private.key -out ca_request.csr

CA证书

1
openssl x509 -req -in ca_request.csr -signkey ca_private.key -out ca_certificate.crt -days 3650

用ca签发证书

生成域名 私钥和 证书请求文件:

openssl genpkey -algorithm RSA -out domain_private.key openssl req -new -key domain_private.key -out domain_request.csr

从ca证书 签发证书

简单创建 一个 10年的

1
openssl x509 -req -in domain_request.csr -CA ca_certificate.crt -CAkey ca_private.key -CAcreateserial -out domain_certificate.crt -days 3650

但是这个证书里面没有域名,客户端依旧会伪造,创建一个包含域名的

1
openssl x509 -req -in domain_request.csr -CA ca_certificate.crt -CAkey ca_private.key -CAcreateserial -out domain_certificate.crt -days 3650 -extfile <(printf "subjectAltName=DNS:*.leiyanhui.com,DNS:leiyanhui.com,DNS:*.baidu.com,DNS:baidu.com")

创建一个包含域名和ip范围的

1
2
IP_LIST=$(for i in {1..254}; do echo -n "IP:10.1.1.$i,"; done | sed 's/,$//') # ip 10.1.1.1-10.1.1.254
openssl x509 -req -in domain_request.csr -CA ca_certificate.crt -CAkey ca_private.key -CAcreateserial -out domain_certificate.crt -days 3650 -extfile <(printf "subjectAltName=DNS:*.leiyanhui.com,DNS:*.shiyuxin.work,$IP_LIST")

域名私钥和证书合并到一个 .pem

有部分软件是使用的 all in one的 pem格式,例如monit

1
cat domain_private.key domain_certificate.crt > domain_aio.pem

客户端应该如何信任

上面命令中的 ca_certificate.crt 和 domain_certificate.crt 都是包含公钥的证书文件,服务器会自动分发给客户端。但是这个过程是无法保证安全的。

那么 这个两个文件,可以通过其他可信的途径分发给客户端。 例如: 可信ca的 https webdav email 甚至vpn 线下 内网 等方式

一般情况下,建议客户端信任 ca_certificate.crt 即可。那么所有使用 ca_certificate.crt 签发的证书,只要ip/域名 能对应 客户端就会认为是安全的。

如果只是信任 domain_certificate.crt 的话,那么自己的ca证书签发的别的证书就无法可信了。这个很好理解。

那些文件是可以公开的

只有 ca_certificate.crt 和 domain_certificate.crt 这两个文件 可以公开的。其他文件务必妥善保管。 尤其是 ca_private.key 这个文件,如果泄漏 就等于 天朝某衙门作恶了。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计