TLS公钥基础
1. 公钥基础
TLS 同时运用了对称加密与非对称加密技术。非对称加密通常依赖于 public key infrastructure (PKI) 。因此,为了全面理解 TLS 的工作原理,我们首先需要对 PKI、证书和证书颁发机构等特定术语有基本的了解。
1.1. 基础设施(Public Key Infrastructure)
PKI 包含负责管理数字证书的角色与流程,涵盖证书的颁发、创建和吊销。若没有完善的 PKI,公钥加密技术将难以实际应用。
在公钥加密体系中,加密密钥与解密密钥并不相同,因此这种加密方式也被称为 非对称加密。每个参与者都持有一个密钥对,其中包含用于加密的 public key ,以及用于解密的 private key 或 secret key 。
公钥是公开的,任何人都可以使用它来加密发送给对应私钥持有者的消息。由于使用公钥加密的消息只能通过对应的私钥解密,因此只有预期的接收者才能解读消息内容。这从本质上保护了消息免受未授权方的窥探。以下是常用加密算法及其类型的概览:
| 算法 | 类型 |
|---|---|
| RSA | 非对称 |
| DSA | 非对称 |
| AES | 对称 |
| DES | 对称 |
| 3DES | 对称 |
| Blowfish | 对称 |
1.2. 证书
然而,从获取其他参与者的公钥中产生了一个问题,因为无法验证其有效性。
例如,假设用户 Alice 希望与 hackthebox.com 进行私密通信。为此,她获取了 hackthebox.com 的公钥,用该公钥加密她的消息,并将其发送给目标。由于只有 hackthebox.com 知道用于解密的相应私钥,未经授权的参与者无法解密该消息。但 Alice 如何确定该公钥确实属于 hackthebox.com ,而不是一个想要窃取 Alice 的 HackTheBox 凭据的攻击者?
假设攻击者拦截了 Alice 获取 HackTheBox 公钥的请求,并发送自己的公钥给 Alice,同时伪造来源,使 Alice 认为这确实是 HackTheBox 的公钥。然后,Alice 会用攻击者的公钥加密她的消息,从而使攻击者能够解密并访问该消息。证书的存在正是为了解决这个问题。
证书的目的是将公钥与身份绑定,从而证明公钥所有者的身份 (比如把域名和公钥进行绑定)
访问网站时,我们可以检查网络服务器的证书。在 Firefox 中,我们可以通过点击 URL 栏旁边的锁形图标,然后 Connection Secure > More Information > View Certificate 来实现
证书包含有关主体的信息。最重要的是 Common Name ,即公钥所属的域名.此外也可以在 Subject Alt Names 部分指定额外的域名
此证书可以确保我们使用图中公钥加密的消息,只有Hackthebox可以解密它。
1.3. 证书颁发机构
但谁可以颁发证书呢?又是什么可以阻止攻击者使用自己的公钥和域名 hackthebox.com 创建证书,从而通过伪造证书冒充 HackTheBox ?这正是 Certificate Authorities 发挥作用的地方
证书颁发机构 (CA) 是被明确授权颁发证书的实体。它们通过对证书进行加密签名来实现这一功能。
CA 的身份由 CA 证书来证明。与其他任何证书一样,CA 证书也由另一个 CA 签名。这个过程会一直持续,直到达到 根 CA (Root CA)。从根 CA 到最终用户证书的路径被称为 证书链 (Certificate Chain)。
当我们再次查看 HackTheBox 的证书时,可以在顶部看到由总共三个证书组成的证书链
但是根证书就没有CA进行签名了。那该如何保证根证书不被伪造呢?
在访问网站时,浏览器会验证整个证书链。如果链中包含的任何证书无效或不安全,浏览器就会向用户显示警告。根 CA的身份会根据证书库中一组硬编码的可信 CA 集合进行检查,以防止伪造根 CA 证书。(这个可信CA集合一般是预装在系统和浏览器中的)
1.4. OpenSSL
OpenSSL是一个实现加密算法以保障安全通信的项目,许多 Linux 发行版都依赖 OpenSSL,基本都会预装的 OpenSSL 客户端来生成自己的密钥和证书、并将其转换为不同格式,执行加密操作
1.4.1. 密钥生成
生成一个新的2048长度的RSA密钥对文件,然后可以看到其私钥
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# openssl genrsa -out key.pem 2048
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# cat key.pem
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDN+m+7VM4H1eK+
k+EirignAMgfPr6qpsZJXMTN3PIH9uHjx7Ni7R/nyr5+SVWRPcPnf97tIKsfwgsz
Fm9e+QZwnd1K8CCiQxvhe4LCFgNQ9ffKZ6DB8lnv0CHSF+xs3xlZWZBiX7wQIwNr
wbP+pHavgBaPUvngWSqqnXSsjzpagksNFYzvANPJPBoI3XQS82sOhDtrSY80uHX2
yfzTv2dGYE3crf8G8cINZhZ9i+PbXT2eg0X0vSXqzCOCOeB5kYKLaWuixcG/AWMU
4KLWlmx2br1osSZ5bBqChOGfzQcpkj3LiexzvKMu37GBRytvJTsgTtaTR1EGo5Fr
7lsyVSS9AgMBAAECggEAIM5QWV/KaMkSEhRveRyP3JZtSTyvFXL2hdy2o6sbCVWy
6Jp34buupzZNXMPFUxqpRwfAs7fOSYKYUgyytEepVOpvwm24ZN+XYzROwSbMZGqo
ip4ypnE5Dc7ydAnHaBeoa+it7F0fENriwpjZWCdNl+oora8jiS3qc74cRReSzbNF
kcSFzxY9XJQY0smH7f7k4fI7L176YjkQPx1rNZch3W/GIy1Tb2X6YxgrHj5VnedB
ob9piZCG6UfapOOUReSbo5WAjWmxhROfnWZALlUlTaTxA0mItm5/5IDcSCfsVte7
b4KVAZng9ZRAz/sOKGBO03X0xtte6wZUwZSFL5UGaQKBgQDw3Nt/3jTQdRLU+oOB
+WV0qmfdPQazrEoL4jauaUU4iXAJ469Zg5e1ajtrYlgI2o9NCZsgldgNQIqywApm
ILxboqf7KLb6RWxgg3AZH2xSUKAaVY0uNZdljDI0bgKlsNF9/Fo8bv+6vmj1EQUm
W+/+6PQ1dfW1lmTZ/7fJ7d7I8wKBgQDa7FZQqxAV5jNwJpL5ncb85PEgMHboQcL3
vKJbcFrmqtjtbCHAnu7gg4PKMeC3b1hf529ZfQ9d+seMmgG7vuMkpetgBacDJtpm
qEB6TIr85MJCiSUlo3OgPOPAcmLrPRrAg76ccURsc0dw2Cb9MRGks6GmcPKyrd9E
f0NNVBrHjwKBgQCtEdV67LzAaM8uUA98riqTiPp2wyn0osDWBybJbgT6Ge9ye7L8
vAyfo4SspY6iVgGQFm3sHR+Qbib7R/hw5+bQZXEUjG3mKUo1k1xSAP1BrINOSNjY
MlPl+LX+bGnkisgNIe3o7M0+byFVrnQn2vn5DYSkgW0bnMQ8zH1QUGa7twKBgHBA
prGORR01gEKNROeBIzshGRJsR0woDBSDQKyqG7ITAFAdFeFynQG57aWLlbH5AdOL
E+lK2spRgGhzv1fJNSbhfKMrwss27N2egBE1lj69/W2obMez2+HZ1t4iyN3d4w27
f80vtun04jjWXIeO1YEiKkzxtUAxLz4sExJfgau5AoGBAMVOvdufzEOeXnLPycHm
026WCbg8liaJ18jLYk/ri0Ux8p5l27fAD3UFlVdq50lNlMJOtAPE098YogJ10NUh
2tBnLlIcwNYSBnpSAOM9ctRPBuwFkrEehS4GBcnrL3G3wDBOSsBzTtH9bDKI9drM
UNXmaiGWmPwnk4nkV15AtoZf
-----END PRIVATE KEY-----
也可以使用 openssl 来打印出对应的公钥
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# openssl rsa -in key.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzfpvu1TOB9XivpPhIq4o
JwDIHz6+qqbGSVzEzdzyB/bh48ezYu0f58q+fklVkT3D53/e7SCrH8ILMxZvXvkG
cJ3dSvAgokMb4XuCwhYDUPX3ymegwfJZ79Ah0hfsbN8ZWVmQYl+8ECMDa8Gz/qR2
r4AWj1L54Fkqqp10rI86WoJLDRWM7wDTyTwaCN10EvNrDoQ7a0mPNLh19sn8079n
RmBN3K3/BvHCDWYWfYvj2109noNF9L0l6swjgjngeZGCi2lrosXBvwFjFOCi1pZs
dm69aLEmeWwagoThn80HKZI9y4nsc7yjLt+xgUcrbyU7IE7Wk0dRBqORa+5bMlUk
vQIDAQAB
-----END PUBLIC KEY-----
1.4.2. 证书转换
下载其他网络服务器中的证书
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# openssl s_client -connect hackthebox.com:443 | openssl x509 > hackthebox.pem
Connecting to 198.18.1.210
depth=2 C=US, O=Internet Security Research Group, CN=ISRG Root X1
verify return:1
depth=1 C=US, O=Let's Encrypt, CN=E8
verify return:1
depth=0 CN=hackthebox.com
verify return:1
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# ls
hackthebox.pem key.pem
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# cat hackthebox.pem
-----BEGIN CERTIFICATE-----
MIIDpzCCAy2gAwIBAgISBnWTeynH9Cc+I4QJB8DBU+EHMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNjAzMDMwNjQyNDRaFw0yNjA2MDEwNjQyNDNaMBkxFzAVBgNVBAMTDmhh
Y2t0aGVib3guY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOSMISVXbVg+D
GvWPxWZXaZCwsTlg50dyHf9B2Zq9A9MFPzmHMpTHS2geu3D2qaebkHsSFwHK4NZO
Y2ifg+RsLKOCAjowggI2MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEF
BQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQ9l+IMqNmGv/ut7+cG+3yqPK6v
GDAfBgNVHSMEGDAWgBSPDROi9i5+0VBsMxg4XVmOI3KRyjAyBggrBgEFBQcBAQQm
MCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lOC5pLmxlbmNyLm9yZy8wOAYDVR0RBDEw
L4IOaGFja3RoZWJveC5jb22CHXBhcnJvdC1zdG9yYWdlLmhhY2t0aGVib3guY29t
MBMGA1UdIAQMMAowCAYGZ4EMAQIBMCwGA1UdHwQlMCMwIaAfoB2GG2h0dHA6Ly9l
OC5jLmxlbmNyLm9yZy84LmNybDCCAQ4GCisGAQQB1nkCBAIEgf8EgfwA+gB3AMs4
9xWJfIShRF9bwd37yW7ymlnNRwppBYWwyxTDFFjnAAABnLKk3UgAAAQDAEgwRgIh
AL71zK271y210ftIkrqoERn1c6THsK0YS/3KD8WTL3tnAiEAj/hBagJEWLo0OMCS
LXsX+ODrgbgT7ovANAYM6LWQ82UAfwBxfpXzwjiKbbHjhEk9MeFaqWIIdi1CAOAF
DNBntaZh4gAAAZyypN2AAAgAAAUACsSNjQQDAEgwRgIhAIEWrmgsA/Lv4P5rVnv9
4PFi+atAIu8RxnWf1ukJ9euCAiEAu2/7KhYcxpryJAbxw6cM4X+7HUjYiUQ+qCxM
uEvn6AAwCgYIKoZIzj0EAwMDaAAwZQIxAJ+IMajkunwjcThZIT8nhHnrs3R8MD0s
YYMu33MdLduMti7Zu61XYnXIzLnfj848NgIwVcVz5WR5fIVlWykfzd4Q2irG+PeN
CJILZI19d/lChYZgBFiYiA/qFY6LfXEuDRGM
-----END CERTIFICATE-----
除了 PEM 格式的证书。还有其他格式的,如 DER 和 PKCS#7 。可以使用 openssl 从 PEM 转换为这些格式
# PEM to DER
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# openssl x509 -outform der -in hackthebox.pem -out hackthebox.der
# PEM to PKCS#7
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# openssl crl2pkcs7 -nocrl -certfile hackthebox.pem -out hackthebox.p7
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# cat hackthebox.p7
-----BEGIN PKCS7-----
MIID1gYJKoZIhvcNAQcCoIIDxzCCA8MCAQExADALBgkqhkiG9w0BBwGgggOrMIID
pzCCAy2gAwIBAgISBnWTeynH9Cc+I4QJB8DBU+EHMAoGCCqGSM49BAMDMDIxCzAJ
BgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJFODAe
Fw0yNjAzMDMwNjQyNDRaFw0yNjA2MDEwNjQyNDNaMBkxFzAVBgNVBAMTDmhhY2t0
aGVib3guY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOSMISVXbVg+DGvWP
xWZXaZCwsTlg50dyHf9B2Zq9A9MFPzmHMpTHS2geu3D2qaebkHsSFwHK4NZOY2if
g+RsLKOCAjowggI2MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcD
ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQ9l+IMqNmGv/ut7+cG+3yqPK6vGDAf
BgNVHSMEGDAWgBSPDROi9i5+0VBsMxg4XVmOI3KRyjAyBggrBgEFBQcBAQQmMCQw
IgYIKwYBBQUHMAKGFmh0dHA6Ly9lOC5pLmxlbmNyLm9yZy8wOAYDVR0RBDEwL4IO
aGFja3RoZWJveC5jb22CHXBhcnJvdC1zdG9yYWdlLmhhY2t0aGVib3guY29tMBMG
A1UdIAQMMAowCAYGZ4EMAQIBMCwGA1UdHwQlMCMwIaAfoB2GG2h0dHA6Ly9lOC5j
LmxlbmNyLm9yZy84LmNybDCCAQ4GCisGAQQB1nkCBAIEgf8EgfwA+gB3AMs49xWJ
fIShRF9bwd37yW7ymlnNRwppBYWwyxTDFFjnAAABnLKk3UgAAAQDAEgwRgIhAL71
zK271y210ftIkrqoERn1c6THsK0YS/3KD8WTL3tnAiEAj/hBagJEWLo0OMCSLXsX
+ODrgbgT7ovANAYM6LWQ82UAfwBxfpXzwjiKbbHjhEk9MeFaqWIIdi1CAOAFDNBn
taZh4gAAAZyypN2AAAgAAAUACsSNjQQDAEgwRgIhAIEWrmgsA/Lv4P5rVnv94PFi
+atAIu8RxnWf1ukJ9euCAiEAu2/7KhYcxpryJAbxw6cM4X+7HUjYiUQ+qCxMuEvn
6AAwCgYIKoZIzj0EAwMDaAAwZQIxAJ+IMajkunwjcThZIT8nhHnrs3R8MD0sYYMu
33MdLduMti7Zu61XYnXIzLnfj848NgIwVcVz5WR5fIVlWykfzd4Q2irG+PeNCJIL
ZI19d/lChYZgBFiYiA/qFY6LfXEuDRGMMQA=
-----END PKCS7-----
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# cat hackthebox.der
00-u{)'># S0
*H=021
0 UUS10U
Let's Encrypt1
260601064243Z010Uhackthebox.com0Y0*H*H=B9IUVfWi9`GrAٚ?92Khp{Nchl,:060U0U%
0
+0
U00U=
.~Pl38]Y#r0+&0$0+0http://e8.i.lencr.org/08U10/hackthebox.comparrot-storage.hackthebox.com0U
0
g
0,U%0#0!ttp://e8.c.lencr.org/8.crl0
+yw8|D_[nYG
iXHH0F!̭-HsǰKœ/{g!AjDX48-{4
赐eq~8mI=1Zv-B
ga݀
čH0F!h,kV{b@"u !o*ƚ$
H؉D>,LK0
*H=h0e11|#q8Y!?'yt|0=,a.s-ی.ٻWbuߏ<60Usdy|e[)*
1.4.3. 创建自签名证书
如果我们不需要证书颁发机构的签名,我们可以创建自己的证书并自行签名。
此外还可以指定创建的密钥类型,以及证书算法、有效期、证书主题以及私钥密码。我们可以提供任何想要的信息,包括通过复制 HackTheBox 证书中的信息来冒充他们:
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# openssl req -x509 -newkey rsa:4096 -keyout key.pem -out selfsigned.pem -sha256 -days 365
.....+........+.........+++++++++++++++++++++++++++++++++++++++++++++*......+.....+.+++++++++++++++++++++++++++++++++++++++++++++*.............+...+.......+...+..+...+.......+..+..........+....................+.......+...+...+........+.........+...+...+++++
.+...+.......+..+....+..+.............+.....+.+.....+++++++++++++++++++++++++++++++++++++++++++++*.+......+......+++++++++++++++++++++++++++++++++++++++++++++*...+......................+..+....+..+.........+....+.........+......+..+.......+......+.....+....+.....+............+...+...+...+............+.............................................+.......+.....+.......+...+..+.+........+.+.........+...........+...+...+.......+......+...............+.........+.....................+...........+..........+.........+..+.......+.....+............+.+...+............+..+.+..+.........+...+++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:htb
Locality Name (eg, city) []:CQ
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MAZE
Organizational Unit Name (eg, section) []:MAZE
Common Name (e.g. server FQDN or YOUR name) []:MAZE.htb
Email Address []:123@123.com
但是因为私钥是自签名的,所以网络浏览器是不会信任此CA的
但是如果我们能够获取证书颁发机构的私钥,就可以用它来为任意主体签署证书,就可以有效的冒充任何人。
1.4.4. 用公私钥进行加解密
使用openssl 加密
首先新建一个密钥对,然后提取公钥到一个单独文件
# create new key pair
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# openssl genrsa -out rsa.pem 2048
# extract public key
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# openssl rsa -in rsa.pem -pubout > rsa_pub.pem
writing RSA key
然后使用提取出的公钥来加密文件,完成后可以看到加密的二进制密文:
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# openssl pkeyutl -encrypt -inkey rsa_pub.pem -pubin -in msg.txt -out msg.enc
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# xxd msg.enc
00000000: 32be 860b 4b23 0243 89a6 6bea ed74 a323 2...K#.C..k..t.#
00000010: f5c5 89ee 7336 ef7e 7d4f 9de1 ee66 544f ....s6.~}O...fTO
00000020: fd22 62ca 5ae0 bf6a f5cb 4482 9097 d478 ."b.Z..j..D....x
00000030: 22a3 c905 519c 79d0 361e c7a6 672b 78a3 "...Q.y.6...g+x.
00000040: 290d 2fce 1510 1dfe fbdf 4f21 48b8 ed97 )./.......O!H...
00000050: 8c26 a52b 811a b23b 5e84 ebca 1c92 a566 .&.+...;^......f
00000060: e0e8 0b08 fc54 b126 02a1 c6d7 59eb 25b6 .....T.&....Y.%.
00000070: 4a43 d4f1 8bf9 6e65 52b3 413a 72a2 b6bc JC....neR.A:r...
00000080: c35c d8cb 9207 5bb6 7ca1 3ea1 6193 b38b .\....[.|.>.a...
00000090: 2ba1 1f2b b1ed 7774 8a04 f6d7 dde8 9032 +..+..wt.......2
000000a0: 1be5 e87c f498 2308 e024 c0b1 e832 8e5c ...|..#..$...2.\
000000b0: 7203 a52d d295 5883 0524 66a1 6685 490a r..-..X..$f.f.I.
000000c0: e9ad b7ef 8c09 757e aaea 7d0a d07c 86b5 ......u~..}..|..
000000d0: 1555 7c86 ad43 176a 4a98 b998 5efe 16cc .U|..C.jJ...^...
000000e0: 02a4 7c4f facd 087e 0fec 3fdf f96f e3c0 ..|O...~..?..o..
000000f0: f539 40a4 cb79 97dc 1006 730a 2bd1 8caa .9@..y....s.+...
使用对应的私钥来解密加密的文件
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# openssl pkeyutl -decrypt -inkey rsa.pem -in msg.enc > decrypted.txt
┌──(root㉿kali)-[~/Desktop/htb/Academy/HTTPS]
└─# cat decrypted.txt
hello world!



