java实现证书链和签名验证

来源:互联网 发布:java源码中装饰模式 编辑:程序博客网 时间:2024/06/10 07:37

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++){//遍历arX509certificateX509Certificate 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;}}


0 0
原创粉丝点击