>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 28653 个阅读者 刷新本主题
 * 贴子主题:  用 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开发-->Servlet技术详解(Ⅱ)
  JSP与Hibernate开发-->映射组成关系
  Java网络编程-->用Spring整合CXF发布Web服务
  精通Spring-->
  Vue3开发-->Vue Router路由管理器
  [原创]汽車美容
  用VisualVM远程监控Java进程
  内部类的编程练习题
  编程语言搜索量排行:用十年数据告诉你什么最受欢迎
  Java并发编程之验证volatile不能保证原子性
  java常见的几种调用机制:同步调用,异步调用,回调
  Java设计模式:组合模式
  Java入门实用代码:死锁及解决方法
  Java入门实用代码:获取远程文件大小
  Java入门实用代码:修改链表LinkedList
  Java入门实用代码:删除链表中的元素
  Java入门实用代码:自定义异常
  Java入门实用代码: 方法重载
  Java 入门实用代码:数组扩容
  jdbc连接各种数据库代码
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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