java发送邮件报SSL安全异常解决

2023-11-12

用公司阿里云企业邮箱发送邮件,一直报javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider... 异常,顾名思义是安全验证问题,以下是生成安全证书后终于可以正常发送了。

1.拷贝下面代码,将data里的邮箱服务器和端口换成自己的!我这里是阿里云"smtp.mxhichina.com:465"
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
public class InstallCert {
    public static void main(String[] args) throws Exception {
        String host;
        int port;
        char[] passphrase;
        String[] data = new String[]{"smtp.mxhichina.com:465"};
        if ((data.length == 1) || (data.length == 2)) {
            String[] c = data[0].split(":");
            host = c[0];
            port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
            String p = "changeit";
            passphrase = p.toCharArray();
            System.out.println("host->"+host);
            System.out.println("port->"+port);
        } else {
            System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");
            return;
        }
        File file = new File("jssecacerts");
        if (file.isFile() == false) {
            char SEP = File.separatorChar;
            File dir = new File(System.getProperty("java.home") + SEP + "lib"
                    + SEP + "security");
            file = new File(dir, "jssecacerts");
            if (file.isFile() == false) {
                file = new File(dir, "cacerts");
            }
        }
        System.out.println("Loading KeyStore " + file + "...");
        InputStream in = new FileInputStream(file);
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(in, passphrase);
        in.close();
        SSLContext context = SSLContext.getInstance("TLS");
        TrustManagerFactory tmf = TrustManagerFactory
                .getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        X509TrustManager defaultTrustManager = (X509TrustManager) tmf
                .getTrustManagers()[0];
        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
        context.init(null, new TrustManager[]{tm}, null);
        SSLSocketFactory factory = context.getSocketFactory();
        System.out
                .println("Opening connection to " + host + ":" + port + "...");
        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
        socket.setSoTimeout(10000);
        try {
            System.out.println("Starting SSL handshake...");
            socket.startHandshake();
            socket.close();
            System.out.println();
            System.out.println("No errors, certificate is already trusted");
        } catch (SSLException e) {
            System.out.println();
            e.printStackTrace(System.out);
        }
        X509Certificate[] chain = tm.chain;
        if (chain == null) {
            System.out.println("Could not obtain server certificate chain");
            return;
        }
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                System.in));
        System.out.println();
        System.out.println("Server sent " + chain.length + " certificate(s):");
        System.out.println();
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        for (int i = 0; i < chain.length; i++) {
            X509Certificate cert = chain[i];
            System.out.println(" " + (i + 1) + " Subject "
                    + cert.getSubjectDN());
            System.out.println(" Issuer " + cert.getIssuerDN());
            sha1.update(cert.getEncoded());
            System.out.println(" sha1 " + toHexString(sha1.digest()));
            md5.update(cert.getEncoded());
            System.out.println(" md5 " + toHexString(md5.digest()));
            System.out.println();
        }
        System.out
                .println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
        String line = reader.readLine().trim();
        int k;
        try {
            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
        } catch (NumberFormatException e) {
            System.out.println("KeyStore not changed");
            return;
        }
        X509Certificate cert = chain[k];
        String alias = host + "-" + (k + 1);
        ks.setCertificateEntry(alias, cert);
        OutputStream out = new FileOutputStream("jssecacerts");
        ks.store(out, passphrase);
        out.close();
        System.out.println();
        System.out.println(cert);
        System.out.println();
        System.out
                .println("Added certificate to keystore 'jssecacerts' using alias '"
                        + alias + "'");
    }
    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
    private static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 3);
        for (int b : bytes) {
            b &= 0xff;
            sb.append(HEXDIGITS[b >> 4]);
            sb.append(HEXDIGITS[b & 15]);
            sb.append(' ');
        }
        return sb.toString();
    }
    private static class SavingTrustManager implements X509TrustManager {
        private final X509TrustManager tm;
        private X509Certificate[] chain;
        SavingTrustManager(X509TrustManager tm) {
            this.tm = tm;
        }
        public X509Certificate[] getAcceptedIssuers() {
            throw new UnsupportedOperationException();
        }
        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            throw new UnsupportedOperationException();
        }
        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            this.chain = chain;
            tm.checkServerTrusted(chain, authType);
        }
    }
}

2.运行程序,会有如下提示Enter certificate to add to trusted keystore or 'q' to quit: [1]

按1再按回车

3.然后在你的项目路径下生成了一个jssecacerts文件

4.复制文件的路径,在发送邮件代码之前设置安全证书的位置,我的如下:

System.setProperty("javax.net.ssl.trustStore","E:\\ActionProject\\Email\\jssecacerts");

5.然后运行发送邮件代码就可以正常发送了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java发送邮件报SSL安全异常解决 的相关文章

随机推荐

  • org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder 找不到依赖包

    org springframework boot autoconfigure jdbc DataSourceBuilder 找不到依赖包 org springframework boot autoconfigure jdbc DataSou
  • PowerOJ2546: fork【C++ STL __gnu_cxx::rope】

    题目链接 我们可以这样定义一个可持久化数组 rope
  • MIPI TX控制器的设计

    MIPI接口在移动设备中被广泛应用 主要用于传输图像传感器 液晶显示器等外设的数据 以MIPI DPHY v1 2为例 它包含一个CLK lane和若干个DATA lane 可配置 每个lane的最高速率可达到2 5Gbps 对比SerDe
  • 向win7旗舰版U盘启动盘 添加usb3.0driver

    以前的主板usb采用的是ehci controller 仅支持usb2 0 而现在的主板一般采用xhci controller 同时支持usb2 0和usb3 0 win7的镜像安装包里面的驱动并没有xhci的驱动 所以在如今的很多新平台的
  • 怎么样对阿里云ECS主机进行绑定域名

    首先我有个阿里的 域名 虚拟云主机 搭建了一个wordpress 的网站 地址为 www liuxun name wordpress liuxun name wordpress 现在我想把一个阿里云的ECS主机 里面装了tomcat 希望以
  • GET请求里的body问题

    故事还得从一个bug说起 今天有人问我 为什么发到后端的请求400了 我说肯定是参数不对 你去检查检查GET POST之类的方法写没写对 要么就是字段没对上 无非是这几个问题 然后他说检查过了 没问题啊 我不太相信 但是看了看前端发送的请求
  • springmvc 03(JSR303和拦截器)

    目录 一 JSR303 1 服务端验证 2 步骤 二 拦截器 1 简介 2 拦截器与过滤器 2 1 什么是过滤器 2 2 拦截器和过滤器的区别 3 拦截器案例 3 1 使用原理 一 JSR303 1 服务端验证 2 步骤 1 导入pom x
  • 【数据结构】6.5 红黑树(C++)

    数据结构 6 5 红黑树 没有学过二叉搜索树 也叫二叉排序树或二叉查找树 的小伙伴们建议先学习一下 这样阅读会更轻松哦 点我学习二叉搜索树 目录 一 红黑树的概念和性质 二 红黑树的存储结构和声明 三 红黑树的构建过程 四 红黑树的实现 1
  • Windows7上使用VS2013编译Caffe源码(不带GPU支持)步骤

    1 从https github com BVLC caffe 通过git clone下载caffe源码 master分支 版本号为09868ac git clone https github com BVLC caffe git 2 先使用
  • Visio画出简单的拓扑图

    1 选择类别 类别 网络 基本网络图 2 画图 在左边选择 模具 上方选择 连接线
  • Ubuntu下编译并运行C++代码

    安装完Ubuntu后 用户目录有时候也叫 home 文件夹或者主文件夹 它的路径是 home username 其中 username 就是我们登录 Linux 时使用的用户名 Linux 会在 home 目录下为每一个登录的用户创建一个文
  • Java中泛型

    Thinking in Java 第15章笔记 即使使用了接口 就要求代码必须使用特定的接口 对程序的约束也还是太强了 我们希望达到的目的是编写更通用的代码 要使代码能够应用与 某种不具体的类型 而不是一个具体的接口或类 泛型这个术语的意思
  • 2023-05-30 题目

    一 LinkedList 1 特点 线程不安全 底层是链表 删除 插入数据快 查询速度较慢 如果想让其变成线程安全的 可以使用Collections synchronizedList 方法 链表底层结构 2 源码如下 Pointer to
  • 电磁兼容按GB4824-2019分类,为1组A类和2组A类,是如何区分?

    电磁兼容按GB4824 2019分类 为1组A类和2组A类 是如何区分 摘要 电磁兼容按GB4824 2019分类 为1组A类和2组A类 是如何区分 GB4824 2019分类 设备的分组与分类 分组 为了简化区分相关限值 本标准范围内的设
  • 请求分页系统中的置换算法(FIFO、LRU、Optimal)

    操作系统实验导航 实验一 银行家算法 https blog csdn net weixin 46291251 article details 115384510 实验二 多级队列调度和多级反馈队列调度算法 https blog csdn n
  • Spring Boot 使用WebSocket、SockJS、STOMP实现消息功能(三)

    一 介绍 这里主要基于上一篇介绍一下基于SocketJS Stomp来实现的的长连接 我借鉴了其他的一些博客 只是把我用的知识总结在了一起方便我自己以后回顾 二 WebSocket概念 概述 WebSocket协议提供了通过一个套接字实现全
  • 10年老技术人员:C++ 该如何快速入门?

    C 是一门面对对象的语言 我们如何学习呢 其实任何的难题都是多种简单的部分通过复杂的关系组合在一起 学语言 最关键的是理解而不是运用 高中的时候 老师给出的公式 都是告诉我们用就好了 不用去了解它怎么来的 但是语言不一样 你如果只会用那你是
  • UnityEditor-批处理Texture,spriteEditor,代码设置Pivot失效问题

    需求起因 最近制作角色2D八方向的动画 美术提供的序列帧图片资源 角色不同动作不同方向的图片大小和角色实际的中心点是不一致的 如图所示 攻击和溃败的序列帧图片尺寸和角色在图片中心位置是不一样的 这样会导致一个问题 在动画状态切换的时候 犹豫
  • R-CNN网络基础

    目录 R CNN网络基础 Overfeat模型 RCNN模型 算法流程 候选区域生成 CNN网络提取特征 目标分类 SVM 目标定位 预测过程 算法总结 Fast RCNN模型 算法流程 ROI Pooling 目标分类和回归 模型训练 模
  • java发送邮件报SSL安全异常解决

    用公司阿里云企业邮箱发送邮件 一直报javax net ssl SSLHandshakeException PKIX path building failed sun security provider 异常 顾名思义是安全验证问题 以下是