Проблемы Javamail после использования магазина ключей

StackOverflow https://stackoverflow.com//questions/21065472

  •  26-12-2019
  •  | 
  •  

Вопрос

У меня странная проблема с приложением JSF, на которой я сейчас работаю. Похоже, есть две части моей программы, которые сталкиваются.

Есть две части:

    .
  • Функциональность «банковских»
  • Функциональность почты

соответствующая часть функциональности банковской функции (это фальшивый банк только для этого упражнения):

String path = FacesContext.getCurrentInstance().getExternalContext()                .getRealPath("/") + "/WEB-INF/sec/certs.jks";

ErrorHandler.trace(path);

System.setProperty("javax.net.ssl.trustStore", path);
.

Здесь он устанавливает Trust Store с сертификатом для банковского сервера.

mail деталь выглядит так:

Properties props = new Properties();
props.put("mail.smtp.auth", this.smtpServer.isAuthenticated());
props.put("mail.smtp.starttls.enable", this.smtpServer.isTls());
props.put("mail.smtp.host", this.smtpServer.getHostaddr());
props.put("mail.smtp.port", this.smtpServer.getPort());
props.put("mail.smtps.auth", "true");
props.put("mail.smtp.debug", "true");

final String username = this.smtpServer.getUsername();
final String password = this.smtpServer.getPassword();

Session session = Session.getDefaultInstance(props,
        new javax.mail.Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

session.setDebug(true);
.

<Сильный> Один из способов воспроизвести задачу:

Проблема, с которой я сталкиваюсь, это то, что если я начну приложение и, например, используйте функциональные возможности «Изменить почту», я немедленно получу мою почту уведомления. Нет проблем там. Тогда я постараюсь купить продукт, вызванный таким образом функциональность банка.

Вот где появляется проблема:

Communication Error: javax.ws.rs.WebApplicationException: javax.xml.bind.MarshalException
 - with linked exception:
[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]
.

Еще один способ воспроизвести задачу:

Теперь, скажем, я перезагрузию свое приложение и попытаюсь заказать что-то, на этот раз он будет работать, но функциональность почты сломана с этим сообщением об ошибке:

DEBUG: setDebug: JavaMail version 1.4.7
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true
TRACE Error Could not connect to SMTP host: smtp.gmail.com, port: 465
.

<Сильная> Нижняя строка:

Если я вызываю банк, а затем почта -> почта не работает Если я запускаю почту, а затем банк -> Банк не работает

Любой, кто мог бы найти проблему там?

Спасибо!

Это было полезно?

Решение

Ваша «банковская функциональность» меняет трастовый магазин.Этот новый магазин Trust должен иметь сертификаты, необходимые для проверки соединения SSL с вашим почтовым сервером.Вы можете инициализировать свой Trust Store со всеми сертификатами CA от Thread Trust Churre Trust, или вы можете добавить только конкретный сертификат для вашего почтового сервера - см. InstallCert программа.Наконец, вы можете настроить JavaMail для использования отдельного трастового хранилища или изменение функциональности банкинга для использования хранилища доверия явно вместо того, чтобы переопределить хранилище Thurn Deal;те, вероятно, более сложные.

Другие советы

Проблема была, что функциональность почты работала, если нет набора TrustStore (потому что он использует Truststore System по умолчанию, которое находится в:

/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/security/cacerts
.

на Mac.

Банковская функциональность использует свой собственный сертификат, который был расположен в:

MyProject/.../WEB-INF/sec/certs.jks
.

Каждый раз, когда JavaMail пытался аутентифицироваться на SMTP-сервере Google, он пытался использовать сертификат. JKS TrustStor, хотя я не представляю, что свойство Truststore Banking Fuctionaliance набор в методе почты.

<Сильное> Исправление:

В начале почтового метода:

String path = FacesContext.getCurrentInstance().getExternalContext()
            .getRealPath("/")
            + "WEB-INF/sec/certs.jks";
System.setProperty("javax.net.ssl.trustStore", path);
.

Импортируйте клавише cacerts по умолчанию в наш собственный пользовательский ключевой магазин:

keytool -importkeystore -srckeystore certs.jks -destkeystore cacerts
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top