2011-11-25 11 views
5

W tym miejscu pojawia się problem z wsdls i wyborem wielu certyfikatów w java. Na przykład karta inteligentna ma wiele certyfikatów do podpisu, szyfrowania, identyfikacji. Mam WSDL, który generuje kod dla połączenia klient auth ale o ile mogę powiedzieć, dajesz WSDL ścieżkę do magazynu kluczy przez ustawienie właściwości, jak toWSDL Client Auth i wiele certyfikatów

System.setProperty("javax.net.ssl.keyStore", 
    keyStore); 
    System.setProperty("javax.net.ssl.keyStorePassword", 
    keyStorePassword); 

Obserwuję tę tutorial . Teraz, dla wielu certyfikatów w magazynie kluczy, jak na karcie inteligentnej, stanowi to problem, ponieważ nie ma sposobu na określenie WSZYSTKIEGO certyfikatu, którego chcesz użyć na tej karcie inteligentnej. Wygląda na to, że wsdl wybiera pierwszy certyfikat w magazynie kluczy, który może być niewłaściwym certyfikatem do uwierzytelnienia.

Moje pytanie jest 2-krotnie:

  1. Czy istnieje inny sposób niż robi System.setProperty powiedzieć WSDL, który certyfikat w użyciu? Co mogę zrobić, aby określić, który certyfikat, ponieważ większość kodu jest generowana przez wsdl przy użyciu wsconsume?

  2. Tylko System.setProperty() pozwala określić ścieżkę. Czy istnieje sposób na określenie obiektu? Sposób, w jaki otrzymuję certyfikaty poza kartą inteligentną, to użycie klasy SunPKCS11 (jak stwierdzono here). Jednak to zwraca mi obiekt magazynu kluczy, i o ile wiem, System.setProperty() chce ścieżki.

Dzięki za pomoc!

Odpowiedz

1

W końcu znalazłem odpowiedź na moje pytanie. Pamiętaj, że używam CXF.

Tak więc, gdy wywołuję wsdl2java na wsdl, otrzymuję pęk wygenerowanego kodu. W szczególności są dwa elementy, które obsługują autoryzację o nazwach Autoryzacja i Autoryzacja. W moim kodu, w celu wywołania tych linków, mam następujący

AuthorizationService authSvc = new AuthorizationService(); 
Authorization authWs = authSvc.getAuthorizationPort(); 

W tym momencie trzeba skonstruować własną KeyManager i trustmanager tworząc nową kluczy od wybranego certyfikatu. Dobrym miejscem do rozpoczęcia jest this

Następnie trzeba skonstruować TLSClientParameters

TLSClientParameters params = new TLSClientParameters(); 
params.setKeyManagers(keyManagers); 
params.setTrustManagers(trustManagers); 

następnie utwórz HTTPConduit.

HTTPConduit conduit = (HTTPConduit) ClientProxy.getClient(authWs).getConduit(); 
conduit.setTlsClientParameters(params); 

Następnie można skorzystać z usługi internetowej z certyfikatem wybranym przez użytkownika.