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; } }
文章浏览阅读4.5k次。本文基于Python开发了一款智慧城市社区服务平台及养老服务子系统,旨在提供便捷的社区服务和养老服务,提升居民生活质量。本文首先介绍了课题的背景和国内外的研究现状与趋势,然后详细描述了系统的课题内容。接着,本文介绍了相关的技术与方法,包括智慧城市技术、养老服务技术和Python编程等。这些技术和方法为系统的设计和实现提供了理论和方法支持。随着社会的快速发展和人口结构的变化,智慧城市的建设和养老服务的提升成为了当代城市发展的重要方向。_基于python的社区养老院系统的毕业论文
文章浏览阅读319次。Created by Wang, Jerry, last modified on Jun 20, 2016
文章浏览阅读1.4k次,点赞31次,收藏21次。MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。_mysql数据库下载及安装教程
文章浏览阅读922次。java的类单继承/接口多继承_java那个版本extends可以多个接口
文章浏览阅读3.1k次。今年最大的收获就是有机会认识这群在嵌入式方向不断深耕的大佬,这一点我要感谢黄工一直以来对我们的指导,才让我们有这样的机会相聚在一起。strongerHuang-黄工公众号『stronge..._凤凰楼能记
文章浏览阅读4.8w次,点赞58次,收藏234次。更新时间:2020/4/26文章目录一、两种分布1.1 高斯分布(正态分布)1.2 柯西分布(洛伦兹分布)二、光谱线型函数2.1 光谱线型函数的几种形式2.2 洛伦兹线型函数与多普勒(高斯)线型函数2.3 vogit 线型函数参考文章一、两种分布1.1 高斯分布(正态分布)正态分布(英语:normal distribution)又名高斯分布(英语:Gaussian distribution..._洛伦兹分布
文章浏览阅读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 *\");"
文章浏览阅读290次。for in例子后端前端遍历正常遍历反向遍历遍历字典字典有keys, items,values方法循环计数判断是否是首行和未行空容器的遍历DTL里没有循环控制没有continue与break..._django for标签详解
文章浏览阅读1.2k次。1.int类型数组默认值为0String类型定义的数组, 默认值是nullchar类型定义的数组, 默认值是0对应的字符double类型定义的数组,默认值是0.0floati类型定义的数组, 初始化默认是0.0int类型定义的数组, 初始化默认是0以int示例public class a{static int arr[] = new int[5];//定义了一个静态的 in..._当访问无效的数组下标时
文章浏览阅读456次,点赞8次,收藏4次。Python 容器型数据类型_python容器数据类型
文章浏览阅读4.9k次。情况一:iis低版本要实现多个站点对应HTTPS只能更改IIS配置首先把每个站点分配个不同端口,如443.444.…(证书一定要是多域的) 然后重启站点然后在:C:\Windows\system32\inetsrv\config\applicationHost.config找到<bindingprotocol="https" bindingInformation="*:443" />&..._iis域名通配符
文章浏览阅读4.3w次,点赞39次,收藏146次。介绍ECMAScript 6 新增的 Set 是一种新集合类型,为这门语言带来集合数据结构。Set 在很多方面都像是加强的 Map,这是因为它们的大多数 API 和行为都是共有的。基本API1. 创建Set实例使用 new 关键字和 Set 构造函数可以创建一个空集合:const s = new Set();如果想在创建的同时初始化实例,则可以给 Set 构造函数传入一个可迭代对象,其中需要包含插入到新集合实例中的元素(Set 可以包含任何 JavaScript 数据类型作为值):const_js set