Служба XML RPC через SSL с базовой аутентификацией из приложения Spring

#java #spring #ssl

#java #spring #ssl

Вопрос:

я должен выполнить следующую настройку.

я должен вызвать реализованный в php интерфейс службы xml-rpc через ssl (базовая аутентификация) из моего приложения spring.

возвращаемый тип функции — простая строка.

я попытался выполнить вызов с помощью burlap, но я получаю CertificateException . я думаю, что это связано с самозаверяющим сертификатом на стороне сервера. мне не удалось отключить проверку сертификата с помощью burlap.

что вы могли бы использовать для вызова этой функции и как будет выглядеть конфигурация spring?

спасибо

ИНТЕРФЕЙС ДЛЯ ВЫЗОВА

 /**
 *
 * @param string $colourID
 * @return string colorname
 * @throws ApiException
 */
public function getColour($colourID)
 

КОНЕЧНАЯ ТОЧКА (ssl / basic auth)

  • hxxps://api.application.com/color
  • Пользователь: ExternColour
  • PW: xxxxxxxxxx

МОЙ КОД

ИНТЕРФЕЙС

 public interface IColourService {

    /**
     *
     * @param string $colourID
     * @return string colorname
     * @throws ApiException
     */
    public String getColour(String colourID)
 

ВЫЗОВ КЛИЕНТА

 public class RemoteServiceTest {

@Autowired
IColourService colourService;

@Test
public String runRemoteService(){
    return colourService.getColour("1");
}
 

}

КОНФИГУРАЦИЯ

автозапуск работает, поэтому я не упоминал об этом здесь

 <bean id="colourService"
    class="org.springframework.remoting.caucho.BurlapProxyFactoryBean">
    <property name="serviceUrl" value="hxxps://api.application.com/colour" />
    <property name="serviceInterface"
        value="my.package.IColourService " />
<!-- HOW to configure BASIC AUTH and SSL --->
</bean>
 

Комментарии:

1. 🙂 я добавил некоторый код к первоначальной публикации выше

Ответ №1:

Итак, существует трассировка стека, подобная этой:

 Caused by: javax.net.ssl.SSLHandshakeException: 
java.security.cert.CertificateException: No subject alternative DNS name 
matching example.com found.
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1623)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:198)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:192)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1074)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:128)
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:529)
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:465)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1120)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1147)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1131)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:904)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
    at com.caucho.burlap.client.BurlapProxy.invoke(BurlapProxy.java:139)
    ... 24 more
Caused by: java.security.cert.CertificateException: No subject alternative 
DNS name matching example.com found.
    at sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:193)
    at sun.security.util.HostnameChecker.match(HostnameChecker.java:77)
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:264)
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:250)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1053)
    ... 36 more
 

Это обычное исключение, HttpURLConnection когда сертификат SSL не соответствует домену.

Я не создал всю среду Spring, но для меня работает следующий тест:

 @Test
public void test7() throws Exception {
    final BurlapProxyFactory factory = 
        new NoSslCertificateCheckBurlapProxyFactory();
    final String url = "https://example.com/service";
    final Service service = (Service) factory.create(Service.class, url);

    service.getColour("5");
}
 

NoSslCertificateCheckBurlapProxyFactory.java :

 import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;

import com.caucho.burlap.client.BurlapProxyFactory;

public class NoSslCertificateCheckBurlapProxyFactory 
        extends BurlapProxyFactory {

    private final HostnameVerifier hostnameVerifier;

    public NoSslCertificateCheckBurlapProxyFactory() {
        hostnameVerifier = new NoCheckHostnameVerifier();
    }

    @Override
    protected URLConnection openConnection(final URL url) throws IOException {
        final URLConnection connection = super.openConnection(url);

        if (connection instanceof HttpsURLConnection) {
            final HttpsURLConnection httpsURLConnection = 
                (HttpsURLConnection) connection;
            httpsURLConnection.setHostnameVerifier(hostnameVerifier);
        }

        return connection;
    }
}
 

NoCheckHostnameVerifier.java :

 import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;

public class NoCheckHostnameVerifier implements HostnameVerifier {

    @Override
    public boolean verify(final String hostname, final SSLSession session) {
        return true;
    }
}
 

Итак, если я прав, вам просто нужно изменить класс компонента с

 <bean id="colourService"
    class="org.springframework.remoting.caucho.BurlapProxyFactoryBean">
 

Для

 <bean id="colourService"
    class="your.package.NoSslCertificateCheckBurlapProxyFactory">
 

Настройка базовой аутентификации должна быть следующей (я не тестировал):

 <property name="username" value="user1" />
<property name="password" value="pass1" />
 

Ссылки: