【发布时间】:2016-02-03 06:01:04
【问题描述】:
我正在从事一个有这么多安全操作的项目。我以前从未遇到过安全问题。因此,我的问题可能是初级水平。
在我的问题中,我得到一个字节数组数据有一个证书和一些其他参数。我需要验证此证书及其签名。但我无法处理签名验证。事实上,我不知道我应该使用哪个公钥来验证。
代码如下。 感谢您的帮助..!
public boolean startValidation(PublicKey publicKey) {
CertificateFactory cf;
try {
cf = CertificateFactory.getInstance("X.509");
} catch (CertificateException e) {
e.printStackTrace();
return false;
}
try {
certificate = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(certBytes));
} catch (CertificateException e) {
e.printStackTrace();
setCertError(0);
return false;
}
if (!checkProvider()){
setCertError(1);
return false;
}
boolean[] usages = certificate.getKeyUsage();
boolean usage = usages[0] && usages[2];
if (!usage){
setCertError(2);
}
try {
certificate.checkValidity();
} catch (CertificateNotYetValidException e) {
e.printStackTrace();
setCertError(3);
return false;
} catch (CertificateExpiredException e) {
e.printStackTrace();
setCertError(4);
return false;
}
System.out.println("Sign Algorithm Name " + certificate.getSigAlgName());
//Output is SHA256WithRSAEncryption
// Problem area
try {
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initVerify(publicKey); //Should I use this certificate.getPublicKey() or what ??
if(signature.verify(certificate.getSignature())){
System.out.println("Accepted");
}else System.out.println("Failure");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
}
System.out.println("Public Key Format " + publicKey.getFormat() + "\nPublic Key Algorithm " + publicKey.getAlgorithm() );
System.out.println("Subject DN -> " + certificate.getSubjectDN().getName());
return true;
}
【问题讨论】:
-
首先我在这方面也没有经验,所以我只有一个系统可以在代码中禁用此检查,但不建议用于 PROD 环境,因为我知道你没有要进行此验证,因为它将由 JVM(SSL 协议的 JSSE 实现)处理,并且 JVM 提供它,您应该将“cacert”文件添加到您的 JRE 环境中,更多信息在 nakov.com/blog/2009/07/16/… 和 java-samples.com/showtutorial.php?tutorialid=210
-
您可以在此 repo 中看到的证书验证示例:github.com/esig/dss/blob/…
-
其实我们没有cacert文件。禁用验证对我来说不是解决方案。问题更多的是“验证证书签名”。感谢您的回答@erhun
-
我的工作更多的是字节操作。感谢@Krzysiek 的回答
-
@mismanc 顺便说一句。我认为您正在寻找这个:stackoverflow.com/a/3152396/1630872
标签: java rsa digital-signature x509certificate sha256