ho trascorso un lungo tempo su questo ma finalmente ho trovato un esempio che attua l'alleato funziona. È basato su Glassfish e Netbeans, ma credo che potresti farlo funzionare in altri ambienti (ad esempio, Eclipse e Tomcat) se ci hai giocato.
http://java.sun.com/webservices/reference/tutorials/wsit/doc/WSIT_Security9.html#wp162511
Il problema che ho trovato però è quando si desidera utilizzare i propri certificati, non quelli che vengono pre-installato con pesci vetro.
Nota: non sono un esperto di sicurezza. Non distribuire questo in un ambiente di produzione!
Per fare questo sto usando NetBeans 6.9, JDK 1.6, GlassFish 3.0.1 e OpenSSL v1.0 (sto usando i binari Win32 non ufficiali)
# Create the CA
mkdir ca server client
cd ca
openssl req -new -x509 -days 3650 -extensions v3_ca -keyout ca.key -out ca.pem
echo 02 > serial.txt
cd ..
# Creating the Server Keystore
openssl req -days 3650 -newkey rsa:1024 -keyout server/server.key -out server/server.req
openssl x509 -extensions usr_cert -extfile C:\testbed\OpenSSL-Win32\bin\openssl.cfg -CA ca/ca.pem -CAkey ca/ca.key -CAserial ca/serial.txt -req -in server/server.req -out server/server.crt
openssl pkcs12 -export -inkey server/server.key -in server/server.crt -out server/server.p12 -name server
keytool -importkeystore -destkeystore server/server.jks -deststoretype jks -srckeystore server/server.p12 -srcstoretype pkcs12
keytool -exportcert -alias server -keystore server/server.jks -file server/server.cer
# Create the Client Keystore
openssl req -days 3650 -newkey rsa:1024 -keyout client/client1.key -out client/client1.req
openssl x509 -extensions usr_cert -extfile C:\testbed\OpenSSL-Win32\bin\openssl.cfg -CA ca/ca.pem -CAkey ca/ca.key -CAserial ca/serial.txt -req -in client/client1.req -out client/client1.crt
openssl pkcs12 -export -inkey client/client1.key -in client/client1.crt -out client/client1.p12 -name client1
keytool -importkeystore -destkeystore client/client1.jks -deststoretype jks -srckeystore client/client1.p12 -srcstoretype pkcs12
keytool -exportcert -alias client1 -keystore client/client1.jks -file client/client1.cer
# Import public keys and certificates into each others keystores
keytool -import -noprompt -trustcacerts -alias client1 -file client/client1.cer -keystore server/server.jks
keytool -import -noprompt -trustcacerts -alias server -file server/server.cer -keystore client/client1.jks
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore server/server.jks
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore client/client1.jks
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\cacerts.jks"
keytool -import -noprompt -trustcacerts -alias my_ca -file ca/ca.pem -keystore "C:\Program Files\Java\jdk1.6\jre\lib\security\cacerts"
move "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\keystore.jks" "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\keystore.jks.backup"
copy server\server.jks "C:\Program Files\glassfish-3.0.1\glassfish\domains\domain1\config\keystore.jks"
Nella console di amministrazione GlassFish, abilitare la sicurezza sul proprio listener http, spuntare le caselle SSL3, TLS e Client Authentication, impostare il certificato NickName sul server, il Key Store su config \ keystore.jks, il Trust Store per config \ keystore.jks, l'algoritmo di attendibilità su PKIX e lasciare la lunghezza massima del certificato a 5.
In NetBeans, creare un nuovo progetto di applicazione Web. All'interno di ciò, creare un nuovo servizio Web.
Il mio codice di Web Service si presentava così:
@WebService()
public class ListProducts {
@Resource WebServiceContext context;
@WebMethod(operationName = "listProducts")
public String listProducts() {
return context.getUserPrincipal().toString();
}
}
Fare clic destro sul Web Service e selezionare Modifica Web Service attributi. Spuntare la casella Servizio sicuro e selezionare Sicurezza certificati reciproci come meccanismo di sicurezza. Fare clic sul pulsante Configura ... e selezionare la casella Encrypt Signature. Ora deselezionare la casella Usa impostazioni predefinite di sviluppo e quindi fare clic sul pulsante Keystore. Impostare la posizione del keystore server.jks e selezionare l'alias server
.Fai lo stesso per la configurazione del Truststore (anche se non devi selezionare un alias qui).
Importare il certificato client client1.p12 nel browser. Distribuisci il tuo servizio Web su Glassfish. Aprire il servizio Web in un browser e accedere al WSDL distribuito tramite HTTPS. Scarica il WSDL e altri schemi. Rinominare gli schemi di riferimento in copie locali in modo che quando si utilizza NetBeans WSDL2Java non vengano utilizzate risorse remote. (Questo paragrafo è perché hai limitato il tuo WSDL ai client con un certificato approvato ma NetBeans non può recuperarlo da remoto perché non ha accesso al certificato in questione).
Creare un nuovo progetto Java. Creare un nuovo client del servizio Web. Quando richiesto, indirizzare NetBeans al file WSDL salvato. Importare i file di libreria METRO2.0 (C:\Program Files\Netbeans 6.9\enterprise\modules\ext\metr\webservices-*.jar
). Il mio codice si presentava così:
public static void main(String[] args) {
System.getProperties().put("javax.net.ssl.keyStore", "C:\\NetBeansProjects\\security-04\\ssl\\client\\client1.jks");
System.getProperties().put("javax.net.ssl.keyStorePassword", "changeit");
System.getProperties().put("javax.net.ssl.trustStore", "C:\\NetBeansProjects\\security-04\\ssl\\client\\client1.jks");
System.getProperties().put("javax.net.ssl.trustStorePassword", "changeit");
System.out.println(new ListProductsService().getListProductsPort().listProducts());
}
Copy webservices-api.jar nel vostro Java \ jdk1.6 \ jre \ lib \ approvata. Fare clic con il tasto destro del mouse sul riferimento al servizio Web e selezionare Modifica attributi servizio Web. Impostare il percorso del keystore su client1.jks e impostare l'alias su client1
. Impostare il percorso truststore su client1.jks e impostare l'alias su server
.
Speriamo che si può ora eseguire il cliente e si dovrebbe vedere l'uscita in questo modo: [email protected], CN=Bob Smith, OU=Something, O=SomethingElse, L=AnyTown, ST=AnyState, C=US
Anche se hai spiegato il concetto di autenticazione reciproca abbastanza bene, i collegamenti non sono molto utili a tutti. La sicurezza del servizio web Java è cambiata un bel po 'dal 2006! :) – Catchwa