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

无法使用java证书验证签名值,java,x509certificate,signature,Java,X509certificate,Signature,我有soap Web服务。为了验证消息,我们使用带有证书的签名 当我得到消息并用客户端证书验证它时,它就通过了。 然后我用这个代码通过我们的私钥证书对数据进行签名 signature = Signature.getInstance("SHA1withRSA", "SunRsaSign"); byte[] dataToSign = someXMLNodeString.getBytes(); PrivateKey privateKey = SignatureUtil.getPrivateKeyFor

我有soap Web服务。为了验证消息,我们使用带有证书的签名

当我得到消息并用客户端证书验证它时,它就通过了。 然后我用这个代码通过我们的私钥证书对数据进行签名

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

试试这个。我在Java1.6中遇到了类似的问题,我用这种方式解决了它

如果您使用的是标准JDK1.6,那么如果希望提供程序正常工作,您必须下载Sun JCE的无限制策略文件

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

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


进入目录:-->JAVA\u HOME\jre\lib\security\

发现问题;就是这条线

byte[] dataToSign = someXMLNodeString.getBytes();
这是从字符串对象获取字节[]的错误方法。
您需要流式传输此字符串并从中获取字节。

谢谢您的回复。我现在正在尝试这一点,但为什么会发生这种情况呢?它在这一行总是失败byte[]decrypted=RSACore.rsa(sigBytes,publicKey);在RSASignature类,有什么例外?公钥/私钥对证书有效吗?发展环境如何?否则,如果您使用的是windows平台和.pfx/p12证书,则可以直接加载它们,而无需使用“KeyStore ks=KeyStore.getInstance(“windows MY”、“SunMSCAPI”);”也可以查看SunMSCAPI/SunRsaSign,最后检查securityprovider是否在java.security中正确列出?i、 e.“security.provider.3=sun.security.rsa.SunRsaSign”