cacerts 文件路径:运行java -verbose后, 开始第一行就是java jdk主路径,主路径下/lib/security/cacerts
我的完整路径:/usr/lib/jvm/java-11-openjdk-amd64/lib/security/cacerts
cacerts 是加密文件,默认密码为changeit
好了,最后一步修改eclipse run 运行输入参数:-Djavax.net.ssl.trustStore=/usr/lib/jvm/java-11-openjdk-amd64/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit
下面有设置截图,当然 如用命令行javac 就直接带上这一串参数。
SSL网络编程都是由SSLServerSocketFactory SSLSocketFactory 两个类转换到 ServerSocket,Socket来完成,最终都归到socket 编程。所以我们只要理解了网络传输的各种协议,就可用socket 结合协议编出各种网络程序。经查才知道chrome没有truststore信任库,本来想拿chrome 浏览器的truststore 库来试试能不能也可以读https 。但是完全可以把浏览器下载的网页指纹加在cacerts中,作为truststore使用。先搞清楚openssl和https协议后,慢慢分解这个https认证过程。我一定要搞一个socket 版的https认证程序。戏称,要把java c 化。
读网页文件有两种思路,一种是用socket , 另一种是用httpconnection. 但第一种要自己写http,https请求协议。后一种java已封装好了,直接拿来用,但输出没有第一种灵活全面。
代码如下 ,留存参考
import java.io.*;
import java.net.*;
import javax.net.ssl.SSLSocketFactory;
public class Sslclient {
public static void main(String[] args) {
SSLSocketFactory ssf=(SSLSocketFactory)SSLSocketFactory.getDefault();
try {
Socket sc=ssf.createSocket("cn.bing.com",443);
OutputStream os=sc.getOutputStream();
InputStream is=sc.getInputStream();
os.write("GET / HTTP/1.1\r\n".getBytes());
os.write("Host:cn.bing.com\r\n".getBytes());
os.write("Connection:close\r\n\r\n".getBytes());
os.flush();
InputStreamReader isr=new InputStreamReader(is,"UTF-8");
int k;
String s="";
do{
k=isr.read();
s=s+(char)k;
}while(k!=-1);
System.out.print(s);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}