使用keytool生成keystore和证书

生成,导入和删除

记录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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章