【问题标题】:Can't call EWS service with API Java SSL and certificates无法使用 API Java SSL 和证书调用 EWS 服务
【发布时间】:2015-06-09 16:11:11
【问题描述】:

我实际上正在研究 EWS Java API。目标是访问日历中的数据。于是我开始学习如何使用 EWS Java API。

从一个示例开始,我发现了一些问题:

ExchangeService service = new ExchangeService();
        ExchangeCredentials credentials = new WebCredentials("me@company.com",  "password");    
        service.setCredentials(credentials);            
        //WebProxy webProxy = new WebProxy("proxy.domain.company", 8080);
        //There's no credentials for the proxy 
        //service.setWebProxy(webProxy);  
        try {
            service.setUrl(new URI("https://domain.company/ews/exchange.asmx"));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }    
        EmailMessage msg;
        try {
            msg = new EmailMessage(service);
            msg.setSubject("hello world");
            msg.setBody(MessageBody.getMessageBodyFromText("Sent using the EWS API"));
            msg.getToRecipients().add("my.boss@company.com");
            msg.send();
        } catch (Exception e) {
            e.printStackTrace();
        }

执行代码首先给了我与依赖关系相关的错误,然后是第二次认证和 SSL,这是控制台的跟踪:

    ------------------------------------------------------------------------
    Building ol-v01 1.0-SNAPSHOT
    ------------------------------------------------------------------------

    --- exec-maven-plugin:1.2.1:exec (default-cli) @ ol-v01 ---
    microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException: The request failed. 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.core.request.SimpleServiceRequestBase.int...
    Caused by: microsoft.exchange.webservices.data.core.exception.service.remote.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
    ....
    ... 38 more
    ------------------------------------------------------------------------
    BUILD SUCCESS
    ------------------------------------------------------------------------
    Total time: 7.891s
    Finished at: Tue Jun 09 17:49:04 CEST 2015
    Final Memory: 5M/119M
    ------------------------------------------------------------------------

我正在尝试解决这个问题:

我发现了一些同样问题的问题,我按照步骤在JAVA_HOME\lib\security\cacerts下用keytool安装了从浏览器下载的证书

我使用第三方证书颁发机构下的mmc.exe 工具将其添加到。

所以我可以看到安装的证书

有没有办法解决这个问题?有没有我没有进行的步骤?我也想知道 EWS 是否让我禁用 SSL 检查?

注意:服务器是 Entreprise Exchange 2010 SP2,所以我将使用我的帐户进行测试,并且我在 VM 上安装了一个本地服务器来查看差异和问题,因为我的代理有一些问题。

另外,我想知道服务器的管理员是否需要激活某些东西才能使用 EWS?

感谢您的帮助。

更新 2

这是在 MS Server 2012 VM 上安装我自己的 Exchange 2010 服务器后的结果。

我可以通过https://192.168.1.59/owa/访问OWA

在一些问题和教程中,我将证书从浏览器导出到文件。名称为verifyfail.WIN-NS09AI4QBB8,CN = verifyfail.WIN-NS09AI4QBB8

我不知道为什么这个名字,但没关系。

文件名为verifyfail.WIN-NS09AI4QBB8.cer

然后我使用 keytool 将此证书添加到 JAVA_HOME\lib\security\cacerts。我用作别名verifyfail.WIN-NS09AI4QBB8

我还使用第三方证书颁发机构下的 mmc.exe 工具将其添加到。

代码是这样的:

    ExchangeService service = new ExchangeService();
    ExchangeCredentials credentials = new WebCredentials("ab@domain.com",  "P@ssw0rd");
    service.setCredentials(credentials);                 
    try {
        service.setUrl(new URI("https://192.168.1.59/ews/exchange.asmx"));
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
    EmailMessage msg;
    try {
        msg = new EmailMessage(service);
        msg.setSubject("hello world");
        msg.setBody(MessageBody.getMessageBodyFromText("Sent using the EWS API"));
        msg.getToRecipients().add("pp@domain.com");
        msg.send();
    } catch (Exception e) {
        e.printStackTrace();
    }

我的 POM 文件包含这些依赖项:

    <dependency>
        <groupId>com.microsoft.ews-java-api</groupId>
        <artifactId>ews-java-api</artifactId>
        <version>2.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.4.1</version>
    </dependency>

作为输出,我收到了这个错误:The request failed. The request failed. Host name '192.168.1.59' does not match the certificate subject provided by the peer (CN=WIN-NS09AI4QBB8)

以及执行的痕迹:

------------------------------------------------------------------------
Building ol-v01 1.0-SNAPSHOT
------------------------------------------------------------------------

--- exec-maven-plugin:1.2.1:exec (default-cli) @ ol-v01 ---
microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException: The request failed. The request failed. Host name '192.168.1.59' does not match the certificate subject provided by the peer (CN=WIN-NS09AI4QBB8)
    at microsoft.exchange.webservices.data.core.request.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:74)
    at microsoft.exchange.webservices.data.core.request.MultiResponseServiceRequest.execute(MultiResponseServiceRequest.java:158)
    at microsoft.exchange.webservices.data.core.ExchangeService.internalCreateItems(ExchangeService.java:594)
    at microsoft.exchange.webservices.data.core.ExchangeService.createItem(ExchangeService.java:653)
    at microsoft.exchange.webservices.data.core.service.item.Item.internalCreate(Item.java:245)
    at microsoft.exchange.webservices.data.core.service.item.EmailMessage.internalSend(EmailMessage.java:147)
    at microsoft.exchange.webservices.data.core.service.item.EmailMessage.send(EmailMessage.java:258)
    at com.soprahr.ol.v01.T10.testMethod(T10.java:46)
    at com.soprahr.ol.v01.T10.main(T10.java:24)
Caused by: microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException: The request failed. Host name '192.168.1.59' does not match the certificate subject provided by the peer (CN=WIN-NS09AI4QBB8)
    at microsoft.exchange.webservices.data.core.request.ServiceRequestBase.getEwsHttpWebResponse(ServiceRequestBase.java:729)
    at microsoft.exchange.webservices.data.core.request.ServiceRequestBase.validateAndEmitRequest(ServiceRequestBase.java:639)
    at microsoft.exchange.webservices.data.core.request.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:62)
    ... 8 more
Caused by: javax.net.ssl.SSLPeerUnverifiedException: Host name '192.168.1.59' does not match the certificate subject provided by the peer (CN=WIN-NS09AI4QBB8)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.verifyHostname(SSLConnectionSocketFactory.java:465)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:395)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:134)
    at org.apache.http.impl.conn.BasicHttpClientConnectionManager.connect(BasicHttpClientConnectionManager.java:338)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at microsoft.exchange.webservices.data.core.request.HttpClientWebRequest.executeRequest(HttpClientWebRequest.java:292)
    at microsoft.exchange.webservices.data.core.request.ServiceRequestBase.getEwsHttpWebResponse(ServiceRequestBase.java:720)
    ... 10 more
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 2.145s
Finished at: Wed Jun 10 04:34:14 CEST 2015
Final Memory: 5M/119M
------------------------------------------------------------------------

更新 3

在证书的详细信息选项卡中,Oject Key 的值为 CN = verifyfail.WIN-NS09AI4QBB8,与 CN=WIN-NS09AI4QBB8 不同

我使用浏览器下载的证书包含verifyfail.WIN-NS09AI4QBB8。

在这种情况下,我应该怎么做才能避免这个问题?

【问题讨论】:

  • 该错误与 EWS API 没有直接关系,在您的信任库中找不到服务器证书,看看这个 SO 问题stackoverflow.com/questions/9619030/…
  • 我遵循了链接中的解决方案。我可以使用 keystore -list 命令在列表中看到证书的别名,但错误仍然存​​在...

标签: java calendar exchangewebservices exchange-server-2010


【解决方案1】:

该错误与 DNS 问题或服务器证书中的名称问题有关。

确保证书 (WIN-NS09AI4QBB8) 的 CN attribute 中的名称可解析并返回正确的 IP 地址 (192.168.1.59)。

CN 属性值中的名称必须在 DNS 中解析为服务器的 IP 地址。错误信息

The request failed. The request failed. Host name '192.168.1.59' does not match the certificate subject provided by the peer (CN=WIN-NS09AI4QBB8)

由于无法解析 DNS 名称或解析到错误的 IP 而发生。

【讨论】:

    【解决方案2】:

    我也有同样的问题。 我已经下载了我的证书并将其导入到密钥库中。 在我的代码中我说:

        systemProps.put(
                "javax.net.ssl.trustStore",
                "C:/Program Files/Java/jdk1.8.0/jre/lib/security/cacerts"
            );
    
        systemProps.put("javax.net.ssl.trustStorePassword","changeit");
    
    
    
        System.setProperties(systemProps);
    

    当我手动设置网址时:我收到此错误:

    ServiceRequestException:请求失败。请求失败。这 远程服务器返回错误:(401)Unauthorized

    当我使用自动发现时,我找不到任何端点:

    类型:自动发现配置消息: 确定为主机 mycompany.com 启用了哪些端点

    类型:自动发现配置消息: 主机返回启用的端点标志:[Legacy]

    类型:自动发现配置消息: 主机 mycompany.com 没有可用的自动发现端点

    【讨论】:

      【解决方案3】:

      在 url 中,不要使用 ip,而是使用主机名,例如。 https://172.50.1.73/owa,而不是https://exchange/owa,在这里你应该写到hosts文件的映射关系,例如。 172.50.1.73 交换;

      【讨论】:

        【解决方案4】:

        我已手动下载证书并使用以下命令将其导入我的密钥库:keytool -importcert -file nameofCertificate.(crt|cert) -keystore key store.jks -别名“EWScert” 然后我将此命令添加到我的代码中 System.setProperty("javax.net.ssl.trustStore",CERTIFICATION_FILE); CERTIFICATION_FILE 是我的证书文件的路径,它位于 C:\Program Files\Java\jre1.8.0_121\lib\security\cacerts

        所有这些步骤都解决了我的问题

        【讨论】:

          猜你喜欢
          • 2019-01-05
          • 2015-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-08
          • 2015-09-19
          • 1970-01-01
          相关资源
          最近更新 更多