什么是CA证书,为什么我们需要它?

45

我刚刚阅读了这篇文章关于HTTPS服务的介绍,对HTTPS的基本概念有所了解。

在请求HTTPS内容时,服务器会向浏览器发送一个公钥,以便每次浏览器接收到数据都可以使用该公钥进行解密。

那么我的问题是CA证书是什么?为什么我们需要它?


你不需要这样做。请查看 Let's Encrypt - erickson
@erickson 为什么需要授权?我的理解是,https 是点对点的,严格限制在两个参与方之间。 - Nicolas S.Xu
3
Stack Overflow是一个关于编程和开发问题的网站。此问题似乎与编程或开发无关,因此不符合主题范围。请参见帮助中心中的可以在这里提问的主题。也许 超级用户信息安全StackExchange 更适合询问。另外还有一个 我应该在哪里发布有关DevOps的问题? 的页面可以参考。 - jww
2
@erickson,Let's Encrypt仍然是一个CA - LE的“不同之处”在于a)它是免费的,b)它会自动更新(或者如果您无法自动更新,那么可能不值得麻烦)- 所以是双赢! - DisappointedByUnaccountableMod
@NicolasS.Xu SSL证书附带公钥,您可以在HTTPS连接中使用它。然而,不建议信任未经认可的CA签名的SSL证书。这是因为值得信赖的网站很可能会要求认可的CA签署其证书。普通的黑客不会这样做。 - Ding-Yi Chen
@jww,你说:“这个问题似乎与编程或开发无关,因此不适合。”我不同意。我认为,这个问题是非常相关的,与编程/开发有很大的关系。每一个IT/deops/etc问题都始于软件(和/或硬件)解决方案的开发——使用一些计算算法和协议。信息隐私和安全尤其是科技密集型的编程专业领域,可能会涉及到高风险。 - Serge Dundich
3个回答

39

CA证书是由证书授权机构(CA)颁发的数字证书,因此SSL客户端(如Web浏览器)可以使用它来验证由该CA签署的SSL证书。

例如,stackoverflow.com使用“Let's Encrypt”来签署其服务器,而由stackoverflow.com发送的SSL证书说明它们是由“Let's Encrypt”签署的。您的浏览器包含了来自“Let's Encrypt”的CA证书,因此浏览器可以使用该CA证书来验证stackoverflow的SSL证书,并确保您正在与真实的服务器通信,而不是中间人。

https://security.stackexchange.com/a/20833/233126提供了关于TLS/SSL证书如何工作的更详细解释。


15

签名,证书

[编码加密散列]

[ASN.1,DER,PEM]

数字签名

数字签名 - 确保某些数据(例如消息、文档、文件等)由预期方发送 - 验证完整性、真实性、不可否认性。数字签名可以是附加的(数据是签名的一部分)或分离的[示例](数据不是签名的一部分,它们被单独传输)。

//Create a signature by owner
1. owner of asymmetric key pair(private/public keys)
2. calculate a check sum of data: Message(M) -> Hash message by some hash algorithm -> message digest(MD1)
3. encode(**sign**) calculated check sum: encrypt message digest(MD1) by private key -> Digital signature(DS)

//Check a signature
1. calculate a check sum of data: Message(M) -> Hash message by some hash algorithm -> message digest(MD2)
2. decode(**verify**) digital signature: decrypt Digital signature(DS) by owner's public key -> message digest(MD1)
3. compare check sums from step 1 and 2: is MD2 == MD1

数字证书

证书是一个包含所有者公钥和其他所有者信息的文件。该文件由数字证书认证机构(CA)用数字签名签署 - 整个证书被转换为 .der 并计算散列值。

Subject - owner' data(from CSR)
Issuer - CA who issued a certificate
Serial Number - CA's unique identifier
Valid From/To 

Public Key
Signature Algorithm
Signature Value

version
extension

//fingerprint - it is not a part of certificate, which is calculated by demand and can be used as unique identifier. It is a hash of the entire certificate in DER(.der) format
...

证书颁发机构(CA)证书可以保证你就是你自己。

  • 公共证书颁发机构(CA)
  • 私人证书颁发机构(CA)

自签名证书是一种未由证书颁发机构(CA)颁发,并且主题名称等于颁发者名称的证书。请注意,根证书是自签名的。

您可以在 Mac 上创建自签名证书:

Keychain Access -> Certificate Assistant -> Create a Certificate

我的自签名证书.pem

-----BEGIN CERTIFICATE-----
MIIDIjCCAgqgAwIBAgIBATANBgkqhkiG9w0BAQsFADAvMSAwHgYDVQQDDBdteVNl
bGZTaWduZWRDZXJ0aWZpY2F0ZTELMAkGA1UEBhMCVUEwHhcNMjMwMjE4MTMyOTIz
WhcNMjQwMjE4MTMyOTIzWjAvMSAwHgYDVQQDDBdteVNlbGZTaWduZWRDZXJ0aWZp
Y2F0ZTELMAkGA1UEBhMCVUEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQDcMHHA0U2zk62XL698SdM2SmmZ6+sA0AsTb9MUx/tj3kNaOWBZEB82XGxoo09L
OlPgUJ94wMiLQ0JFYu4jDP6qb1ORUnIfI2SwuNQw61Xd+IpiP4hJG14KAGysUdc9
zEsA1PnWooLFdKDape/GdjSRGsr1vcTYBDWvjtYJrh0aXSGgWvo9zJ8snztqtRpJ
gn2JH0AR5RzJwdv8RYTGQdR5oQnUc8oaKCm2gCxWEmvdOkQyFoJQHw/kZgRKcMag
1wAofdDrESDINiih48r5cKqRD3R+y2MKlvVz0UoSAE5WqD1Oce4gnO90tpZv1ZlB
XxGAelLO8ZeZW+xG4wJad+XdAgMBAAGjSTBHMA4GA1UdDwEB/wQEAwIHgDAWBgNV
HSUBAf8EDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUTTfu7fJusZPrR/mlhfFh7Xhd
2rEwDQYJKoZIhvcNAQELBQADggEBAMNZ10eVU7dGpok1JkYOwYcFamzFFdL5GVYj
xM5+mkI4G9BfFQxbutZFbiC44Fidp4fCp+ED7OAGErSBML5M4QBIwhic0ix/lAj6
LF6ZTJy9lwNGtgLTi7KM8kbIhJxzppeuzuaD1C+ttOgugAd99jRyBmkHInGBPNQ2
R4xbgYh7/pNiWmkjxMTYrN8rQqPYvhZy3XMoNTZ7OjOy6851TDFLlsHU8ocJqkhY
Jdar1j7k4GqEqe4cjLNfaqHzQQcvVOPEYo96+bzB6JlH0hQLHrBMrTuOv+EfLK1J
ONvvR94pEFKTO7Vg5F/lx5o0KPbDavNcgacAU4EDjxR3rUmMeos=
-----END CERTIFICATE-----
验证过的证书是受信任证书链的一部分,其中根证书已经添加到您的钥匙串(受信任存储区)中(由系统、浏览器或您自己添加)。 信任链(证书链)是用于验证发布者的证书层次结构。此层次结构中的每个证书都是由专利证书签名和颁发的。
Root(trust anchor) Certificate - [Intermediate(subordinate, issuing) Certificate] - End-user(end-entity, leaf, subscriber) Certificate
  • 根证书 - 仅签署和发布中间证书。
  • 中间证书 - 签署和发布其他中间证书和终端用户证书。
  • 终端用户证书 - 不能签署和发布证书。

[OpenSSL 验证证书链]

Mac Keychain 提供以下证书验证选项:

//System trust
This certificate is valid

//Manually added self-signed certificate and manually trusted
This certificate is masked as trusted for this account

//Manually added self-signed certificate
This certificate has not been verified by a third party

验证/验证算法 - 由于子证书由父亲签名(使用父亲的私钥),根证书是自签署的,并且每个子证书都与其父级链接(子证书的颁发者名称等于父级的主题名称),根证书的颁发者名称等于根证书的主题名称。这意味着最简单的方式(不考虑扩展和其限制)就是进行名称匹配。请不要忘记根证书通常是预先下载的,而中间证书和用户端证书通常在握手期间下载。

Charles Proxy使用自签署的证书来通过中间人(MITM)代理嗅探流量 - Https代理服务器

client - with added Charles Certificate and encrypt messages by Charles public key
Https ProxyServer - has Server's Certificate and proxy message and encrypt it by Server public key
Server 

SSL Pinning是一种机制,当客户端进行握手时,检查/验证检索到的证书并将其与本地副本进行比较,如果未经验证,则失败连接。

[证书签名请求(CSR)] - 包含公钥和其他数据的信息,发送给CA

enter image description here


1
这个图中关于非对称加密的部分是不相关的,如果它们涉及到TLS,则是错误的。 - user207421
4
@MarquisofLorne,请您提供一些关于此事的资源,以便我可以进行绘画。 - yoAlex5

11
大多数证书的价格不会高达800美元,像Let's Encrypt这样的CA是免费的(代价是需要定期更新和增加不便)。
问题在于客户端如何相信服务器是正确的服务器?答案是,一个权威机构——CA会发布并背书服务器证书。CA以某种方式验证证书请求者,然后提供公共接口来验证证书的真实性。客户端必须知道CA,这可以通过操作系统或浏览器内置CA实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接