Не удалось создать исключение службы javax.xml.ws.WebServiceException: - PullRequest
0 голосов
/ 06 января 2012

Мне нужна отчаянная помощь, чтобы выяснить, почему мое приложение не создает веб-сервис.

Вот мой класс Java веб-сервиса:

  @WebService
  @Component
  public class LoginWs extends AbstractWs
{
private static final Logger logger=MiscUtils.getLogger();

@Autowired
private PersonDao personDao = null;

/**
 * Returns PersonTransfer on valid login
 * @throws NotAuthorisedException if password is incorrect
 */
public PersonTransfer login(String userNameOrEmailAddress, String password) throws NotAuthorisedException
{
    Person person=personDao.findByUserNameOrEmailAddress(userNameOrEmailAddress, true);

    if (person != null && person.checkPassword(password))
    {
        PersonTransfer personTransfer = PersonTransfer.getTransfer(person);

        personDao.setLastLogin(person.getId(), new GregorianCalendar());

        EventLogDao.logEvent(ActionType.READ_DATA.name(), "LoginWs.login()", "personId=" + person.getId());         

        return(personTransfer);
    }

    logger.debug("Login failed : u/p="+userNameOrEmailAddress+"/"+password);

    throw(new NotAuthorisedException("Invalid Username/Password"));
}
}

Код, который вызывает эту службу:

  public static LoginWs getLoginWs()
{

    LoginWsService service = new LoginWsService(buildURL("LoginService"));

    LoginWs port = service.getLoginWsPort();

    CxfClientUtils.configureClientConnection(port);

    return(port);
}

Исключение выдается по адресу:

   LoginWsService service = new LoginWsService(buildURL("LoginService"));

Вот полное исключение:

    Error
    javax.xml.ws.WebServiceException:  org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:149)
at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:65)
at javax.xml.ws.Service.<init>(Service.java:56)
at org.websr.my_server.ws.LoginWsService.<init>(Unknown Source)

    Caused by: javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: Problem parsing 'https://192.168.2.184:8443/my_server/ws/LoginService?wsdl'.: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present

Может кто-нибудь сказать мне, почему не удается создать саму службу,В методе LoginWs эта строка

   CxfClientUtils.configureClientConnection(port);

настраивает соединение SSL, но мой код даже не доходит.Он пытается подключиться в сервисе LoginWsService = new LoginWsService (buildURL ("LoginService"));и терпит неудачу.

Может кто-нибудь сказать, пожалуйста, что здесь происходит?Спасибо!

cert.pem:

        MIID1DCCArygAwIBAgIJAPAlC2JvlPsZMA0GCSqGSIb3DQEBBQUAMIGSMQswCQYD
VQQGEwJDQTEQMA4GA1UECBMHT250YXJpbzEQMA4GA1UEBxMHVG9yb250bzERMA8G
A1UEChMISW5kaXZpY2ExETAPBgNVBAsTCEluZGl2aWNhMRYwFAYDVQQDEw0xOTIu
MTY4LjIuMTg0MSEwHwYJKoZIhvcNAQkBFhJkaXZ5YUBpbmRpdmljYS5jb20wHhcN
MTIwMTA2MTYxMTQwWhcNMTMwMTA1MTYxMTQwWjCBkjELMAkGA1UEBhMCQ0ExEDAO
BgNVBAgTB09udGFyaW8xEDAOBgNVBAcTB1Rvcm9udG8xETAPBgNVBAoTCEluZGl2
aWNhMREwDwYDVQQLEwhJbmRpdmljYTEWMBQGA1UEAxMNMTkyLjE2OC4yLjE4NDEh
MB8GCSqGSIb3DQEJARYSZGl2eWFAaW5kaXZpY2EuY29tMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAxY8+fsw2pP4ToHN6XFNli4vOGbt+O/ANsr1A8iJh
nCb6cpQ58xF4pvYmETHrAUpv4zpi31SzZvWYI1tMaCEv9IpcX6Kc1B8NB9sLUnhR
gyblF37rZ7eMmSAXXeDS0CTtDEJoHOkGxoUdCN6N+vZjJ5+ZONiiuLqZ4x4HwBFr
ucIlwl2FkMMSxylg90tttSIyUHGz/p2DvNA2goYih4d89c/FLNpqwku+G3/gnL7U
l0OmNuFwJa/qMjy/V1orfpT8egxxh8DMp+fLAv1gjbeoizUs2bHo9kQSbUSp9Cwb
VDCol9jGI14cBuuEpWSANx2gTekN1ktoxztFPCh7H3OK/wIDAQABoyswKTAPBgNV
HREECDAGhwTAqAK4MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMA0GCSqGSIb3DQEB
BQUAA4IBAQALvpU0/5gQedlET2+r2MV0oksTmM2hV677yVsrOnGCOnTcgMZHp5i4
A0B24Ed2iDesX60OAViIocQkOiwYTRnubg5SoWyL1nhmaa/98U6M/re8R/bvq6OK
qrzEO6hHOtunJg1HcZDiJZop7R/pM52yRhRoXU6upZEhbPr6Eh+zfysA0TD6uMs7
9k2VeJo++XUvbG3dkVJ9kYhqfx2vC0HiMI4H2eomzl2ymS+R9Kg/9o29K8oCYjDI
jWPbl2hmf2cQuC4gG8GUDZi7zJkFsBuJpD6XgpIVK9zNhg1e89eP0nABupIFqBOI
iz0C+tRB4z4TezPL6yC7BDMY2nJ/Cg5e

против того, что сервер фактически использует:

MIICVTCCAb6gAwIBAgIETr3AxTANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJD
QTEQMA4GA1UECBMHT250YXJpbzEQMA4GA1UEBxMHVG9yb250bzERMA8GA1UEChMI
SW5kaXZpY2ExETAPBgNVBAsTCEluZGl2aWNhMRYwFAYDVQQDEw0xOTIuMTY4LjIu
MTg0MB4XDTExMTExMjAwNDE0MVoXDTIxMTEwOTAwNDE0MVowbzELMAkGA1UEBhMC
Q0ExEDAOBgNVBAgTB09udGFyaW8xEDAOBgNVBAcTB1Rvcm9udG8xETAPBgNVBAoT
CEluZGl2aWNhMREwDwYDVQQLEwhJbmRpdmljYTEWMBQGA1UEAxMNMTkyLjE2OC4y
LjE4NDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAzvnBMOM2YpM4Ch0MkesA
ryqX3YD8O22kJJrpRuOMyqgt6fKEDxkcGjiEZ7qLfWbzv3eX9DE0nVeS4m65Ucr2
LLZN6iZoqP8J+AmkSXKapIQpX7tZM5UuTDy82vUdOiYJELB3NSJc/4nkZkTaN8Uj
h3Ph366kRUP+QWiq2y97KKMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBFeOQOKq9u
4nq/IUgNpILrhcpiAP5LB49bCXeTCi8Ls51qUCaezceUQKrWM60a6w8FxQF+yopB
PSqGMrUBHnvewkThgZbS12t5vOEoXnWjOwiXhMhRsk5i9YUh1QCYfOFF23aXNfRu
NLL5svksUHm1IzBJJANnL/YdJHRrR0IEQg==

Ответы [ 2 ]

5 голосов
/ 06 января 2012
java.security.cert.CertificateException: No subject alternative names present

Звучит так, как будто вы подключаетесь с использованием IP-адреса напрямую (а не имени хоста) к сертификату, который не имеет записи альтернативного имени субъекта.

Это, конечно, связанона этот вопрос:

Если вы решили не использовать запись SAN, ночтобы полагаться на имя хоста в CN (которое вы также сконфигурировали для разрешения на правильный IP-адрес в вашем клиенте), вы также должны использовать его для указания соединения.Ваш построитель URL, вероятно, создает URL, который все еще зависит от IP-адреса.

РЕДАКТИРОВАТЬ: (после комментариев)

Как я уже говорил в ответе на другойвопрос, связанный выше, есть (по крайней мере) два способа создания самоподписанного сертификата с именем субъекта Alt для Java:

Вы выбрали второй вариант (возможно, немного сложнее?).OpenSSL способен создавать файл PKCS # 12 (.p12), который поставщики безопасности Java по умолчанию должны иметь возможность напрямую использовать в качестве хранилища ключей (хотя keytool в Java 6 и выше может преобразовывать их в хранилище JKSчерез -importkeystore).Чтобы использовать их напрямую, используйте тип хранилища "PKCS12".

Для создания файла PKCS # 12 с OpenSSL, используя результат создания самозаверяющего сертификата (при условии, что файлы называются cert.pem длясертификат и key.pem для закрытого ключа):

openssl pkcs12 -export -in cert.pem -inkey key.pem -out store.p12

Затем настройте его в Apache Tomcat, используя (и перезапустите Tomcat):

<Connector port="8443" ... scheme="https" secure="true" 
     keystoreFile="/path/to/store.p12"  
     keystorePass="..." keystoreType="PKCS12" sslProtocol="TLS" />

Чтобы извлечь содержимоесертификат в файле PKCS # 12:

openssl pkcs12 -in store.p12 -nokeys -clcerts | openssl x509 -text -noout

Для проверки сертификата, который фактически используется сервером:

echo "" | openssl s_client -showcerts -connect hostname_or_ip_address:port
1 голос
/ 07 января 2012

Сертификат, который вы опубликовали, имеет проблему.

Я могу открыть его напрямую через Windows, и держу пари, что если вы откроете Internet Explorer и введете URL-адрес веб-службы и просмотрите сертификат через IE, у вас не должно возникнуть никаких проблем.

НО по какой-то причине Java не может его проанализировать.
Например, если я пытаюсь прочитать сертификат через библиотеки Java по умолчанию:

public static void main(String[] args) throws Exception{  

 CertificateFactory f = CertificateFactory.getInstance("X.509");
 X509Certificate certificate = (X509Certificate) f.generateCertificate(new FileInputStream("C:\\certificate.pem"));
System.out.println(certificate);

}

Я получаю исключение при разборе:

Exception in thread "main" java.security.cert.CertificateException: Could not parse certificate: java.io.IOException: Unsupported encoding
    at sun.security.provider.X509Factory.engineGenerateCertificate(Unknown Source)
    at java.security.cert.CertificateFactory.generateCertificate(Unknown Source)
    at test.Test.main(Test.java:15)
Caused by: java.io.IOException: Unsupported encoding
    at sun.security.provider.X509Factory.base64_to_binary(Unknown Source)
    ... 3 more

Проблема с декодированием из base64.
Попробовав Bouncy Castle, он тоже не смог прочитать.

До этого я видел несоответствие между библиотеками безопасности и Windows, способными декодировать сертификаты, а библиотеки Java - нет.

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

Я не могу сказать, в чем проблема с вашим сертификатом, потому что я не очень знаком с open ssl.

Но если вы создадите (просто для проверки того, что я говорю) новое хранилище ключей, используя инструменты Java, у вас не должно возникнуть проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...