我刚刚阅读了这篇文章关于HTTPS服务的介绍,对HTTPS的基本概念有所了解。
在请求HTTPS内容时,服务器会向浏览器发送一个公钥,以便每次浏览器接收到数据都可以使用该公钥进行解密。
那么我的问题是CA证书是什么?为什么我们需要它?
我刚刚阅读了这篇文章关于HTTPS服务的介绍,对HTTPS的基本概念有所了解。
在请求HTTPS内容时,服务器会向浏览器发送一个公钥,以便每次浏览器接收到数据都可以使用该公钥进行解密。
那么我的问题是CA证书是什么?为什么我们需要它?
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证书如何工作的更详细解释。
签名,证书
数字签名
数字签名
- 确保某些数据(例如消息、文档、文件等)由预期方发送 - 验证完整性、真实性、不可否认性。数字签名可以是附加的(数据是签名的一部分)或分离的[示例](数据不是签名的一部分,它们被单独传输)。
//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)颁发,并且主题名称等于颁发者名称的证书。请注意,根证书是自签名的。
您可以在 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
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