Openssl CA证书生成以及双向认证,及windows系统证书批量导出,android cer转bks
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相关推荐
- 【ssl认证、证书】SSL双向认证java实战、keytool创建证书
文章目录 概述 keytool示例 参考 相关文章: //-----------Java SSL begin---------------------- [ssl认证.证书]SSL双向认证和SSL单向 ...
- 证书类型、自签CA证书、https双向认证(一篇就懂系列)
#博学谷IT学习技术支持# 文章目录 1.Linux准备环境 2.证书扩展名 3.自签CA证书 3.1 生成根证书 3.2 生成服务端证书 3.3 生成客户端证书 4.开启https,并校验客户端(双 ...
- java代码实现证书生成客户端证书 实现ssl双向认证
目的:实现web项目的ssl双向认证客户端证书代码生成. 使用openssl生成ca证书和服务端证书,当然也可以通过代码实现 1)创建CA私钥,创建目录ca openssl genrsa -out c ...
- c++使用OpenSSL基于socket实现tcp双向认证ssl(使用TSL协议)代码实现
相信各位对OpenSSL库已经不陌生了,目前笔者使用这个库实现了RSA.AES加解密和tcp的双向认证功能,下面来看tcp的双向认证. 1.什么是双向认证 简单说双向认证就是:客户端认证服务端是否合法 ...
- 抓取app服务器证书,APP爬虫-双向认证抓包的两种方法
证书认证分单向认证和双向认证,双向认证是相较于单向认证而言的,单向认证就是只在 APP 侧做证书校验,单向认证有现成的解决方法,比如用各种 bypass ssl 校验的 hook 脚本既可让单向认证失 ...
- windows系统证书导入方法
文章目录[隐藏] 前言 进入证书管理 导入证书 选择证书路径 前言 很久前在安装 VS2015 时,一直报错(vs2015安装包丢失或损坏),最后发现是证书的问题,于是下载了几个版本的证书导入即可. ...
- HTTPS|SSL笔记-SSL双向认证失败(客户端证书信任库不含服务端证书)握手过程(含wireshark分析)
这里我把客户端证书信任库里面清空,及没放服务端证书,Java报错不一样,但抓包是一样的,在此记录下过程. 1. 前3个包是TCP三次握手,在此不解析,对应的包如下: 2. 握手成功后,客户端发送自己支 ...
- pythonrequests证书_requests的ssl证书验证、身份认证、cert文件证书
SSL证书:Requests 可以为 HTTPS 请求验证 SSL 证书,就像 web 浏览器一样.SSL 验证默认是开启的,如果证书验证失败,Requests 会抛出 SSLError.在该域名re ...
- php生成word的类,在Windows系统下使用PHP生成Word文档的教程
准备工作 首先,请确保在你的Windows系统中已经安装并配置好了一个典型的WAMP环境.由于Interop纯粹是一个Windows的特性,我们将在Windows平台下搭建Apache和PHP.在这个 ...
- 用pfx证书java双向认证_把CA证书生成的crt的证书和pem的私钥转换成java能够使用的keystore和pcks12的证书,实现https双向认证...
最近在做一个https双向认证的工作,领导先让我实现,我之前写了一篇文章,把tomcat的生成证书和配置的实现写了出来. 现在领导给了我服务器的CA证书的客户端证书和私钥,服务端信任证书,分别是crt ...
最新文章
- PHP哈希表碰撞攻击原理
- webpack 项目使用--创建webpack 项目(1)
- activemq主从配置_使用ActiveMQ –具有故障转移协议的“主/从”配置
- 求数的绝对值一定是正数_人教版初中数学七年级上册绝对值公开课优质课课件教案视频...
- Sublime Text2 中文乱码
- 10个最新优秀手机应用界面设计实例
- (原文)基于甘特图的深度强化学习方法求解端到端在线重调度
- centOS下python用ffmpeg将MP3转换成WAV
- linux无法连接共享文件夹,linux下samba服务器共享文件windows无法访问
- DVD驱动器打开拒绝访问
- Google mediapipe 人脸识别应用
- 如何彻底卸载云上PDF?一个非常简单的教程
- Linux查看mac地址
- c/c++算法之“24点”经典问题
- CometOJ国庆欢乐赛 C两排房子 二分 D1 二分贪心 E贪心特判
- Spring MVC中redirect重定向3种方式(带参数)
- 【MySQL】MySQL用 limit 为什么会影响性能?
- 如何通过三视图判断立方体个数_中考难点,由三视图确定小立方体个数的问题求解有策略...
- java dataframe agg_Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
- 2020Android面经,历时一个半月,斩获3个大厂offer
热门文章
- tortoise git revert的坑
- 2.2析取范式与合取范式
- 苹果唯冠商标战对iPad3的影响:iPad3太TM贵,肾都不够卖了!
- AutoPatch java_AutoPatch 成功, 加载逻辑修复成功, 但 patch.jar 反编译异常
- Stata+PSM:倾向得分匹配分析简介
- 2021-06-01-HPC-performance-test
- 在上海、苏州、深圳、长沙从“蜗居”到“安家”,8090后要付出多少?
- Cadence快捷键设置
- Android常用逆向工具+单机游戏破解
- java面试时怎么做自我介绍_面试时如何做好自我介绍