12.安装证书

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 {

// 传入ip:port  如:java InstallCert 10.16.24.195:8080
public static void main(String[] args) throws Exception {
    String host;
    int port;
    char[] passphrase;
    if ((args.length == 1) || (args.length == 2)) {
        String[] c = args[0].split(":");
        host = c[0];
        port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
        String p = (args.length == 1) ? "changeit" : args[1];
        passphrase = p.toCharArray();
    } 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);
    }
}
</host>

}

Original: https://www.cnblogs.com/NIAN2011/p/16663644.html
Author: NIANER2011
Title: 12.安装证书

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609031/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JVM基础(狂神)

    JVM探究 谈谈你对JVM的理解?java8虚拟机和之前的变化更新 什么是OOM,什么是栈溢出?怎么分析 JVM的常用调优参数有哪些? 内存快照如何抓取,怎么分析Dump文件? 谈…

    Java 2023年6月9日
    095
  • Photoshop CS安装教程

    百度云下载: 软件下载完成后,解压文件,找到Set-up.exe文件,双加运行,一直点击下一步(如需安装到D盘或者其他盘,可更改安装路径,选择试用)即可完成安装。 破解文件下载路径…

    Java 2023年6月16日
    080
  • MySQL 服务无法启动。服务没有报告任何错误。

    版本8.0.25,今天启动发现抱错,网上搜索一下发现这样可行 启动MySQL报错: 搜索了一下,按照这样步骤解决了 1.配置一下my.ini [mysqld] basedir =&…

    Java 2023年6月13日
    0100
  • [已解决] OpenFeign 调用服务提供者出现的BUG

    java.lang.AbstractMethodError: Receiver class org.springframework.cloud.netflix.ribbon.Rib…

    Java 2023年6月15日
    065
  • GeoHash(Java实现)

    java;gutter:true; package com.koubei.collect_script.demo;</p> <p>import java.u…

    Java 2023年5月29日
    093
  • 用户态与内核态,上下文的理解

    系统调用 为了安全应用程序无法直接调用的硬件的功能,而是将这些功能封装成特定的函数。当应用程序需要硬件功能时(例如读写文件),就需要进行系统调用。当进程进行系统调用后就从用户态装换…

    Java 2023年6月6日
    069
  • Collections.sort排序方法的最简化写法

    Collections.sort排序方法的最简化写法 Collections.sort排序方法的最简化写法 假定按照Number对象的Id字段进行排序 正序排序 Collectio…

    Java 2023年6月16日
    093
  • JDBC

    概念:JDBC即Java DataBase Connectivity,Java数据库连接,Java语言操作数据库 本质:是官方(sun公司)定义的一套所有关系型数据库的规则,即接口…

    Java 2023年6月6日
    0103
  • JAVA入门基础_从零开始的培训_MYSQL高级

    第1章 Linux下MySQL的安装与使用 Linux下MYSQL的卸载 安装MYSQL之前的准备步骤 正式安装 检查/tmp临时目录权限 安装前检查依赖并卸载mariadb 按照…

    Java 2023年6月9日
    061
  • APS实现的要点与难点

    在前一篇关于文章中讨论了不同层级、粒度的生产计划,在各行业中受重视程度的差异问题。 承蒙大家热烈讨论。本文则在收集各方高见的基础上,对于供应链上各个环节的运营、生产计划再作稍微深入…

    Java 2023年6月16日
    080
  • 1.20(设计模式)模板模式

    模板模式,定义了一个模板,模板内容通过子类实现模板的抽象方法去添加。 就类似学校需要建一个新校区,新校区有多栋宿舍,找了多个施工方,每个施工方负责一栋宿舍楼。 各个施工方都有自己的…

    Java 2023年6月8日
    0169
  • CentOS7下FTP的安装与配置2

    1、安装 yum install -y vsftpd 2、配置FTP 3、建立用户文件 4、生成用户加密数据 5、修改 /etc/pam.d/vsftpd 文件 6、新建系统用户t…

    Java 2023年5月29日
    089
  • redis续集

    SDS (Simple Dynamic String)是 Redis 最基础的数据结构。直译过来就是”简单的动态字符串”。Redis 自己实现了一个动态的字…

    Java 2023年6月5日
    079
  • Spring Security 案例实现和执行流程剖析

    在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin Spring Security Spring Securi…

    Java 2023年5月30日
    090
  • Java 多线程共享模型之管程(下)

    共享模型之管程 wait、notify wait、notify 原理 Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态 B…

    Java 2023年6月9日
    097
  • 四大编程原则

    高内聚、低耦合原则: 让一个模块做到独立,做到精益求精,同时把模块间的耦合降到最低,不会因为动了一个模块,而导致其他模块出问题。 高内聚也就是:相似的东西放在一起;而低耦合:不一样…

    Java 2023年6月15日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球