Не могу проверить значение подписи с сертификатом Java - PullRequest
0 голосов
/ 08 апреля 2011

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

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

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

Ответы [ 2 ]

0 голосов
/ 17 апреля 2011

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

byte[] dataToSign = someXMLNodeString.getBytes();

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

0 голосов
/ 08 апреля 2011

Попробуйте это.У меня была похожая проблема с 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

ИЛИ

Вы можете просто скопировать (перезаписать) эти два файла1: local_policy.jar 2: US_export_policy.jar

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

...