API Java EWS1.2: как найти сертификат, который ищет наш сервер Exchange

Я упоминал почти каждый вопрос по этой теме на SO, но, к сожалению, ни один из ответов не дал мне прорыва.

Я использую EWS1.2 и запускаю следующий код из eclipse, чтобы подключиться к нашему серверу обмена и отправить тестовое электронное письмо. Пожалуйста, смотрите встроенные комментарии относительно того, что я понимаю, что делает код.

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

/* Our company email id and windows password. We never had to enter a password for outlook. 
I guess it is using LDAP authentication. In our outlook it is set to Negotiate Authentication. */
ExchangeCredentials credentials = new WebCredentials("123.abc@xyz.com", "MyWinPassword");
service.setCredentials(credentials);

/* Our proxy server's ip address and port. I am not sure if our exchange server is only accessible through a proxy
but this statement stopped a "connection refused" error that I was getting earlier */
WebProxy webProxy = new WebProxy("our_proxy_ip", 8080);
webProxy.setCredentials("my_win7_user_id", "MyWinPassword", "OurDomain");
service.setWebProxy(webProxy);

try {
service.setUrl(new URI("https://exchange_ip/ews/Exchange.asmx"));

/* Autodiscovery never worked: The Autodiscover service couldn't be located. */
// service.autodiscoverUrl("123.abc@xyz.com");
} catch (URISyntaxException e) {
e.printStackTrace();
}

EmailMessage msg;
try {
msg = new EmailMessage(service);
msg.setSubject("Test Email");
msg.setBody(MessageBody.getMessageBodyFromText("Sent using the EWS API"));
msg.getToRecipients().add("123.abc@xyz.com");
msg.send(); /* This is where we get an exception */
} catch (Exception e) {
e.printStackTrace();
}

что приводит к следующему следу:

microsoft.exchange.webservices.data.ServiceRequestException: The request failed. sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at microsoft.exchange.webservices.data.ServiceRequestBase.getEwsHttpWebResponse(Unknown Source)
    at microsoft.exchange.webservices.data.ServiceRequestBase.validateAndEmitRequest(Unknown Source)
    at microsoft.exchange.webservices.data.SimpleServiceRequestBase.internalExecute(Unknown Source)
    at microsoft.exchange.webservices.data.MultiResponseServiceRequest.execute(Unknown Source)
    at microsoft.exchange.webservices.data.ExchangeService.internalCreateItems(Unknown Source)
    at microsoft.exchange.webservices.data.ExchangeService.createItem(Unknown Source)
    at microsoft.exchange.webservices.data.Item.internalCreate(Unknown Source)
    at microsoft.exchange.webservices.data.EmailMessage.internalSend(Unknown Source)
    at microsoft.exchange.webservices.data.EmailMessage.send(Unknown Source)
    at com.ashok.calsync.Sync.testMethod(Sync.java:39)
    at com.ashok.calsync.Sync.main(Sync.java:12)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    ... 11 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    ... 28 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318)
    ... 34 more

Я экспортировал сертификат, используемый Outlook, в файл.cer и импортировал его в cacerts, используя keytool.

keytool -import -file D: \ Ashok \ myOutlookCert1.cer -keystore cacerts -alias myOutlookCert1

Конфигурация Run в eclipse включает в себя следующее в VM Arguments

-Djavax.net.debug = all -Djavax.net.ssl.keyStore = "C: \ java_jdk \ 1.6.0_30 \ jre \ lib \ security \ cacerts" -Djavax.net.ssl.keyStorePassword = changeit -Djavax.net. ssl.trustStore = "C: \ java_jdk \ 1.6.0_30 \ jre \ lib \ security \ cacerts" -Djavax.net.ssl.trustStorePassword = changeit

и сертификат виден в трассировке отладки

добавление в качестве доверенного сертификата: Тема: CN=123.abc, CN=S, CN=A, CN=OurDomain, CN=XYZ, CN=pki, DC=xyz, DC=com Эмитент: CN=XYZ-CA1-FR, CN=PKI, DC=XYZ, DC=com Алгоритм: RSA; Серийный номер: 0x43559d09
Действительно со вторника 19 июня 13:31:28 IST 2012 до пятницы 19 июня 14:01:28 IST 2015

После всего этого исключение говорит о том, что сертификат не найден. Вопросы здесь:

  1. Как мы подтверждаем, что сертификат, который я импортировал в cacerts, является тем, который ищет сервер?
  2. Я экспортировал сертификат из центра управления безопасностью Outlook (из раздела "Безопасность электронной почты"). Это правильный сертификат для подключения к серверу Exchange?

Заранее большое спасибо за любую помощь.

С Уважением,
Ashok

0 ответов

Другие вопросы по тегам