>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 28654 个阅读者 刷新本主题
 * 贴子主题:  用 SSLSocket和SSLSocketFactory访问https网站 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2019-11-07 12:14:25     消息  查看  搜索  好友  邮件  复制  引用

使用jdk自带的keystore,里面包含官方的证书,主流网站都有,自己的可以使用keytool导入

C:\Program Files\Java\jdk1.8.0_144/jre/lib/security/cacerts  默认密码changeit

直接运行就能看到网页源码
import java.net.*;
import java.io.*;
import javax.net.ssl.*;
import javax.security.cert.X509Certificate;
import java.security.KeyStore;
import java.util.Arrays;

/*
* This example shows how to set up a key manager to do client
* authentication if required by server.
*
* This program assumes that the client is not inside a firewall.
* The application can be modified to connect to a server outside
* the firewall by following SSLSocketClientWithTunneling.java.
*/

public class SSLSocketClientWithClientAuth {

    public static void main(String[] args) throws Exception {
        String host = null;
        int port = -1;
        String path = null;
//        for (int i = 0; i < args.length; i++)
//            System.out.println(args[i]);

//        if (args.length < 3) {
//            System.out.println("USAGE: java SSLSocketClientWithClientAuth host port requestedfilepath");
//            System.exit(-1);
//        }

        try {
//            host = args[0];
//            port = Integer.parseInt(args[1]);
//            path = args[2];

            host = "github.com";
//            host = "blog.csdn.net";
//            host = "www.baidu.com";
            port = 443;
            path = "/";
        } catch (IllegalArgumentException e) {
            System.out.println("USAGE: java SSLSocketClientWithClientAuth host port requestedfilepath");
            System.exit(-1);
        }

        try {

            /*
             * Set up a key manager for client authentication
             * if asked by the server.  Use the implementation's
             * default TrustStore and secureRandom routines.
             */

            SSLSocketFactory factory = null;
            try {
                SSLContext ctx;
                KeyManagerFactory kmf;
                KeyStore ks;
                char[] passphrase = "changeit".toCharArray();

                ctx = SSLContext.getInstance("TLS");
                kmf = KeyManagerFactory.getInstance("SunX509");
                ks = KeyStore.getInstance("JKS");

                ks.load(new FileInputStream("C:\\Program Files\\Java\\jdk1.8.0_144" + "/jre/lib/security/cacerts"), passphrase);

                kmf.init(ks, passphrase);
                ctx.init(kmf.getKeyManagers(), null, null);

                factory = ctx.getSocketFactory();
            } catch (Exception e) {
                throw new IOException(e.getMessage());
            }

            SSLSocket socket = (SSLSocket) factory.createSocket(host, port);

            /*
             * send http request
             *
             * See SSLSocketClient.java for more information about why
             * there is a forced handshake here when using PrintWriters.
             */

            System.out.println("start https request:" + host + " " + port + " " + path);
            socket.startHandshake();

            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
            out.println("GET " + path + " HTTP/1.1");
            out.println("Host: " + host);
            out.println();
            out.flush();

            /*
             * Make sure there were no surprises
             */

            if (out.checkError())
                System.out.println(
                        "SSLSocketClient: java.io.PrintWriter error");

            /* read response */
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                            socket.getInputStream()));

            String inputLine;

            //最好没有空行会阻塞在这里
            while ((inputLine = in.readLine()) != null)
                System.out.println(inputLine);

            in.close();
            out.close();
            socket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

————————————————
原文链接:https://blog.csdn.net/c5113620/article/details/80441327


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->集合(上)
  JavaWeb开发-->使用过滤器
  JSP与Hibernate开发-->数据库事务的并发问题的解决方案
  Java网络编程-->Java反射机制
  精通Spring-->Vue组件开发基础
  Vue3开发-->组合(Composition)API
  Doubles swept by Braves, set out 14 times in 3-0 loss
  利用堆栈将中缀表达式转换成后缀表达式
  JDK17的新特性
  BIO和NIO区别
  Java设计模式: 单一职责原则和依赖倒置原则详解
  JDK14的新特性
  好消息:孙卫琴老师等直播分享Java分布式架构专题
  使用 RocketMQ 事务消息,实现分布事务
  64匹马,8个赛道,找出跑得最快的4匹马
  Socket服务器的整体架构
  java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍
  Java入门实用代码:自定义异常
  通过Java读取Excel数据
  jdbc连接各种数据库代码
  Java程序代码优化技巧
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。