sudo apt update
sudo apt install -y build-essential
下载
wget https://www.openssl.org/source/openssl-3.3.0.tar.gz
解压
tar -zxvf openssl-3.3.0.tar.gz
cd openssl-3.3.0
OUT=/home/ubuntu22/ssl/openssl-3.3.0/output
./config --prefix=$OUT/openssl33 \
--openssldir=$OUT/openssl33/etc \
-Wl,-rpath=$OUT/openssl33/lib64
make -j$(nproc)
make install
////////////////////demo1
openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes
openssl s_server -accept 4433 -tls1_2 -cert server.crt -key server.key -www
curl -v --insecure https://localhost:4433
////////////////////demo2
curl -v --insecure https://localhost:4433
/////////////////// openssl1.2 demo
openssl s_client -connect www.baidu.com:443 -tls1_2 -servername www.baidu.com -quiet // 打印私钥
////////////
OUT=/home/ubuntu22/ssl/openssl-3.3.0/output
./config --prefix=$OUT/openssl33 \
--openssldir=$OUT/openssl33/etc \
-Wl,-rpath=$OUT/openssl33/lib64 \
-g -O0
make -j4
make install
//////////////////////////
gdb --args output/openssl33/bin/openssl s_client -connect www.baidu.com:443 -tls1_2 -servername www.baidu.com -quiet
b main
r
//////////////////////////
ssl/statem/statem_clnt.c
static int tls_construct_cke_ecdhe(SSL_CONNECTION *s, WPACKET *pkt)
{
unsigned char *encodedPoint = NULL;
size_t encoded_pt_len = 0;
EVP_PKEY *ckey = NULL, *skey = NULL;
int ret = 0;
skey = s->s3.peer_tmp;
if (skey == NULL) {
SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
return 0;
}
ckey = ssl_generate_pkey(s, skey);
if (ckey == NULL) {
SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_SSL_LIB);
goto err;
}
//====================== 打印 P-256 私钥 ======================
{
BIGNUM *priv_bn = NULL;
unsigned char priv_bytes[32] = {0};
EVP_PKEY_get_bn_param(ckey, OSSL_PKEY_PARAM_PRIV_KEY, &priv_bn);
if (priv_bn != NULL) {
BN_bn2binpad(priv_bn, priv_bytes, 32);
printf("\n[+] TLS 1.2 CLIENT P-256 PRIVATE KEY = ");
for (int i = 0; i < 32; i++)
printf("%02x", priv_bytes[i]);
printf("\n");
BN_free(priv_bn);
}
}
//===========================================================
// ====================== 打印 客户端 P-256 公钥(发送给server) ======================
encoded_pt_len = EVP_PKEY_get1_encoded_public_key(ckey, &encodedPoint);
if (encoded_pt_len > 0 && encodedPoint != NULL) {
printf("[+] TLS 1.2 CLIENT P-256 PUBLIC KEY (send to server) = ");
for (int i = 0; i < encoded_pt_len; i++)
printf("%02x", encodedPoint[i]);
printf("\n");
}
// ==================================================================================
ssl/statem/statem_clnt.c
//publick key
static int tls_process_ske_ecdhe(SSL_CONNECTION *s, PACKET *pkt, EVP_PKEY **pkey)
{
if (EVP_PKEY_set1_encoded_public_key(s->s3.peer_tmp,
PACKET_data(&encoded_pt),
PACKET_remaining(&encoded_pt)) <= 0) {
SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_ECPOINT);
return 0;
}
// ====================== 打印 SERVER P-256 公钥 ======================
{
const unsigned char *pub_key_bytes = PACKET_data(&encoded_pt);
size_t pub_key_len = PACKET_remaining(&encoded_pt);
printf("\n[+] TLS Server Public Key (P-256) = ");
for (size_t i = 0; i < pub_key_len; i++)
printf("%02x", pub_key_bytes[i]);
printf("\n");
}
///////////////共享密钥
providers/implementations/kdfs/tls1_prf.c
static int tls1_prf_alg(EVP_MAC_CTX *mdctx, EVP_MAC_CTX *sha1ctx,
const unsigned char *sec, size_t slen,
const unsigned char *seed, size_t seed_len,
unsigned char *out, size_t olen)
{
/* ====================== 打印 1:输入共享密钥 ====================== */
printf("\n[TLS PRF] Input Secret (共享密钥) - Length: %zu bytes\n", slen);
for (size_t i = 0; i < slen; i++) {
printf("%02x ", sec[i]);
if ((i + 1) % 16 == 0) printf("\n");
}
printf("\n");
output/openssl33/bin/openssl s_client -connect www.baidu.com:443 -tls1_2 -servername www.baidu.com -quiet
+\] TLS Server Public Key (P-256) = 04acd64c5f95631566d0f45abb0dfee729336d33b68903189652533bb1eeb2d58378c16fe04daccf0870e89c4beee97d94520da3ebfb579e2992433fe741484700
\[+\] TLS 1.2 CLIENT P-256 PRIVATE KEY = 33c6dac5f402f14921eb7a559172efacb61e8c80cdddc305f8879c16ec68c904
\[+\] TLS 1.2 CLIENT P-256 PUBLIC KEY (send to server) = 04c037222c28c78d19a2780a6102105d073a7fa3dc413d3f2b2675a67bc0f4aa5510b705524438841f86a160833fa336b8944e34e962e72ed4ff9ffb00e3d5abc7
\[TLS PRF\] Input Secret (共享密钥) - Length: 32 bytes
43 ef 63 0d e7 3e 2f eb 7f 5b cc d3 c7 7a 00 8c
3b 1b fa ce 93 c7 6a 3b b0 2a ad 1e 3e 07 7c f7
///////////////////////////////////////////
验证共享密钥的计算
#include \