Как зашифровать SOAP-сообщения вручную? - PullRequest
12 голосов
/ 16 июня 2011

Я использую JBoss 4.2.3.GA.В предыдущем задании я использовал базовый механизм шифрования, который поддерживает JBoss (WS-Security).Т.е. я использовал хранилище ключей, доверенное хранилище файлов для шифрования и подписи сообщений.Как обычно (стандартным способом) в файлах jboss-wsse- * были определены псевдонимы ключей, которые должны использоваться во время процесса шифрования.Я использовал конфигурацию безопасности ws из JBoss в книге действий.

Это нормально.Шифрование работает нормально.

Но в моей текущей задаче мне нужно указать псевдонимы для ключей вручную и динамически.Описание задачи:

  • У меня несколько профилей.В каждом профиле может быть указан псевдоним открытого ключа, который необходимо использовать для шифрования сообщения.

  • У меня есть хранилище ключей, содержащее закрытый / открытый ключ сервера и открытые ключи клиентов, которые будут отправлять сообщение на сервер

  • Мне нужно получить псевдоним отпрофиль и шифрование сообщения (на стороне клиента) с использованием открытого ключа, указанного этим псевдонимом.

  • Поэтому мне нужно каким-то образом загрузить данные из хранилища ключей (оно должно находиться в папке файловой системы, то есть вне файла ear), получить соответствующий открытый ключ и затем выполнить шифрование.
  • После этого мне нужно отправить сообщение на удаленный веб-сервис (на стороне сервера), который имеет закрытые ключи для расшифровки.
  • Здесь я вижу несколько вариантов логики на стороне сервера: веб-сервис выполняет дешифрование с использованием стандартного механизма JBoss, или я могу сделать это вручную, загружая данные хранилища ключей и дешифруя вручную.

Итак, вопросыо:

  1. Есть ли способ указать для JBoss каталог файловой системы для загрузки хранилищ ключей из?
  2. Могу ли я указать псевдоним для шифрования для стандартного механизма JBoss WSS, чтобы jboss могиспользовать эту информацию в процессе шифрования?
  3. Если мне нужно выполнить шифрование / дешифрование вручную, то как я могу обернуть несколько Java-объектов в сообщения WS и , а затем зашифровать их, используя необходимый псевдоним и как отправить это сообщение на удаленный веб-сервис вручную ?

Я просто не знаю, с чего начать, какую платформу использовать и даже нужно лииспользуйте для этого внешние (не JBoss) фреймворки ...

Ответы [ 2 ]

3 голосов
/ 05 января 2012

Если возможно, вы можете использовать Axis2 и Rampart.Я успешно использовал их оба в похожей ситуации.

Rampart - это модуль axis2 для управления безопасностью, и он предоставляет API, который позволяет вам определять местоположение хранилища ключей и псевдонимы, которые вы хотите использовать, что позволяетВы можете определить его динамически.

Axis2

Rampart

Пример кода:

private static final String CONFIGURATION_CTX = "src/ctx";  
private static final String KEYSTORE_TYPE = "org.apache.ws.security.crypto.merlin.keystore.type";
private static final String KEYSTORE_FILE = "org.apache.ws.security.crypto.merlin.file";
private static final String KEYSTORE_PWD = "org.apache.ws.security.crypto.merlin.keystore.password";
private static final String PROVIDER = "org.apache.ws.security.components.crypto.Merlin";

private static void engageRampartModules(Stub stub)
throws AxisFault, FileNotFoundException, XMLStreamException {
    ServiceClient serviceClient = stub._getServiceClient();

    engageAddressingModule(stub);   
    serviceClient.engageModule("rampart");
    serviceClient.engageModule("rahas");

    RampartConfig rampartConfig = prepareRampartConfig();  

    attachPolicy(stub,rampartConfig);
}

/**
 * Sets all the required security properties.
 * @return rampartConfig - an object containing rampart configurations
 */
private static RampartConfig prepareRampartConfig() {
    String certAlias = "alias";             //The alias of the public key in the jks file
    String keyStoreFile = "ctx/client.ks";
    String keystorePassword = "pwd";
    String userName = "youusename";


    RampartConfig rampartConfig = new RampartConfig();
    //Define properties for signing and encription
    Properties merlinProp = new Properties();  
    merlinProp.put(KEYSTORE_TYPE, "JKS");  
    merlinProp.put(KEYSTORE_FILE,keyStoreFile);  
    merlinProp.put(KEYSTORE_PWD, keystorePassword); 

    CryptoConfig cryptoConfig = new CryptoConfig();  
    cryptoConfig.setProvider(PROVIDER);  
    cryptoConfig.setProp(merlinProp);  

    //Rampart configurations
    rampartConfig.setUser(userName);
    rampartConfig.setUserCertAlias(certAlias);  
    rampartConfig.setEncryptionUser(certAlias);  
    rampartConfig.setPwCbClass("com.callback.tests.PasswordCallbackHandler"); //Password Callbak class

    rampartConfig.setSigCryptoConfig(cryptoConfig);  
    rampartConfig.setEncrCryptoConfig(cryptoConfig);
    return rampartConfig;
}

/**
 * attach the security policy to the stub.
 * @param stub
 * @param rampartConfig
 * @throws XMLStreamException
 * @throws FileNotFoundException
 */
private static void attachPolicy(Stub stub, RampartConfig rampartConfig) throws XMLStreamException, FileNotFoundException {
    Policy policy = new Policy();
    policy.addAssertion(rampartConfig);
    stub._getServiceClient().getAxisService().getPolicySubject().attachPolicy(policy);
}

PasswordCallbackHandler:

import java.io.IOException;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.ws.security.WSPasswordCallback;

public class PasswordCallbackHandler implements CallbackHandler {

// @Override
public void handle(Callback[] callbacks) throws IOException,
        UnsupportedCallbackException {
    for (int i = 0; i < callbacks.length; i++) {
        WSPasswordCallback pwcb = (WSPasswordCallback) callbacks[i];
        String id = pwcb.getIdentifer();
        switch (pwcb.getUsage()) {
            case WSPasswordCallback.USERNAME_TOKEN: {
                if (id.equals("pwd")) {
                    pwcb.setPassword("pwd");
                }
            }
        }
    }
}

}

0 голосов
/ 25 декабря 2011

1 & 2: Определение хранилища ключей для jboss:

<jboss-ws-security xmlns="http://www.jboss.com/ws-security/config" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.jboss.com/ws-security/config 
http://www.jboss.com/ws-security/schema/jboss-ws-security_1_0.xsd">
  <key-store-file>WEB-INF/wsse.keystore</key-store-file>
  <key-store-password>jbossws</key-store-password>
  <trust-store-file>WEB-INF/wsse.truststore</trust-store-file>
 <trust-store-password>jbossws</trust-store-password>
  <config>
     <sign type="x509v3" alias="wsse"/>
     <requires>
        <signature/>
        </requires>
     </config>
</jboss-ws-security>

3: пример замены шифрования (и ручной), описанный здесь для axis2: http://www.javaranch.com/journal/2008/10/web-service-security-encryption-axis2.html

...