证书的目的是以一种可验证的方式声明信息。在这个上下文中,公钥证书,更具体地说是X.509证书,声明了公钥、标识符(主题可分辨名称和/或主题备用名称)和各种其他属性之间的绑定。所有这些信息都被签名,以形成证书。
X.509证书既有发行者又有主题。主题是表示证书标识的标识符(拥有与此证书中的公钥匹配的私钥的人或事物),而发行者则代表使用其私钥签署此证书的人或组织的标识符。
证书的使用可以广泛分为两类:用于特定应用程序或服务的证书(例如,身份验证SSL/TLS服务器)和用于证明其他证书有效性的证书。
对于后者,证书被用作公钥基础设施(PKI)的构建块。认证机构(CA)是颁发证书的机构:它签署将证书中的公钥与主题绑定的声明。这样做时,它会将自己的名称作为颁发者名称放入所颁发的证书中。
如果你把证书和护照(将你的照片和姓名绑在一起)进行比较,CA就是你的护照机关:他们实际上认证了护照所说的内容是真实的,以便其他人能够验证它。
信任CA可以让你相信它发行的证书。你可以在你信任的CA和由这些CA颁发的你之前没有见过的证书之间建立信任链。
随之而来的是“引导”问题:你如何信任CA本身?
自签名证书是发行者和主题相同的证书;它们用包含公钥的私钥签名。它们位于信任链的顶部。它们往往是CA证书(除非为特定服务量身定制,否则您无法在外部验证时信任)。
CA证书是可用于发行/验证其他证书的证书。(如果它们位于根/自签名CA证书和你希望验证的证书之间的链中间,它们可以是中间CA证书。)定义证书如何用于验证其他证书的规则在
PKIX specification (RFC 3280/5280)中定义。
浏览器和操作系统预装了一份默认信任的CA证书列表。这些证书大多数来自商业颁发机构,他们会检查服务证书中的信息并收取费用。作为回报,你可以信任他们所颁发证书的内容(但这不是完美的系统)。这里需要有一个“信任飞跃”,因为你需要相信浏览器/操作系统只包含声誉良好的CA证书。
如果你使用
openssl s_client
,并且看到类似于“链中的自签名证书”或“无法验证证书”的消息,这并不一定意味着出现了问题,但是
openssl
默认不使用预定义的受信任CA证书列表。它的大多数命令都有像
-CAfile
或
CApath
这样的选项,允许你指定你愿意信任哪些CA证书。
服务的自签名证书是一种特殊情况,其中服务自行声明其内容。你通常无法验证此类证书的真实性,除非你有一种外部方式来信任它(例如,如果你在计算机上自己安装了它并手动检查了其内容,或者如果你信任的某人将其给了你)。
(您可能也对这个问题感兴趣,关于如何使用HTTPS服务器证书。)