生成,导入和删除
记录windows下生成和测试的过程:
1.生成config.keystore
>keytool -genkeypair -keyalg RSA -keysize 1024 -sigalg MD5withRSA -alias localhost -keystore D:/config.keystore -storepass 123456
您的名字与姓氏是什么?
[Unknown]: localhost
您的组织单位名称是什么?
[Unknown]: localhost
您的组织名称是什么?
[Unknown]: localhost
您所在的城市或区域名称是什么?
[Unknown]: localhost
您所在的省/市/自治区名称是什么?
[Unknown]: localhost
该单位的双字母国家/地区代码是什么?
[Unknown]: localhost
CN=localhost, OU=localhost, O=localhost, L=localhost, ST=localhost, C=localhost是否正确?
[否]: y
输入 <localhost> 的密钥口令
(如果和密钥库口令相同, 按回车):
声明那个名字与姓氏需要注意以下,我在本地测试时setHost填的是localhost如果名字不一样,会报错说不匹配什么的。
该问题解决的博客:https://blog.csdn.net/diyagea/article/details/50639911
2.生成证书
>keytool -exportcert -alias localhost -keystore D:/config.keystore -file D:/config.cer -rfc
输入密钥库口令:
存储在文件 <D:/config.cer> 中的证书
这里的口令就是上面的:123456
3.接下来就要以管理员的身份运行cmd,否则会报拒绝访问的错误。这步的目的是将证书导入jdk的信任库中,以便发起请求的一方可以对https地址发起请求。
>keytool -import -noprompt -trustcacerts -keystore "C:/Program Files/Java/jdk1.6.0_45/jre/lib/security/cacerts" -file "D:/config.cer" -alias localhost
输入密钥库口令:
证书已添加到密钥库中
这里需要注意的是路径中有空格存在的话用双引号括起来。还有就是密钥库的口令不是123456,若输入这个会报密码错误之类的。这里的口令应该填:changeit。
该方案的博客:https://blog.csdn.net/zhuzhiqiang_zhu/article/details/70212499
3.如果导入错误,可以根据别名进行删除。
>keytool -delete -alias test -keystore "C:/Program Files/Java/jdk1.6.0_45/jre/lib/security/cacerts"
输入密钥库口令:
别名就是test。
测试
jetty
package com.xck.Server;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
public class HttpOrHttpsServer extends AbstractHandler {
private SelectChannelConnector httpConn = null;
private SslSelectChannelConnector httpsConn = null;
private Server server = null;
public static void main(String[] args){
HttpOrHttpsServer server = new HttpOrHttpsServer();
server.doInit();
server.doStart();
}
public void doInit(){
try {
httpConn = new SelectChannelConnector();
httpConn.setHost("localhost");
httpConn.setPort(8092);
httpsConn = new SslSelectChannelConnector();
httpsConn.setHost("localhost");
httpsConn.setPort(8091);
httpsConn.setPassword("123456");
httpsConn.setKeyPassword("123456");
httpsConn.setTrustPassword("123456");
httpsConn.setKeystore("D:\\config.keystore"); //keystore地址
server = new Server();
server.setConnectors(new Connector[]{httpConn, httpsConn});
} catch (Exception e) {
e.printStackTrace();
}
}
public void doStart(){
try {
server.setHandler(this);
server.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public void handle(String s, Request request, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws IOException, ServletException {
InputStream is = request.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sb = new StringBuffer("");
String str = null;
while((str = br.readLine())!=null){
sb.append(str);
}
System.out.println(sb.toString());
httpServletResponse.setContentType("text/plain;charset=utf-8");
httpServletResponse.setStatus(HttpServletResponse.SC_OK);
httpServletResponse.getWriter().print("ok");
//通知jetty,这个请求以及处理完毕,如果不设置这个,会报下面的错误
// Exception in thread "main" java.io.FileNotFoundException: https://localhost:8091
// at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1457)
// at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
// at com.xck.HttpRequest.main(HttpRequest.java:37)
request.setHandled(true);
}
}
请求。因为使用的是jdk1.6,所以这里使用HttpURLConnection。这里需要注意一点,发送数据只会在调用httpURLConnection.getInputStream()之后进行,否则不会发送数据。
package com.xck;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpRequest {
public static void main(String[] args) throws Exception{
URL url = new URL("https://localhost:8091");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Content-type", "text/plain");
// 设置文件字符集:
httpURLConnection.setRequestProperty("Charset", "UTF-8");
httpURLConnection.setInstanceFollowRedirects(false);
httpURLConnection.setConnectTimeout(10000);
httpURLConnection.setReadTimeout(10000);
httpURLConnection.setUseCaches(false);
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
httpURLConnection.connect();
OutputStream os = httpURLConnection.getOutputStream();
String str = "hello";
os.write(str.getBytes());
os.flush();
os.close();
InputStream is = httpURLConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
String line = "";
StringBuffer sb = new StringBuffer("");
while((line = br.readLine()) != null){
sb.append(line);
}
System.out.println(sb.toString());
}
}
pom.xml需要引入
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>8.1.17.v20150415</version>
</dependency>