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

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

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;

}

}

验证证书链 java_java实现证书链和签名验证相关推荐

  1. 微信支付服务器验证的java_Java中的微信支付(3):API V3对微信服务器响应进行签名验证...

    1. 前言 牢记一句话:公钥加密,私钥解密:私钥加签,公钥验签. 微信支付V3版本前两篇分别讲了如何对请求做签名和如何获取并刷新微信平台公钥,本篇将继续展开如何对微信支付响应结果的验签. 2. 为什么 ...

  2. java验证签名_简单API接口签名验证

    前言 后端在写对外的API接口时,一般会对参数进行签名来保证接口的安全性,在设计签名算法的时候,主要考虑的是这几个问题: 1. 请求的来源是否合法 2. 请求参数是否被篡改 3. 请求的唯一性 我们的 ...

  3. 表单验证验证码 java_Java随机生成图片与HTML表单中的验证码实现

    Java随机生成图片 用Java语言生成一个带有字符串文本的图片总结来说只需要如下四步: 1.创建图片缓冲区 2.设置图片缓冲区的宽高及保存图片的类型 3.得到这个图片的绘制环境(拿到画笔) 4.将图 ...

  4. java 证书链_java – 获取证书链

    这并不难 – 假设你以某种方式/带外获得了一个或多个钥匙串中的所有中间证书和根证书. 看一下 http://codeautomate.org/blog/2012/02/certificate-vali ...

  5. iOS 中对 HTTPS 证书链的验证

    这篇文章是我一边学习证书验证一边记录的内容, 稍微整理了下,共扯了三部分内容: HTTPS 简要原理: 数字证书的内容.生成及验证: iOS 上对证书链的验证. HTTPS 概要 HTTPS 是运行在 ...

  6. openssl 证书验证

    本节中我们快速浏览一下证书验证的主干代码.读者可以采用上节中生成的VC工程进行验证. 下面列出关键部分代码,为方便阅读,仅保留与证书验证强相关的代码,去掉了诸如变量定义.错误处理.资源释放等非主要代码 ...

  7. μthenticode:一款用于验证 Windows 文件签名的跨平台工具

    μthenticode:一款用于验证 Windows 文件签名的跨平台工具,用于在没有Windows设备的情况下在Windows PE二进制文件上验证Authenticode签名.开发人员还将其集成到 ...

  8. 利用curl验证ssl网站(webservice)

    curl的用法: http://linux.about.com/od/commands/l/blcmdl1_curl.htm DER格式的cert转换为PEM格式(curl只接受PEM格式): ope ...

  9. https之证书验证

    1.中间人攻击 对于http协议,中间人攻击(man in the middle)是一种著名的攻击方式. 图中John和Mary作为通信的双方,Frank为攻击者 1. John向Mary发送一段数据 ...

最新文章

  1. Linux环境编译安装Mysql以及补装innodb引擎方法
  2. php在线读取pdf文件大小_南公子私藏PDF神器曝光
  3. SVN中update to revision与revert to revision的区别
  4. 别把客户当傻子,延期交货得这么谈!
  5. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等
  6. python 判断文件是否被占用_python 在删除文件的时候检测该文件是否被其他线程或者进程占用?...
  7. 如何设置计算机http端口号,服务器http端口设置
  8. 移动互联网“大开放”之死
  9. C#模拟js的Json对象创建,操作
  10. Spark读写HBase(主要讲解SHC的使用)
  11. BZOJ2832[AHOI2012] 信号塔
  12. 简单方法去除视频水印
  13. MB/T 2020/4/9-技术创新方法·概述
  14. 郑捷《机器学习算法原理与编程实践》学习笔记(第五章 梯度寻优)5.2 Logistic梯度下降法...
  15. mac FileZilla下载与安装
  16. Hadoop——你不得不了解的大数据工具
  17. 2019全国大众点评数据更新
  18. CAD图块无法分解怎么办?CAD块分解教程
  19. 56 行代码,带你爬取豆瓣影评
  20. 在Java中将excel文件转换成pdf文件

热门文章

  1. 迅睿CMS 程序安装教程
  2. 有哪些有格调的免费素材网站?
  3. 存在正文时不允许未命名的原型参数_用Swift开发macOS程序, 六、原型、格式与开发说明...
  4. Java书签 #MyBatis之setMapperLocations配置多个mapper路径的两种方法详解
  5. android 游戏降低画质6,怎么改善Android游戏的画质?
  6. 关系数据库设计 函数依赖 逻辑蕴含
  7. Python的traceback
  8. Linux中$home和波浪号~
  9. 2021年氯化工艺复审考试及氯化工艺作业模拟考试
  10. opencv把图片读为matlab,OpenCv和matlab对图像的读取