以下是代码,证书的验证我已经通过了,可是对用户的验证总通不过,请高手
看看代码有无错误,测试时可以用自己的证书替换cs01.cer.随机数和签名结果也可以换。import java.security.*;
import java.security.spec.*;
import java.io.*;
import java.util.*;
import java.security.cert.*;
import java.math.BigInteger;
import java.util.Date;
import sun.misc.BASE64Decoder;
public class test {
public static void main(String arg[])
{
test test=new test();
test.run() ;
}
public void run()
{
try { FileInputStream fin=null;
DataInputStream din=null;
java.security.cert.CertificateFactory CertFactory=java.security.cert.CertificateFactory.getInstance("X.509"); //初始化CertificateFactory //用户证书信息
fin=new FileInputStream("cs01.cer");
din=new DataInputStream(fin);
cert = (X509Certificate)CertFactory.generateCertificate(fin);
Principal subDn=cert.getSubjectDN() ; //return subject Principal whole name
int ver=cert.getVersion() ; //证书版本
String type=cert.getType() ; //Example x.509
PublicKey pubKey=cert.getPublicKey() ; //获得公钥
String sigName=cert.getSigAlgName() ; //获得签名算法
fin.close();
din.close() ; //产生随机数,用户验证
//本来是产生随机数验证,但现在指定一个验证。
String randomString="0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
byte[] randomBytes=randomString.getBytes() ;
//signString 是用户对随机数签名的结果,在应用中,这个签名结果也是用String 形式传来的.
String signString="26709B24377BA3A49EA7C7D0B266FA3C88F71304660C273E626BA90494D53C1D7A2960F6510995DA604B466F1E4A48C5913E9BE681FBBB7EB4171180DA0086E9AAFB64DD7C45CB762CDF3CD6223A392FA718DC453F49F27DBC19E887EC41905A690F098311A9D19926FA430212E88E7D7FCFF29DBB13B86A663EDBCD461A7F88";
byte[] sigBytes=signString.getBytes() ; Signature signetcheck=Signature.getInstance("SHA1withRSA");
signetcheck.initVerify(pubKey); //用用户公钥验证(在用户证书信息处取得)
signetcheck.update(randomBytes); //上传原信息
if (signetcheck.verify(sigBytes)) //验证
{
System.out.println("签名正常");
}else
System.out.println("非正常签名");
}
catch (java.lang.Exception e)
{e.printStackTrace();}
}
}
看看代码有无错误,测试时可以用自己的证书替换cs01.cer.随机数和签名结果也可以换。import java.security.*;
import java.security.spec.*;
import java.io.*;
import java.util.*;
import java.security.cert.*;
import java.math.BigInteger;
import java.util.Date;
import sun.misc.BASE64Decoder;
public class test {
public static void main(String arg[])
{
test test=new test();
test.run() ;
}
public void run()
{
try { FileInputStream fin=null;
DataInputStream din=null;
java.security.cert.CertificateFactory CertFactory=java.security.cert.CertificateFactory.getInstance("X.509"); //初始化CertificateFactory //用户证书信息
fin=new FileInputStream("cs01.cer");
din=new DataInputStream(fin);
cert = (X509Certificate)CertFactory.generateCertificate(fin);
Principal subDn=cert.getSubjectDN() ; //return subject Principal whole name
int ver=cert.getVersion() ; //证书版本
String type=cert.getType() ; //Example x.509
PublicKey pubKey=cert.getPublicKey() ; //获得公钥
String sigName=cert.getSigAlgName() ; //获得签名算法
fin.close();
din.close() ; //产生随机数,用户验证
//本来是产生随机数验证,但现在指定一个验证。
String randomString="0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
byte[] randomBytes=randomString.getBytes() ;
//signString 是用户对随机数签名的结果,在应用中,这个签名结果也是用String 形式传来的.
String signString="26709B24377BA3A49EA7C7D0B266FA3C88F71304660C273E626BA90494D53C1D7A2960F6510995DA604B466F1E4A48C5913E9BE681FBBB7EB4171180DA0086E9AAFB64DD7C45CB762CDF3CD6223A392FA718DC453F49F27DBC19E887EC41905A690F098311A9D19926FA430212E88E7D7FCFF29DBB13B86A663EDBCD461A7F88";
byte[] sigBytes=signString.getBytes() ; Signature signetcheck=Signature.getInstance("SHA1withRSA");
signetcheck.initVerify(pubKey); //用用户公钥验证(在用户证书信息处取得)
signetcheck.update(randomBytes); //上传原信息
if (signetcheck.verify(sigBytes)) //验证
{
System.out.println("签名正常");
}else
System.out.println("非正常签名");
}
catch (java.lang.Exception e)
{e.printStackTrace();}
}
}
X509Certificate cert = (X509Certificate)CertFactory.generateCertificate(fin);
替换掉 //用户证书信息 中的那个cert一行.