Openssl CA证书生成以及双向认证,及windows系统证书批量导出,android cer转bks

http://blog.csdn.net/HeroRazor/article/details/51496812

Openssl CA证书生成以及双向认证

首先本文主要参照这篇文章写的 
http://h2appy.blog.51cto.com/609721/1181234

只是途中有些问题折腾了一下,比如openssl.cnf如何来的,这个文件在编译完openssl后,应该openssl根目录下/apps/demoCA有个,可以把他拷贝到openssl.exe同一级目录 
里面有些目录配置,自己可以修改下,但是我没有修改,所以最后生成的文件路径必须按openssl.cnf里面来,至于如何编译openssl 请参考我的另一篇文章

开始生成证书,需要提前做一些准备,生成一些特定目录,这些目录和openssl.cnf里面配置要求一致,在demoCA目录下,还需要建立一个index.txt,index.txt.attr空文件,以及serial文件,serial文件里面写00 
注意每次输入下一步命令前,如果index.txt serial文件内容发生改变,请把index.txt中的内容清空,serial重置为00,否则后续命令中会报错(比如报数据库更新错误,此时依然会产生证书,但是c++代码加载证书时却会报错)

打开openssl.cnf文件,可以看到其中的一些目录结构要求 
 
 

serial文件内容图 

cmd进入openssl.exe所在目录下,依次输入以下命令(证书名字可以自己调整,输入过程中需要输入一些信息,如国家,省,市,主机名,邮件,密码等,请尽量保持一致) 例如我的主机名就写127.0.0.1 可以检验证书域名,代码在客户端给出

产生CA自签名证书 
openssl.exe genrsa -out private\ca.key -rand private.rnd -des 2048 
openssl.exe req -new -x509 -days 3650 -key private\ca.key -out private\ca.crt -config openssl.cnf 
openssl.exe x509 -in private\ca.crt -noout -text

产生server的证书过程 
openssl.exe genrsa -out private\server.key 1024 
openssl.exe req -new -key private\server.key -out newcerts\server.csr -config openssl.cnf 
openssl.exe ca -in newcerts\server.csr -cert private\ca.crt -keyfile private\ca.key 
-config openssl.cnf -policy policy_anything -out certs\server.crt 
openssl.exe x509 -in certs\server.crt -noout -text

产生proxy的证书过程 
openssl.exe genrsa -out private\proxy.key 1024 
openssl.exe req -new -key private\proxy.key -out newcerts\proxy.csr -config openssl.cnf 
openssl.exe ca -in newcerts\proxy.csr -cert private\ca.crt -keyfile private\ca.key -config openssl.cnf -policy policy_anything -out certs\proxy.crt 
openssl.exe x509 -in certs\proxy.crt -noout -text

产生client的证书过程 
openssl.exe genrsa -out private\client.key 1024 
openssl.exe req -new -key private\client.key -out newcerts\client.csr -config openssl.cnf 
openssl.exe ca -in newcerts\client.csr -cert private\ca.crt -keyfile private\ca.key -config openssl.cnf -policy policy_anything -out certs\client.crt 
openssl.exe x509 -in certs\client.crt -noout -text

整个过程结束后 
 
 

ca.crt为自签名证书; 
server.crt,server.key为服务器端的证书和私钥文件; 
proxy.crt,proxy.key为代理服务器端的证书和私钥文件; 
client.crt,client.key为客户端的证书和私钥文件。

代码块

服务端测试代码,我做了点修改

//server
#include <winsock2.h>
#include <conio.h>
#include <stdio.h>
#include <winsock.h>
#include "openssl/x509.h"
#include "openssl/ssl.h"
#include "openssl/err.h" #define MSGLENGTH      1024
#define PORT           8443
#define CACERT         "ca.crt"
#define SVRCERTF       "server.crt"
#define SVRKEYF        "server.key" int main()
{  WSADATA wsaData;  WSAStartup(MAKEWORD(2,2), &wsaData);  SOCKET sock;  SSL_METHOD *meth;  SSL_CTX* ctx;  SSL* ssl;  //SSL初始化  OpenSSL_add_ssl_algorithms();  //SSL错误信息初始化  SSL_load_error_strings(); //创建本次会话所使用的协议  meth = TLSv1_server_method();  //申请SSL会话的环境  ctx = SSL_CTX_new(meth);  if (NULL == ctx)  exit(1); //设置会话的握手方式并加载CA证书  SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);SSL_CTX_load_verify_locations(ctx, "D:\\usr\\local\\ssl\\bin\\private\\ca.crt", NULL);//加载服务器端的证书  if (0 == SSL_CTX_use_certificate_file(ctx, "D:\\usr\\local\\ssl\\bin\\certs\\server.crt", SSL_FILETYPE_PEM)) {ERR_print_errors_fp(stderr);exit(1);}//加载服务器端的私钥  if (0 == SSL_CTX_use_PrivateKey_file(ctx, "D:\\usr\\local\\ssl\\bin\\private\\server.key", SSL_FILETYPE_PEM)){ERR_print_errors_fp(stderr);exit(1);}//检查服务器端的证书和私钥是否匹配  if (!SSL_CTX_check_private_key(ctx)) {printf("Private key does not match the certificate public key\n");exit(1);}//加密方式  SSL_CTX_set_cipher_list(ctx, "RC4-MD5");  //处理握手多次  SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY); /*以下是正常的TCP socket建立过程 .............................. */  printf("Begin tcp socket...\n");  sock = socket(AF_INET, SOCK_STREAM, 0);  if (sock == INVALID_SOCKET) {  printf("SOCKET有问题. \n");  return 0;  } sockaddr_in addr;  memset(&addr, '\0', sizeof(addr));  addr.sin_family = AF_INET;  addr.sin_port = htons(PORT); /* Server Port number */  addr.sin_addr.s_addr = INADDR_ANY; //绑定sock  int nResult = bind(sock, (sockaddr *)&addr, sizeof(addr));  if (nResult == SOCKET_ERROR) {  printf("绑定SOCKET有问题. \n");  return 0;  }  printf("服务器启动成功,端口:%d\n正在等待连接\n", PORT); /*接受TCP链接*/  sockaddr_in sa_cli;  int err = listen(sock, 5);  if (-1 == err)  exit(1);  int client_len = sizeof(sa_cli);  int ss = accept(sock, (struct sockaddr *) &sa_cli, &client_len);  if (ss == -1) {  exit(1);  }  closesocket(sock);  printf("Connection from %d, port %d\n", sa_cli.sin_addr.s_addr, sa_cli.sin_port); /* TCP 链接已建立.开始 SSL 握手过程.......................... */  //绑定套接字  ssl = SSL_new(ctx);  if (NULL == ssl)  exit(1);  if (0 == SSL_set_fd(ssl, ss)) {  printf("Attach to Line fail!\n");  exit(1);  }  //SSL握手  //SSL_accept(ssl);  int k = SSL_accept(ssl);  if (0 == k) {  printf("%d\n", k);  printf("SSL connect fail!\n");  exit(1);  }  //进行信息验证  X509 *client_cert;  client_cert = SSL_get_peer_certificate(ssl); printf("发现客户端尝试连接\n");  if (client_cert != NULL) {  printf ("Client certificate:\n"); int rv = SSL_get_verify_result(ssl);if (rv != X509_V_OK){printf("认证出错!\n");exit(1);}//读取证书subject名并显示  char *str = X509_NAME_oneline(X509_get_subject_name(client_cert), 0, 0);  if (NULL == str) {  printf("认证出错!\n");  exit(1);  }  printf("subject: %s\n", str);  //读取证书的issuer名并显示  str = X509_NAME_oneline(X509_get_issuer_name(client_cert), 0, 0);  if (NULL == str) {  printf("证书名为空\n");  exit(1);  }  printf("issuer: %s\n", str);  printf("连接成功\n"); X509_free (client_cert);/*如不再需要,需将证书释放 */  OPENSSL_free(str);  }  else {  printf("找不到客户端的认证证书\n");  exit(1);  } char buf[MSGLENGTH];  SSL_write(ssl, "Server is connect to you!\n", strlen("Server is connect to you!\n"));  printf("Listen to the client: \n");  while (1) {  err = SSL_read(ssl, buf, sizeof(buf));  if(err == -1)break;buf[err] = '\0';  printf("%s\n", buf);  } //关闭套接字  SSL_shutdown(ssl);  SSL_free(ssl);  SSL_CTX_free(ctx);  WSACleanup();  getch();  return 0;
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170

客户端测试代码,我做了点修改

//client
#include <winsock2.h>
#include <conio.h>
#include <stdio.h>
#include "openssl/x509.h"
#include "openssl/ssl.h"
#include "openssl/err.h"
#include "openssl/rand.h" #define PORT       8443
#define SERVER     "127.0.0.1"
#define CACERT     "D:\\usr\\local\\ssl\\bin\\private\\ca.crt"
#define MYCERTF    "D:\\usr\\local\\ssl\\bin\\certs\\client.crt"
#define MYKEYF     "D:\\usr\\local\\ssl\\bin\\private\\client.key"
#define MSGLENGTH  1024 int GetSrvCert(SSL * ssl, X509 ** pCert)
{int rv = -1;if (ssl == NULL){return rv;}rv = SSL_get_verify_result(ssl);*pCert = SSL_get_peer_certificate(ssl);return rv;
}//验证证书的合法性
int VerifyCert(X509 * pCert, const char * hostname)
{char commonName[512] = { 0 };X509_name_st * name = NULL;if (pCert == NULL || hostname == NULL){return -1;}//获取commonNamename = X509_get_subject_name(pCert);X509_NAME_get_text_by_NID(name, NID_commonName, commonName, 512);fprintf(stderr, "VerifyCert - Common Name on certificate: %s\n", commonName);if (strcmp(commonName, hostname) == 0){printf("证书主机名%s\n", commonName);return 1;}else{return 0;}
}int main()
{  WSADATA wsadata;WSAStartup(MAKEWORD(2, 2), &wsadata);sockaddr_in sin;int seed_int[100]; /*存放随机序列*/SSL*ssl;const SSL_METHOD *meth;SSL_CTX *ctx;//SSL初始化  OpenSSL_add_ssl_algorithms();//SSL错误信息初始化  SSL_load_error_strings();//创建本次会话所使用的协议  meth = TLSv1_client_method();//申请SSL会话的环境  ctx = SSL_CTX_new(meth);if (NULL == ctx)exit(1);SSL_CTX_set_default_passwd_cb(ctx, pem_password_cb1);//SSL_CTX_set_default_passwd_cb_userdata(ctx, (void*)"555555");//设置会话的握手方式并加载CA证书  SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);SSL_CTX_load_verify_locations(ctx, CACERT, NULL);//加载自己的证书  if (0 == SSL_CTX_use_certificate_file(ctx, MYCERTF, SSL_FILETYPE_PEM)) {ERR_print_errors_fp(stderr);exit(1);}//加载自己的私钥  if (0 == SSL_CTX_use_PrivateKey_file(ctx, MYKEYF, SSL_FILETYPE_PEM)) {ERR_print_errors_fp(stderr);exit(1);}//检查自己的证书和私钥是否匹配  if (!SSL_CTX_check_private_key(ctx)) {printf("Private key does not match the certificate public key\n");exit(1);}/*构建随机数生成机制,WIN32平台必需*/srand((unsigned)time(NULL));for (int i = 0; i < 100; i++)seed_int[i] = rand();RAND_seed(seed_int, sizeof(seed_int));//加密方式  SSL_CTX_set_cipher_list(ctx, "RC4-MD5");//处理握手多次  SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);/*以下是正常的TCP socket建立过程 .............................. */SOCKET sock;printf("Begin tcp socket...\n");sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == INVALID_SOCKET) {printf("SOCKET有问题. \n");}memset(&sin, '\0', sizeof(sin));sin.sin_family = AF_INET;sin.sin_addr.s_addr = inet_addr(SERVER); /* Server IP */sin.sin_port = htons(PORT); /* Server Port number */int icnn = connect(sock, (sockaddr *)&sin, sizeof(sin));if (icnn == SOCKET_ERROR) {printf("连不上服务器\n", GetLastError());exit(1);}/* TCP 链接已建立.开始 SSL 握手过程.......................... *///绑定套接字  ssl = SSL_new(ctx);if (NULL == ssl)exit(1);if (0 >= SSL_set_fd(ssl, sock)) {printf("Attach to Line fail!\n");exit(1);}//SSL握手  //SSL_connect(ssl);  int k = SSL_connect(ssl);if (0 == k) {printf("%d\n", k);printf("SSL connect fail!\n");exit(1);}printf("连接服务器成功\n");fprintf(stderr, "Retrieving peer certificate\n");//获取服务器证书X509* pCert = NULL;if (GetSrvCert(ssl, &pCert) != X509_V_OK){if (SSL_get_verify_result(ssl) != X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY){fprintf(stderr, "Certificate verification error: %i\n", SSL_get_verify_result(ssl));            SSL_CTX_free(ctx);return 0;}else{fprintf(stderr, "X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY\n");}}//校验服务器证书fprintf(stderr, "Validating peer certificate\n");if (!VerifyCert(pCert, "127.0.0.1")){fprintf(stderr, "Hostname and Common Name do not match\n");SSL_CTX_free(ctx);return 0;}char sendmsg[MSGLENGTH] = "\0";char revmsg[MSGLENGTH] = "\0";int err = SSL_read(ssl, revmsg, sizeof(revmsg));revmsg[err] = '\0';printf("%s\n", revmsg);while (1) {printf("请输入所要发送的数据:\n");scanf("%s", sendmsg);SSL_write(ssl, sendmsg, strlen(sendmsg));printf("发送消息“ %s ”成功!\n", sendmsg);}//关闭套接字  SSL_shutdown(ssl);SSL_free(ssl);SSL_CTX_free(ctx);closesocket(sock);WSACleanup();   return 0;
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202

系统内置证书问题

现在有个问题,当访问百度,支付宝,银联的时候,浏览器是内置证书,怎么获取批量获取这些证书呢? 
在cmd中输入certmgr.msc 
 
选择受信任的根证书颁发机构,全选,点邮件,所有任务,导出 
 
输入密码 

就生成一个pfx文件,现在只要用openssl转成cer文件就可以了,命令 
openssl pkcs12 -nodes -nokeys -in 11.pfx -out 1.cer -passin pass:123456 
在程序中使用SSL_CTX_load_verify_locations 预先加载这个1.cer文件就可以了

Android BKS证书

Android加载bks格式证书,Ios/Pc加载cer格式证书,一般而言,生成cer格式比较常见,因此需要进行cer转bks操作,操作步骤如下:

首先要下载特定版本的JCE Provider包 
http://www.bouncycastle.org/download/bcprov-jdk15on-146.jar 
或者 
http://pan.baidu.com/s/1c1ur13y

转换命令说明: 
keytool -importcert -v -trustcacerts -alias 位置1 \ 
-file 位置2 \ 
-keystore 位置3 -storetype BKS \ 
-providerclass org.bouncycastle.jce.provider.BouncyCastleProvider \ 
-providerpath 位置4 -storepass 位置5

位置1:是个随便取的别名 
位置2:cer或crt证书的全地址 
位置3:生成后bks文件的位置,建议写全地址 
位置4:上面下载JCE Provider包的位置 
位置5:生成后证书的密码

转换完整示例 
keytool -importcert -v -trustcacerts -alias my12306 -file C:\Users\Administrator\Desktop\证书\srca.cer -keystore C:\Users\Administrator\Desktop\证书\srca.bks -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath C:\Users\Administrator\Desktop\证书\bcprov-jdk15on-146.jar -storepass 123456

其他参考文献 
http://stackoverflow.com/questions/2256950/openssl-ignore-self-signed-certificate-error 
http://www.ibm.com/developerworks/cn/linux/l-openssl.html 
http://www.zhihu.com/question/25847151 
http://blog.csdn.net/jun55xiu/article/details/8980812 
http://blog.sina.com.cn/s/blog_4c451e0e010143v3.html 
http://blog.csdn.net/jinhill/article/details/6960874 
http://blog.csdn.net/xiexievv/article/details/44494599 
http://h2appy.blog.51cto.com/609721/1181234 
http://blog.chinaunix.net/uid-12707183-id-2919172.html 
https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_load_verify_locations.html 只能是pem 
http://www.360doc.com/content/14/1210/17/18924983_431836560.shtml 
http://blog.csdn.net/yi_zz32/article/details/50097325 
http://blog.csdn.net/jinhill/article/details/6960874 
http://kyfxbl.iteye.com/blog/1910891 
http://zctya.blog.163.com/blog/static/1209178201251310292958/ 
http://www.cnblogs.com/dvking/archive/2010/01/09/2368719.html 
http://zctya.blog.163.com/blog/static/1209178201251310292958/ 
http://h2appy.blog.51cto.com/609721/1181234 
http://www.oschina.net/question/565065_81274

Openssl CA证书生成以及双向认证,及windows系统证书批量导出,android cer转bks相关推荐

  1. 【ssl认证、证书】SSL双向认证java实战、keytool创建证书

    文章目录 概述 keytool示例 参考 相关文章: //-----------Java SSL begin---------------------- [ssl认证.证书]SSL双向认证和SSL单向 ...

  2. 证书类型、自签CA证书、https双向认证(一篇就懂系列)

    #博学谷IT学习技术支持# 文章目录 1.Linux准备环境 2.证书扩展名 3.自签CA证书 3.1 生成根证书 3.2 生成服务端证书 3.3 生成客户端证书 4.开启https,并校验客户端(双 ...

  3. java代码实现证书生成客户端证书 实现ssl双向认证

    目的:实现web项目的ssl双向认证客户端证书代码生成. 使用openssl生成ca证书和服务端证书,当然也可以通过代码实现 1)创建CA私钥,创建目录ca openssl genrsa -out c ...

  4. c++使用OpenSSL基于socket实现tcp双向认证ssl(使用TSL协议)代码实现

    相信各位对OpenSSL库已经不陌生了,目前笔者使用这个库实现了RSA.AES加解密和tcp的双向认证功能,下面来看tcp的双向认证. 1.什么是双向认证 简单说双向认证就是:客户端认证服务端是否合法 ...

  5. 抓取app服务器证书,APP爬虫-双向认证抓包的两种方法

    证书认证分单向认证和双向认证,双向认证是相较于单向认证而言的,单向认证就是只在 APP 侧做证书校验,单向认证有现成的解决方法,比如用各种 bypass ssl 校验的 hook 脚本既可让单向认证失 ...

  6. windows系统证书导入方法

    文章目录[隐藏] 前言 进入证书管理 导入证书 选择证书路径 前言 很久前在安装 VS2015 时,一直报错(vs2015安装包丢失或损坏),最后发现是证书的问题,于是下载了几个版本的证书导入即可. ...

  7. HTTPS|SSL笔记-SSL双向认证失败(客户端证书信任库不含服务端证书)握手过程(含wireshark分析)

    这里我把客户端证书信任库里面清空,及没放服务端证书,Java报错不一样,但抓包是一样的,在此记录下过程. 1. 前3个包是TCP三次握手,在此不解析,对应的包如下: 2. 握手成功后,客户端发送自己支 ...

  8. pythonrequests证书_requests的ssl证书验证、身份认证、cert文件证书

    SSL证书:Requests 可以为 HTTPS 请求验证 SSL 证书,就像 web 浏览器一样.SSL 验证默认是开启的,如果证书验证失败,Requests 会抛出 SSLError.在该域名re ...

  9. php生成word的类,在Windows系统下使用PHP生成Word文档的教程

    准备工作 首先,请确保在你的Windows系统中已经安装并配置好了一个典型的WAMP环境.由于Interop纯粹是一个Windows的特性,我们将在Windows平台下搭建Apache和PHP.在这个 ...

  10. 用pfx证书java双向认证_把CA证书生成的crt的证书和pem的私钥转换成java能够使用的keystore和pcks12的证书,实现https双向认证...

    最近在做一个https双向认证的工作,领导先让我实现,我之前写了一篇文章,把tomcat的生成证书和配置的实现写了出来. 现在领导给了我服务器的CA证书的客户端证书和私钥,服务端信任证书,分别是crt ...

最新文章

  1. PHP哈希表碰撞攻击原理
  2. webpack 项目使用--创建webpack 项目(1)
  3. activemq主从配置_使用ActiveMQ –具有故障转移协议的“主/从”配置
  4. 求数的绝对值一定是正数_人教版初中数学七年级上册绝对值公开课优质课课件教案视频...
  5. Sublime Text2 中文乱码
  6. 10个最新优秀手机应用界面设计实例
  7. (原文)基于甘特图的深度强化学习方法求解端到端在线重调度
  8. centOS下python用ffmpeg将MP3转换成WAV
  9. linux无法连接共享文件夹,linux下samba服务器共享文件windows无法访问
  10. DVD驱动器打开拒绝访问
  11. Google mediapipe 人脸识别应用
  12. 如何彻底卸载云上PDF?一个非常简单的教程
  13. Linux查看mac地址
  14. c/c++算法之“24点”经典问题
  15. CometOJ国庆欢乐赛 C两排房子 二分 D1 二分贪心 E贪心特判
  16. Spring MVC中redirect重定向3种方式(带参数)
  17. 【MySQL】MySQL用 limit 为什么会影响性能?
  18. 如何通过三视图判断立方体个数_中考难点,由三视图确定小立方体个数的问题求解有策略...
  19. java dataframe agg_Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
  20. 2020Android面经,历时一个半月,斩获3个大厂offer

热门文章

  1. tortoise git revert的坑
  2. 2.2析取范式与合取范式
  3. 苹果唯冠商标战对iPad3的影响:iPad3太TM贵,肾都不够卖了!
  4. AutoPatch java_AutoPatch 成功, 加载逻辑修复成功, 但 patch.jar 反编译异常
  5. Stata+PSM:倾向得分匹配分析简介
  6. 2021-06-01-HPC-performance-test
  7. 在上海、苏州、深圳、长沙从“蜗居”到“安家”,8090后要付出多少?
  8. Cadence快捷键设置
  9. Android常用逆向工具+单机游戏破解
  10. java面试时怎么做自我介绍_面试时如何做好自我介绍