Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过使用自己的密钥库而不是将证书添加到Java JVM';s默认cacerts_Java_Batch File_Ssl_Keytool_Self Signed - Fatal编程技术网

通过使用自己的密钥库而不是将证书添加到Java JVM';s默认cacerts

通过使用自己的密钥库而不是将证书添加到Java JVM';s默认cacerts,java,batch-file,ssl,keytool,self-signed,Java,Batch File,Ssl,Keytool,Self Signed,这是我第一次使用SSL,我正在尝试在本地机器上创建并使用自签名证书(目前) 我已使用以下批处理文件创建我的证书: @ECHO关闭 rem keytool文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html 设置JAVA\u HOME=C:\Program Files\JAVA\jre1.8.0\u 251 SET KEYTOOL=“%JAVA\u HOME%\bin\KEYTOOL.exe” rem密

这是我第一次使用SSL,我正在尝试在本地机器上创建并使用自签名证书(目前)

我已使用以下批处理文件创建我的证书:

@ECHO关闭
rem keytool文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html
设置JAVA\u HOME=C:\Program Files\JAVA\jre1.8.0\u 251
SET KEYTOOL=“%JAVA\u HOME%\bin\KEYTOOL.exe”
rem密钥库名称,我们将其设置为服务器名称
设置密钥库=127.0.0.1
设置EXPORT\u ALIAS=localhost
设置SAN=127.0.0.1
rem CM=通用名称,OU=组织;O=省;C=国家
SET DNAME=“CN=localhost,OU=Kevin,O=Gelderland,C=NL”
设置CERT\u PUB=localhost.crt
设置通行证=我的通行证
文件将输出到的rem路径:
cd c:\temp\localhost
c:
echo“使用给定别名的相应公钥/私钥创建新密钥库和自签名证书:%EXPORT\u alias%”
%KEYTOOL%-genkeypair-别名%EXPORT\u alias%-keyalg RSA-keystore myKeystore.jks-validity 5000-keysize 2048-dname%dname%-keypass%PASS%-storepass%PASS%-ext san=dns:%san%
echo“读取此别名%EXPORT_alias%的新创建密钥库,并将其存储为myKeystore.jks(在证书文件%CERT_PUB%)中”
%KEYTOOL%-exportcert-rfc-alias%EXPORT\u alias%-keystore myKeystore.jks-文件%CERT\u PUB%-storepass%PASS%
echo“读取新创建的keystore myKeystore.jks(来自证书文件%CERT_PUB%),并将其存储在myTruststore.jks中”
%KEYTOOL%-importcert-file%CERT\u PUB%-alias%EXPORT\u alias%-keystore myTruststore.jks-storepass%PASS%
echo“将keystore myKeystore.jks的副本创建到%keystore%”
%KEYTOOL%-importkeystore-srckeystore myKeystore.jks-destkeystore%KEYSTORE%-deststoretype PKCS12-srcstorepass%PASS%-deststorepass%PASS%
之后,我使用了Oracle的教程,并从下载了这些示例文件作为zip。下面是我在此zip中使用的三个文件,稍作修改以使用我自己的密钥库和密码短语:

SSLSocketClientWithClientAuth.java类:

包客户端;
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.io.OutputStreamWriter;
导入java.io.PrintWriter;
导入java.security.KeyStore;
导入javax.net.ssl.KeyManagerFactory;
导入javax.net.ssl.SSLContext;
导入javax.net.ssl.SSLSocket;
导入javax.net.ssl.SSLSocketFactory;
/*
*此示例显示如何设置密钥管理器来执行客户端操作
*服务器需要时进行身份验证。
*
*此程序假定客户端不在防火墙内。
*可以修改应用程序以连接到外部服务器
*通过遵循SSLSocketClientWithTunneling.java启动防火墙。
*/
公共类SSLSocketClientWithClientAuth{
公共静态void main(最终字符串[]args)引发异常{
字符串host=null;
int端口=-1;
字符串路径=null;
for(最终字符串arg:args){
系统输出打印项次(arg);
}
如果(参数长度<3){
println(“用法:javasslsocketclientwithclientauth”+
“主机端口请求文件路径”);
系统退出(-1);
}
试一试{
host=args[0];
port=Integer.parseInt(args[1]);
path=args[2];
}捕获(最终非法辩论例外e){
println(“用法:javasslsocketclientwithclientauth”+
“主机端口请求文件路径”);
系统退出(-1);
}
试一试{
/*
*为客户端身份验证设置密钥管理器
*如果服务器要求,请使用实现的
*默认的TrustStore和secureRandom例程。
*/
SSLSocketFactory工厂=空;
试一试{
SSLContext ctx;
keymanagerfactorykmf;
密钥库;
final char[]passphrase=“myPass.toCharArray();
ctx=SSLContext.getInstance(“TLS”);
kmf=KeyManagerFactory.getInstance(“SunX509”);
ks=KeyStore.getInstance(“JKS”);
加载(新文件输入流(“C:\\temp\\localhost\\myKeystore.jks”),
密码短语);
kmf.init(ks,密码短语);
init(kmf.getKeyManager(),null,null);
factory=ctx.getSocketFactory();
}捕获(最终异常e){
抛出新IOException(例如getMessage());
}
最终SSLSocket套接字=(SSLSocket)工厂.createSocket(主机,端口);
/*
*发送http请求
*
*有关原因的更多信息,请参阅SSLSocketClient.java
*使用PrintWriter时,这里有一种强制握手。
*/
socket.startHandshake();
最终PrintWriter out=新的PrintWriter(新的BufferedWriter(
新的OutputStreamWriter(socket.getOutputStream());
println(“GET”+path+“HTTP/1.0”);
out.println();
out.flush();
/*
*确保没有意外
*/
if(out.checkError()){
System.out.println(“SSLSocketClient:java.io.PrintWriter错误”);
}
/*读取响应*/
最终BufferedReader in=新的BufferedReader(
新的InputStreamReader(socket.getInputStream());
字符串输入线;
而((inputLine=in.readLine())!=null){
系统输出打印LN(输入线);
}
in.close();
out.close();
socket.close();
}捕获(最终异常e){
e、 printStackTrace();
}
}
}
ClassFileServer.java类:

包服务器;
导入java.io.DataInputStream;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.IOException;
导入java.net.ServerSocket;
导入java.security.KeyStore;
导入javax.net.ServerSocketFactory;
导入javax.net.ssl.KeyManagerFactory;
导入javax.net.ssl.SSLContext;
导入javax.net.ssl.SSLServerSocket;
导入javax.net.ssl.SSLServerSocketFactory;
/*java——一个简单的
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);