Не удается проверить значение подписи с помощью сертификата java

У меня есть мыльный веб-сервис. Для проверки сообщений мы используем подпись с сертификатом.

Когда я получаю сообщение и проверяю его сертификатом клиента, оно проходит. Затем я подписываю данные нашим сертификатом закрытого ключа с этим кодом

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

person Tamer Awad    schedule 08.04.2011    source источник


Ответы (2)


Попробуй это. У меня была аналогичная проблема с 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.jar 2: US_export_policy.jar

в каталог: --> JAVA_HOME\jre\lib\security\

person Tausif Baber    schedule 08.04.2011
comment
Спасибо за ответ. Я пытаюсь сделать это сейчас, но почему это происходит? - person Tamer Awad; 08.04.2011
comment
В этой строке всегда происходит сбой byte[] decrypted = RSACore.rsa(sigBytes, publicKey); в классе RSASignature - person Tamer Awad; 08.04.2011
comment
что за исключение? Действительны ли открытые/закрытые ключи для сертификата? Что такое среда разработки? В противном случае, если вы используете платформу Windows и сертификаты .pfx/p12, вы можете загрузить их напрямую, не используя KeyStore ks = KeyStore.getInstance(Windows-MY, SunMSCAPI); - person Tausif Baber; 11.04.2011
comment
также взгляните на скачать .oracle.com/javase/6/docs/technotes/guides/security/ для SunMSCAPI/SunRsaSign и, наконец, проверьте, правильно ли указан поставщик безопасности в java.security? то есть security.provider.3=sun.security.rsa.SunRsaSign - person Tausif Baber; 11.04.2011

Найдена проблема; это была эта линия

byte[] dataToSign = someXMLNodeString.getBytes();

Это был неправильный метод получения byte[] из строкового объекта. Вам нужно передать эту строку и получить из нее байты.

person Tamer Awad    schedule 17.04.2011