#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" />
Ссылки: