java实现证书链和签名验证_java对证书有效性和签名的核验-程序员宅基地

public static boolean verify(X509Certificate X509certificateRoot,
Collection collectionX509CertificateChain,X509CRL X509crl,String stringTarget) {
//获取证书链长度
int nSize=collectionX509CertificateChain.size();
//将证书链转化为数组
X509Certificate[] arX509certificate=new X509Certificate[nSize];
collectionX509CertificateChain.toArray(arX509certificate);
//声明list,存储证书链中证书主体信息
ArrayList list=new ArrayList();
//沿证书链自上而下,验证证书的所有者是下一个证书的颁布者
Principal principalLast=null;
for(int i=0;i<nSize;i++){//遍历arX509certificate
X509Certificate x509Certificate=arX509certificate[i];
//获取发布者标识
Principal principalIssuer=x509Certificate.getIssuerDN();
//获取证书的主体标识
Principal principalSubject=x509Certificate.getSubjectDN();
//保存证书的序列号
list.add(x509Certificate.getSerialNumber());

if(principalLast!=null){
//验证证书的颁布者是上一个证书的所有者
if(principalIssuer.equals(principalLast)){
try{
//获取上个证书的公钥
PublicKey publickey=arX509certificate[i-1].getPublicKey();
//验证是否已使用与指定公钥相应的私钥签署了此证书 
arX509certificate[i].verify(publickey);
}catch(Exception e){
return false;
}
}else{
return false;
}
}
principalLast=principalSubject;

}
//验证根证书是否在撤销列表中
try{
if(!X509crl.getIssuerDN().equals(X509certificateRoot.getSubjectDN()))return false;
X509crl.verify(X509certificateRoot.getPublicKey());
}catch(Exception e){
return false;
}
//在当前时间下,验证证书链中每个证书是否存在撤销列表中
if(X509crl!=null){
try{
//获取CRL中所有的项
Set setEntries=X509crl.getRevokedCertificates();

if(setEntries==null && setEntries.isEmpty()==false){
Iterator iterator=setEntries.iterator();
while(iterator.hasNext()){
X509CRLEntry X509crlentry=(X509CRLEntry)iterator.next();

if(list.contains(X509crlentry.getSerialNumber()))return false;
}
}
}catch(Exception e){
return false;
}
}
//证明证书链中的第一个证书由用户所信任的CA颁布
try{
PublicKey publickey=X509certificateRoot.getPublicKey();
arX509certificate[0].verify(publickey);
}catch(Exception e){
return false;
}
//证明证书链中的最后一个证书的所有者正是现在通信对象
Principal principalSubject=arX509certificate[nSize-1].getSubjectDN();
if(!stringTarget.equals(principalSubject.getName()))return false; 
//验证证书链里每个证书是否在有效期里
Date date=new Date();
for(int i=0;i<nSize;i++){
try{
arX509certificate[i].checkValidity(date);
}catch(Exception e){
return false;
}
}
return true;
}

public static boolean verifySign(X509Certificate X509certificateCA,String sign,String original){

try{
//获得签名实例
Signature signature=Signature.getInstance(X509certificateCA.getSigAlgName());
//用证书公钥进行初始化
signature.initVerify(X509certificateCA.getPublicKey());
//更新源数据
signature.update(original.getBytes());
//验证数字签名
return signature.verify(sign.getBytes());
}catch(Exception e){
return false;
}
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/moonpure/article/details/85252541

智能推荐

python的智慧城市社区服务平台及养老服务子系统的设计与实现_基于python的社区养老院系统的毕业论文-程序员宅基地

文章浏览阅读4.5k次。本文基于Python开发了一款智慧城市社区服务平台及养老服务子系统,旨在提供便捷的社区服务和养老服务,提升居民生活质量。本文首先介绍了课题的背景和国内外的研究现状与趋势,然后详细描述了系统的课题内容。接着,本文介绍了相关的技术与方法,包括智慧城市技术、养老服务技术和Python编程等。这些技术和方法为系统的设计和实现提供了理论和方法支持。随着社会的快速发展和人口结构的变化,智慧城市的建设和养老服务的提升成为了当代城市发展的重要方向。_基于python的社区养老院系统的毕业论文

SAP ABAP Netweaver Note download debug-程序员宅基地

文章浏览阅读319次。Created by Wang, Jerry, last modified on Jun 20, 2016

MySQL数据库下载及安装教程——《跟老吕学MYSQL》-程序员宅基地

文章浏览阅读1.4k次,点赞31次,收藏21次。MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。_mysql数据库下载及安装教程

java_extends相关,类单继承,为什么接口可以多继承_java那个版本extends可以多个接口-程序员宅基地

文章浏览阅读922次。java的类单继承/接口多继承_java那个版本extends可以多个接口

记2020年7月5日深圳福田凤凰楼嵌入式/物联网博客-公众号大佬面基聚会_凤凰楼能记-程序员宅基地

文章浏览阅读3.1k次。今年最大的收获就是有机会认识这群在嵌入式方向不断深耕的大佬,这一点我要感谢黄工一直以来对我们的指导,才让我们有这样的机会相聚在一起。strongerHuang-黄工公众号『stronge..._凤凰楼能记

高斯分布+柯西-洛伦兹分布+三种光谱线型函数(洛伦兹线型函数+多普勒[高斯]线型函数+vogit 线型函数)-程序员宅基地

文章浏览阅读4.8w次,点赞58次,收藏234次。更新时间:2020/4/26文章目录一、两种分布1.1 高斯分布(正态分布)1.2 柯西分布(洛伦兹分布)二、光谱线型函数2.1 光谱线型函数的几种形式2.2 洛伦兹线型函数与多普勒(高斯)线型函数2.3 vogit 线型函数参考文章一、两种分布1.1 高斯分布(正态分布)正态分布(英语:normal distribution)又名高斯分布(英语:Gaussian distribution..._洛伦兹分布

随便推点

XCTF 4th-QCTF-2018 pwn stack2 writeup_"puts(\"*give me your numbers and i will return to-程序员宅基地

文章浏览阅读833次。题目描述:暂无分析思路:1、首先拿到ELF文件,我们首先查看一下详细信息:tucker@ubuntu:~/pwn$ file stack2stack2: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux..._"puts(\"*give me your numbers and i will return to you an average *\");"

27.课时27.【Django模板】for标签使用详解(Av61533158,P27)_django for标签详解-程序员宅基地

文章浏览阅读290次。for in例子后端前端遍历正常遍历反向遍历遍历字典字典有keys, items,values方法循环计数判断是否是首行和未行空容器的遍历DTL里没有循环控制没有continue与break..._django for标签详解

Java基本数据类型与数组(二) (int类型数组默认值为0、trim()的作用、Sring和StringBuffer的区别(转载)、访问无效数组下标时的问题、各类数组的初始值)_当访问无效的数组下标时-程序员宅基地

文章浏览阅读1.2k次。1.int类型数组默认值为0String类型定义的数组, 默认值是nullchar类型定义的数组, 默认值是0对应的字符double类型定义的数组,默认值是0.0floati类型定义的数组, 初始化默认是0.0int类型定义的数组,  初始化默认是0以int示例public class a{static int arr[] = new int[5];//定义了一个静态的 in..._当访问无效的数组下标时

Python 容器型数据类型基本认识_python容器数据类型-程序员宅基地

文章浏览阅读456次,点赞8次,收藏4次。Python 容器型数据类型_python容器数据类型

IIS系列通配符证书HTTPS多域名配置两种方法_iis域名通配符-程序员宅基地

文章浏览阅读4.9k次。情况一:iis低版本要实现多个站点对应HTTPS只能更改IIS配置首先把每个站点分配个不同端口,如443.444.…(证书一定要是多域的) 然后重启站点然后在:C:\Windows\system32\inetsrv\config\applicationHost.config找到&lt;bindingprotocol="https" bindingInformation="*:443" /&gt;&..._iis域名通配符

js中Set基本使用_js set-程序员宅基地

文章浏览阅读4.3w次,点赞39次,收藏146次。介绍ECMAScript 6 新增的 Set 是一种新集合类型,为这门语言带来集合数据结构。Set 在很多方面都像是加强的 Map,这是因为它们的大多数 API 和行为都是共有的。基本API1. 创建Set实例使用 new 关键字和 Set 构造函数可以创建一个空集合:const s = new Set();如果想在创建的同时初始化实例,则可以给 Set 构造函数传入一个可迭代对象,其中需要包含插入到新集合实例中的元素(Set 可以包含任何 JavaScript 数据类型作为值):const_js set

推荐文章

热门文章

相关标签