无法使用证书java验证签名值

问题描述 投票:0回答:3

我有肥皂网络服务。为了验证消息,我们使用带证书的签名。

[当我收到消息并使用客户端证书进行验证时,它将通过。然后,我用此代码通过我们的私钥证书签署数据]

signature = Signature.getInstance("SHA1withRSA", "SunRsaSign");
byte[] dataToSign = someXMLNodeString.getBytes();
PrivateKey privateKey = SignatureUtil.getPrivateKeyForCertificate(
"JKS", "keystorefile", "keystorepass".toCharArray(),
"keydomain", "keydomainpass".toCharArray());
signatureValue = SignatureUtil.sign(dataToSign, signature, privateKey);

public static PrivateKey getPrivateKeyForCertificate(
        String keyStoreAlgorithm, String keyStoreName, char[] keystorePass,
        String alias, char[] keyPassword) {
    KeyStore ks = null;
    try {
        ks = KeyStore.getInstance(keyStoreAlgorithm);
    } catch (KeyStoreException e) {
        e.printStackTrace();
        return null;
    }
    FileInputStream ksfis = null;
    try {
        ksfis = new FileInputStream(keyStoreName);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return null;
    } 
    BufferedInputStream ksbufin = new BufferedInputStream(ksfis);  

    try {
        ks.load(ksbufin, keystorePass);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return null;
    } catch (CertificateException e) {
        e.printStackTrace();
        return null;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    } finally {
        if(null != ksbufin) {
            try {
                ksbufin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    PrivateKey priv = null;
    try {
        priv = (PrivateKey) ks.getKey(alias, keyPassword);
    } catch (UnrecoverableKeyException e) {
        e.printStackTrace();
        return null;
    } catch (KeyStoreException e) {
        e.printStackTrace();
        return null;
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return null;
    }
    return priv;
}

public static byte[] sign(byte[] data, Signature signature, PrivateKey privateKey) throws InvalidKeyException, SignatureException {
    //Create a Signature object and initialize it with the private key
    signature.initSign(privateKey);
    // Update and sign the data
    signature.update(data);

    //Now that all the data to be signed has been read in, 
    //generate a signature for it
    return signature.sign();
}

但是当客户通过我给定的证书验证我的签名时,它将失败。我使用这些命令生成了证书]

keytool -genkey -alias keydomain -keysize 1024 -keyalg RSA -keystore keystorefile

keytool -export -alias keydomain -sigalg SHA1withRSA -keystore .keystorefile -file keydomain.cer -rfc
java x509certificate signature
3个回答
0
投票

尝试这个。我在Java 1.6中也遇到了类似的问题,因此我以这种方式解决了。

如果使用标准JDK 1.6,则要使提供程序正常工作,必须下载Sun JCE的不受限制的策略文件。

可以在下载JDK的位置找到策略文件。

https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jce_policy-6-oth-JPR@CDS-CDS_Developer

OR

您可以简单地复制(覆盖)这两个文件1:local_policy.jar2:US_export_policy.jar

进入目录:-> JAVA_HOME \ jre \ lib \ security \


0
投票

发现问题;是这条线

byte[] dataToSign = someXMLNodeString.getBytes();

这是从字符串对象获取byte []的错误方法。您需要流传输此字符串并从中获取字节。


0
投票

我收到一条肥皂消息,需要验证标题中的签名值。我有第三方的公共证书,够吗?我不确定如何执行此操作,如果您可以给我一些代码来执行此操作,我将不胜感激。

提前感谢

© www.soinside.com 2019 - 2024. All rights reserved.