[关闭]
@yulongsun 2017-09-05T03:17:14.000000Z 字数 3845 阅读 942

Https自定义签名

未分类


理论基础

SSL:Secure Sockets Layer
1、keyStore类型

jks:
pkcs12:
jceks:

2、SSL协议类型:

SSL
SSLv2
SSLv3
TLS
TLSv1
TLSv1.1
TLSv1.2

3、X.509是什么?

数字证书.
X.509证书
基本结构:
版本号
序列号
签名
颁发者
有效期
主体:(非空)
主体公钥信息
颁发者唯一标识
主体唯一标识
扩展结构:
...
详解参照:http://www.cnblogs.com/chnking/archive/2007/08/28/872104.html

实践

1、生成client私钥

  1. keytool -genkey -alias sylclient -keypass sylclientkeypwd -keyalg RSA -keysize 1024 -validity 3650 -keystore D:/sylclient.keystore -storepass sylclientstorepwd

2、根据client私钥,导出client证书

  1. keytool -export -alias sylclient -keystore D:/sylclient.keystore -storetype JKS -keypass sylclientcerpwd -file D:/sylclient.cer

3、生成server私钥

  1. keytool -genkey -alias sylserver -keypass sylserverkeypwd -keyalg RSA -keysize 1024 -validity 3650 -keystore D:/sylserver.keystore -storepass sylserverstorepwd

4、根据server私钥,生成server证书

  1. keytool -export -alias sylserver -keystore D:/sylserver.keystore -storetype JKS -keypass sylservercerpwd -file D:/sylserver.cer

5、创建client的truststore,并把server的cer导入.

  1. keytool -import -alias sylserver -keystore D:/sylclienttrust.keystore -storepass sylclienttrustpwd -file D:/sylserver.cer

6、创建server的truststore,并把client的cer导入.

  1. keytool -import -alias sylclient -keystore D:/sylservertrust.keystore -storepass sylservertrustpwd -file D:/sylclient.cer


代码

1. Server端代码

  1. public class SSLServer {
  2. private static final int PORT = 8888;
  3. public static void main(String[] args) throws Exception {
  4. // System.setProperty("sun.net.httpserver.maxReqTime", "1");
  5. // System.setProperty("sun.net.httpserver.maxRspTime", "1");
  6. //1.
  7. // 加载私钥keyStore
  8. KeyStore keyStore = KeyStore.getInstance("JKS");
  9. keyStore.load(new FileInputStream(Config.Server.privateKeystorePath), Config.Server.privateKeystorePwd.toCharArray());
  10. // 秘钥初始化
  11. KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
  12. keyManagerFactory.init(keyStore, Config.Server.privateKeyPwd.toCharArray());
  13. //2.
  14. // 加载证书keystore
  15. keyStore = KeyStore.getInstance("JKS");
  16. keyStore.load(new FileInputStream(Config.Server.cerPath), Config.Server.cerPwd.toCharArray());
  17. // 证书初始化
  18. TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
  19. trustManagerFactory.init(keyStore); //
  20. //3.
  21. // SSLContext初始化
  22. SSLContext sslContext = SSLContext.getInstance("TLS");
  23. sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());//秘钥管理器 证书管理器
  24. //
  25. HttpsConfigurator conf = new HttpsConfigurator(sslContext) {
  26. @Override
  27. public void configure(HttpsParameters httpsParameters) {
  28. // super.configure(httpsParameters);
  29. SSLParameters defaultSSLParameters = this.getSSLContext().getDefaultSSLParameters();
  30. //设置认证client要求
  31. defaultSSLParameters.setNeedClientAuth(false);
  32. //
  33. httpsParameters.setSSLParameters(defaultSSLParameters);
  34. }
  35. };
  36. //
  37. HttpServerProvider serverProvider = HttpServerProvider.provider();
  38. HttpsServer httpServer = serverProvider.createHttpsServer(new InetSocketAddress(PORT), 20);//todo
  39. httpServer.setHttpsConfigurator(conf);
  40. httpServer.createContext("/test", new HttpServerHandler());
  41. httpServer.setExecutor(null);
  42. httpServer.start();
  43. System.out.println("server start");
  44. }
  45. static class HttpServerHandler implements HttpHandler {
  46. public void handle(HttpExchange httpExchange) throws IOException {
  47. InputStream requestBody = httpExchange.getRequestBody();
  48. BufferedReader reader = new BufferedReader(new InputStreamReader(requestBody));
  49. String line = "";
  50. StringBuffer buffer = new StringBuffer();
  51. while ((line = reader.readLine()) != null) {
  52. buffer.append(line);
  53. }
  54. String reqStr = buffer.toString();
  55. System.out.println("Received Client :" + reqStr);
  56. requestBody.close();
  57. //
  58. byte[] respByte = "Server has Received".getBytes();
  59. httpExchange.sendResponseHeaders(HttpsURLConnection.HTTP_OK, respByte.length);
  60. OutputStream responseBody = httpExchange.getResponseBody();
  61. responseBody.write(respByte);
  62. responseBody.flush();
  63. responseBody.close();
  64. }
  65. }
  66. }

问题:

1、OpenSSL和HTTPS的关系?

HTTPS和OpenSSL的关系就是:iphone和富士康的关系。
- 概念:
1. HTTPS是开源协议=HTTP+TLS(由于历史原因,SSL3.0之后就被TLS1.0替代了)
2. OpenSSL是一个开源工具集,主要两个特性:
① 实现了SSL2,SSL3,TLSv1,TLSv1.1,TLSv1.2协议。
② 实现了目前常用的加密算法。

2、私钥和证书的关系?
3、

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注