Мне грозит запрет задавать вопросы, но мне действительно нужно немного осветить проблему, с которой я сейчас сталкиваюсь.
Я написал код, который генерирует отчеты в защищенной (PCI-DSS) среде и выполняет следующие пост-генерации:
- Почтовые отчеты,
- Электронная почта, &
- 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 "