理解证书和证书链

 

目录

一、证书和证书链

4. 1.拆封证书

5..证书链的验证


一、证书和证书链

    最近一直在研究的东东,这东西说到底,也是依赖于一个前提

ROOT 证书,所以说很多安全说最终也是个伪命题;只是搞理论的人喜欢

把东西搞复杂,乱扯概念,不讲本质。

1.  简单来说,end-user证书上面几级证书都是为了保证end-user证书未被篡改,

保证是CA签发的合法证书,进而保证end-user证书中的公钥未被篡改。

2. 除了end-user之外,证书被分为root Certificates和intermediates Certificates。

相应地,CA也分了两种类型:root CAs 和intermediates CAs。

首先,CA的组织结构是一个树结构,一个root CAs下面包含多个intermediates CAs,

而intermediates又可以包含多个intermediates CAs。root CAs 和 intermediates CAs

都可以颁发证书给用户,颁发的证书分别是rootCertificates和intermediates Certificates,

最终用户用来认证公钥的证书则被称为end-user Certificates。

3. 我们使用end-user certificates来确保加密传输数据的公钥(public key)不被篡改,

而又如何确保end-user certificates的合法性呢?这个认证过程跟公钥的认证过程类似,

首先获取颁布end-user certificatesCA的证书,然后验证end-user certificatessignature

一般来说,root CAs不会直接颁布end-user certificates的,而是授权给多个二级CA,而二级CA

又可以授权给多个三级CA,这些中间的CA就是intermediates CAs,它们才会颁布end-user certificates

4. 1.拆封证书

    所谓证书的拆封,是验证发行者CA的公钥能否正确解开客户实体证书中的“发行者的数字签名”。

两个证书在交换传递之后,要进行拆封,看是否能够拆封。一个证书或证书链的拆封操作,是为了

从中获得一个公钥。可示为X1p?X1<<X2>>,这为一个中缀操作,其左操作数为一个认证机构的公钥,

右操作数则为该认证机构所颁发的一个证书。如果能正确解开,输出结果为用户的公钥

    从证书内容列表中可以看出,证书结构的最后内容是认证机构CA的数字签名,即一个可信任的CA。已经在证书上用自己的私钥做了签名。如果用该CA的公钥就可以拆封一个用户实体的证书,那么,

这个签名被验证是正确的。因为它证明了这个证书是由权威的、可信任的认证机构所签发。因此,

这个实体证书是真实可信的。

5..证书链的验证

    所谓证书链的验证,是想通过证书链追溯到可信赖的CA根(ROOT。换句话说,要验证签发用户实体证书的CA是否是权威可信的CA,如CFCA。证书链验证的要求是,路径中每个证书从最终实体到根证书

都是有效的,并且每个证书都要正确地对应发行该证书的权威可信任性CA。操作表达式为 Ap?A<<B>>B<<C>>,

指出该操作使用A的公钥,从B的证书中获得B的公钥Bp,然后再通过 Bp来解封C的证书。操作的最终结果

得到了C的公钥Cp。这就是一个证书链的认证拆封过程。

    (1)证书链的定义。证书链也称认证链,它是最终实体到根证书的一系列证书组成,这个证书链的处理过程是所有根的前辈指向最开始的根证书,即子辈连向父辈。如图1所示。

  (2)从用户实体证书到ROOT CA的证书链确认,其具体的做法如下页图2所示。

    从以上对比中可以看出:用户实体证书中的AuthorityKey Identifier扩展项CertIssuer,即证书签发者的甄别名,应当与CA证书中签发此证书的CA名称相匹配,如图中箭头所指。即CA证书中的Subject Name

是用户实体证书中Issuer Name父名,对上级CA来说又成为子名,CA证书中Issuer Name上一级CA的名字,成为可信任的链状结构。这样通过各级实体证书的验证,逐渐上溯到链的终止点——可信任的根CA

如CFCA。

  • 11
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在Java中,可以使用javax.net.ssl包中的SSLContext和TrustManager来验证证书。下面是一个简单的示例: ``` import java.io.FileInputStream; import java.security.KeyStore; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; public class CertificateVerifier { public static void main(String[] args) throws Exception { String keystorePath = "path/to/keystore"; String keystorePassword = "keystorePassword"; String truststorePath = "path/to/truststore"; String truststorePassword = "truststorePassword"; // Load keystore KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(new FileInputStream(keystorePath), keystorePassword.toCharArray()); // Load truststore KeyStore truststore = KeyStore.getInstance(KeyStore.getDefaultType()); truststore.load(new FileInputStream(truststorePath), truststorePassword.toCharArray()); // Create SSL context TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(truststore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, tmf.getTrustManagers(), null); // Create trust manager X509TrustManager trustManager = (X509TrustManager) tmf.getTrustManagers()[0]; // Verify certificate chain X509Certificate[] chain = (X509Certificate[]) keystore.getCertificateChain("alias"); trustManager.checkServerTrusted(chain, "RSA"); } } ``` 在上面的示例中,我们首先加载了keystore和truststore,然后使用TrustManagerFactory将truststore初始化为信任管理器,并将其传递给SSLContext。然后,我们从trustManager获取X509TrustManager对象,并使用它来验证证书。 请注意,此代码示例仅用于演示目的。在实际使用中,您需要使用自己的keystore和truststore,并使用正确的alias和密码。 希望这可以帮助您理解如何在Java中验证证书

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值