HTTP 200 ответ от curl, но 401 от Java
Привет всем, я новичок в SSL. Так что если вы найдете какой-нибудь глупый вопрос, пожалуйста, прости меня. Так что моя проблема в том, что когда я пытаюсь отправить XML-сообщение клиенту через CURL, я получаю 200/OK в качестве кода ответа, но когда я пытаюсь с Java-кодом, я получаю 400 и 401 ответ. Вот моя команда curl.
curl -v -H 'Content-Type: application / xml' -X PUT -d @ new.xml --cert /home/ipc/hpOMItest.pem:L83soGGSK2a --user testusername: testpassword -k https: // clientURL / остальное / 9.10 / синхронизации / событие
new.xml
<event_change>
<event_ref>
<event_id>4e784c68-d8d2-71e6-1bce-0a2555530000</event_id>
</event_ref>
<changed_properties>
<state>closed</state>
</changed_properties>
</event_change>
Java-код
public class HPOMiUtil {
private static final Log LOG = LogFactory.getLog(HPOMiUtil.class);
private Map<String, SynchBackUrlDTO> httpPostFactory;
private String pathKeyStore;
private String passwordKeyStore;
private String passwordPrivateKey = "testpassword";
CloseableHttpClient client;
public int closeNotification(Map<String, String> attributes) {
String eventID = attributes.get(HPomiTicketUpdateHandler.EVENT_ID);
int responseCode = 0;
HttpPut post = null;
String response;
String requestXml = "<event_change>" + "<event_ref>" + "<event_id>" + eventID + "</event_id>" + "</event_ref>"
+ "<changed_properties>" + "<state>closed</state>" + "</changed_properties>" + "</event_change>";
SynchBackUrlDTO synchBackUrlDTO = null;
try {
synchBackUrlDTO = httpPostFactory.get(attributes.get(RadarTicketUpdateListener.SENDING_SERVER));
if (synchBackUrlDTO != null) {
post = synchBackUrlDTO.getHttpPost();
post.setEntity(new StringEntity(requestXml));
post.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE);
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(synchBackUrlDTO.getUsername(),
synchBackUrlDTO.getPassword());
post.addHeader(new BasicScheme().authenticate(creds, post, null));
client = getNewHttpsClient();
CloseableHttpResponse httpResponse = client.execute(post);
responseCode = httpResponse.getStatusLine().getStatusCode();
response = streamToStringAndCloseStream(httpResponse.getEntity().getContent(), "UTF-8");
if (responseCode == HttpURLConnection.HTTP_OK) {
LOG.info("Received response from HP OMi: " + response);
} else {
LOG.info("Received error response from HP OMi: " + response);
LOG.info("Response Code : " + responseCode);
}
} else {
LOG.info("Not a registered sending address :"
+ attributes.get(RadarTicketUpdateListener.SENDING_SERVER));
responseCode = 1;
}
} catch (Exception e) {
LOG.info("Exception communication with API at-- " + post.getURI() + ": " + e);
response = null;
responseCode = 0;
} finally {
if (post != null)
post.releaseConnection();
}
return responseCode;
}
public CloseableHttpClient getNewHttpsClient() throws Exception {
SSLContext sslcontext = getNewSSLContext();
SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
client = HttpClients.custom().setSSLSocketFactory(factory).build();
return (CloseableHttpClient) client;
}
private SSLContext getNewSSLContext() throws KeyStoreException, NoSuchAlgorithmException, CertificateException,
IOException, KeyManagementException, UnrecoverableKeyException {
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream instream = new FileInputStream(new File(pathKeyStore));
try {
keyStore.load(instream, passwordKeyStore.toCharArray());
LOG.info("Values of TrustStore" + keyStore.size() + " " + keyStore.toString());
LOG.info("Path of Keystore " + pathKeyStore);
} finally {
instream.close();
}
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, passwordPrivateKey.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), tmf.getTrustManagers(), new java.security.SecureRandom());
return sslContext;
}
private String streamToStringAndCloseStream(InputStream stream, String charSet) throws IOException {
StringBuilder rbuf = new StringBuilder();
char[] cbuf = new char[1024];
Reader reader = new InputStreamReader(stream, charSet);
int read;
do {
read = reader.read(cbuf, 0, cbuf.length);
if (read > 0) {
rbuf.append(cbuf, 0, read);
}
} while (read >= 0);
reader.close();
stream.close();
return rbuf.toString();
}
}
Spring Config для factoryHttpPost не идет с именем его на самом деле HttpPut не публиковать
<util:map id="factoryHttpPost">
<entry key="@synchback.url.SendingServer.1@">
<bean class="xx.yy.SynchBackUrlDTO">
<property name="username" value="@synchback.url.username.1@" />
<property name="password" value="@synchback.url.password.1@" />
<property name="httpPost">
<bean class="org.apache.http.client.methods.HttpPut">
<constructor-arg type="java.lang.String" value="@synchback.url.httpurl.1@"/>
</bean>
</property>
</bean>
</entry>
</util:map>
Ответ, который я получаю от клиента от CURL, равен 200, а от java я получаю следующий ответ и один и тот же код, развернутый на двух разных компонентах на разных серверах.
SERVER-1
HPOMiUtil INFO - Получен ответ об ошибке от HP OMi:
Apache Tomcat / 7.0.42 - Сообщение об ошибке
HTTP-статус 401 -
Тип Статус отчета
сообщение
описание Этот запрос требует HTTP-аутентификации.
Apache Tomcat / 7.0.42
[2017-01-21 07: 27: 59,806] [radarEventListenerContainer-1] HPOMiUtil INFO - Код ответа: 401
СЕРВЕР 2
[2017-01-21 09:24:47,363] [com.espertech.esper.Inbound-default-1] n.i.i.Director INFO - Received error response from HP OMi: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
The number of request header fields exceeds this server's limit.</p>
</body></html>
[2017-01-21 09: 24: 47,363] [com.espertech.esper.Inbound-default-1] niiDirector INFO - Код ответа: 400`
Пожалуйста, дайте ваши ценные комментарии, чтобы я мог попробовать то, что мне не хватает на данный момент. Заранее спасибо.