Java отправляет почту в защищенной среде (PCI-DSS) - PullRequest
0 голосов
/ 28 августа 2018

Мне грозит запрет задавать вопросы, но мне действительно нужно немного осветить проблему, с которой я сейчас сталкиваюсь.

Я написал код, который генерирует отчеты в защищенной (PCI-DSS) среде и выполняет следующие пост-генерации:

  1. Почтовые отчеты,
  2. Электронная почта, &
  3. SFTP к банкам / внутренний.

Точка 2: электронная почта

Я использовал оболочку Spring, JavaMailSender , со следующей конфигурацией:

@Configuration
public class EmailConfigurations {

  @Autowired
  Environment env;

  @Bean
  public JavaMailSender getJavaMailSender() {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setHost(env.getProperty("spring.mail.host"));
    mailSender.setPort(Integer.parseInt(env.getProperty("spring.mail.port")));

    mailSender.setUsername(env.getProperty("spring.mail.username"));
    mailSender.setPassword(env.getProperty("spring.mail.password"));

    Properties props = mailSender.getJavaMailProperties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.debug", "true");
    props.put("mail.smtp.ssl.protocols", "TLSv1.2");

    return mailSender;
  }

}

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

package org.something.not.working;

import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import com.innoviti.emi.file.model.EmailModel;
import com.innoviti.emi.file.service.IEmailService;
import com.innoviti.emi.file.utility.Properties;

@Service
public class EmailServiceImpl implements IEmailService {

  private static final Logger LOG = LoggerFactory.getLogger(EmailServiceImpl.class);

  @Autowired
  public JavaMailSender emailSender;

  @Autowired
  Properties properties;

  @Override
  public void sendMessageWithAttachment(EmailModel model, List<Path> pathToAttachment)
      throws MessagingException, IOException {
    MimeMessage message = emailSender.createMimeMessage();
    message.addRecipients(MimeMessage.RecipientType.TO,
        InternetAddress.parse(toRecipients(model.getTo())));
    message.setSubject(model.getSubject());
    message.setFrom(new InternetAddress(model.getFrom()));

    BodyPart messageBodyPart = new MimeBodyPart();
    messageBodyPart.setText(model.getText());

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    if (pathToAttachment != null && !pathToAttachment.isEmpty()) {
      for (Path filePath : pathToAttachment) {
        MimeBodyPart attachPart = new MimeBodyPart();
        try {
          attachPart.attachFile(filePath.toFile().getCanonicalPath());
        } catch (IOException e) {
          LOG.error("IO error while attaching file to mail.", e);
          throw e;
        }
        multipart.addBodyPart(attachPart);
      }
    }
    message.setContent(multipart);
    emailSender.send(message);
    LOG.info("Request of email completed, {}", "for daily Emi Off Us files & SBI INCMS file.");
  }

  private String toRecipients(String[] tos) {
    if (tos == null || tos.length == 0)
      return null;
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < tos.length; i++) {
      sb.append(tos[i]).append(",");
    }
    return sb.toString().substring(0, sb.length() - 1);
  }

  @Override
  public void triggerMail(EmailModel model, Path attachment)
      throws MessagingException, IOException {
    List<Path> allAttachments = new ArrayList<>();
    if (attachment != null) {
      allAttachments.add(attachment);
    }
    this.sendMessageWithAttachment(model, allAttachments);
  }
}

Все это хорошо работало в dev, а также в тестовой среде UNLESS оно было перемещено в безопасную (PCI-DSS) среду.

Вот ошибка, которую я получаю:

DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
2018-08-23 06:40:00.993 ERROR 27545 [taskScheduler-7] --- c.i.emi.file.scheduler.EmailScheduler    : Line No. 47 : Error while fetching all files root path.
org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not convert socket to TLS;
  nested exception is:
        java.net.SocketException: java.security.NoSuchAlgorithmException: Default SSLContext not available. Failed messages: javax.mail.MessagingException: Could not convert socket to TLS;
  nested exception is:
        java.net.SocketException: java.security.NoSuchAlgorithmException: Default SSLContext not available
        at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:432)
        at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:345)
        at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
        at org.something.which.has.email.impl.EmailServiceImpl.sendMessageWithAttachment(EmailServiceImpl.java:68)
        at org.something.which.has.scheduler.EmailScheduler.shootEmail(EmailScheduler.java:45)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
        at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: javax.mail.MessagingException: Could not convert socket to TLS
        at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:2064)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:724)
        at javax.mail.Service.connect(Service.java:366)
        at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:501)
        at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:421)
        ... 18 common frames omitted
Caused by: java.net.SocketException: java.security.NoSuchAlgorithmException: Default SSLContext not available
        at javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:248)
        at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:270)
        at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:524)
        at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:2059)
        ... 22 common frames omitted
Caused by: java.security.NoSuchAlgorithmException: Default SSLContext not available
        at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
        at javax.net.ssl.SSLContext.getInstance(SSLContext.java:156)
        at javax.net.ssl.SSLContext.getDefault(SSLContext.java:96)
        at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:122)
        at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:519)
        ... 23 common frames omitted

Я искренне понятия не имею, что нужно сделать.

Для воспроизведения в моем локальном устройстве я изменил следующее в JAVA_HOME: ... jdk / jre / library / security / java.security

1. Ограничения алгоритма для обработки пути сертификации (CertPath):

// Пример:
// jdk.certpath.disabledAlgorithms = MD2, DSA, RSA keySize <2048 </p>

(added this) **jdk.certpath.disabledAlgorithms=MD2, DSA, SSLv3, RSA keySize < 3096**     

// jdk.certpath.disabledAlgorithms = MD2, MD5, SHA1 jdkCA и использование TLSServer, // RSA keySize <1024, DSA keySize <1024, EC keySize <224 </p>

2. Ограничения алгоритма для подписанных файлов JAR:

// jdk.jar.disabledAlgorithms = MD2, MD5, RSA keySize <1024, DSA keySize <1024 </p>

(added this)  **jdk.jar.disabledAlgorithms=MD2, MD5, RC4, SSLv3, RSA keySize < 3096, DSA keySize < 3096**

3. Ограничения алгоритма безопасности Secure Socket Layer / Transport Layer Обработка (SSL / TLS):

(added this)  **jdk.tls.disabledAlgorithms=MD5, RC4, SSLv3, DSA, RSA keySize < 3096**

// jdk.tls.disabledAlgorithms = SSLv3, RC4, MD5 с RSA, DH keySize < 1024, \ Размер ключа EC <224, DES40_CBC, RC4_40 </p>

  • Почему? Чтобы иметь что-то похожее на защищенную среду.

  • Тогда? Это ошибка, которую я получаю после публикации трассировки стека.

  • Сейчас? Я не уверен. Понятия не имею.

Должен ли я каким-то образом убедиться, что SMTP , который я использую ( gmail ), должен понимать эту среду? Если да, то как ?

Если MIME будет что-то вроде application/x-pkcs7-mime

Пожалуйста, дайте мне знать, если у кого-нибудь есть идеи!

Java-версия - " 1.8.0_162 "

...