@@ -40,7 +40,49 @@ namespace hcpp
4040 {
4141 enable_sni_ = false ;
4242 }
43- awaitable<void > mitm_svc::make_memory (std::string svc_host, std::string svc_service, part_cert_info &pci)
43+ void mitm_svc::add_SAN_collector (part_cert_info &pci)
44+ {
45+ // verify_fun_=
46+ verify_fun_ = [&pci](bool preverified, auto &v_ctx)
47+ {
48+ if (preverified)
49+ {
50+ X509 *cert = X509_STORE_CTX_get_current_cert (v_ctx.native_handle ());
51+ // X509_NAME *subject = X509_get_subject_name(cert);
52+ // log::error("{}", X509_NAME_oneline(subject, nullptr, 0));
53+ // 获取目标主机证书
54+ // echo -n | openssl s_client -connect gitee.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | openssl x509 -text -noout
55+ // 获取目标主机证书中的subjectAltName
56+ // https://www.openssl.org/docs/manmaster/man3/X509_get_ext_d2i.html
57+ if (auto names = (GENERAL_NAMES *)X509_get_ext_d2i (cert, NID_subject_alt_name, nullptr , nullptr ); names != nullptr )
58+ {
59+
60+ for (int j = 0 ; j < sk_GENERAL_NAME_num (names); j++)
61+ {
62+ GENERAL_NAME *name = sk_GENERAL_NAME_value (names, j);
63+ if (name->type == GEN_DNS )
64+ {
65+ // 如果是DNS类型的Subject Alternative Name
66+ // 获取DNS名称
67+ char *dns_name = (char *)ASN1_STRING_get0_data (name->d .dNSName );
68+ log::info (" DNS Name: {}" , dns_name);
69+ pci.dns_name_ .push_back (dns_name);
70+ }
71+ // 可以根据需要处理其他类型的Subject Alternative Name
72+ }
73+ }
74+
75+ pci.pubkey_ = make_pem_str (X509_get_X509_PUBKEY (cert));
76+ return true ;
77+ }
78+ else
79+ {
80+ return false ;
81+ }
82+ // X509_NAME_oneline(X509_get_subject_name(cert), subject_name, sizeof(subject_name)); });
83+ };
84+ }
85+ awaitable<void > mitm_svc::make_memory (std::string svc_host, std::string svc_service)
4486 {
4587 try
4688 {
@@ -56,43 +98,20 @@ namespace hcpp
5698 {
5799 ssl_m->set_sni (sni_host_);
58100 }
59- auto verify_fun = [&pci , host = svc_host](bool preverified, auto &v_ctx)
101+ auto verify_fun = [self = shared_from_this () , host = svc_host](bool preverified, auto &v_ctx)
60102 {
61103 if (ssl::host_name_verification (host)(preverified, v_ctx))
62104 {
63- X509 *cert = X509_STORE_CTX_get_current_cert (v_ctx.native_handle ());
64- // X509_NAME *subject = X509_get_subject_name(cert);
65- // log::error("{}", X509_NAME_oneline(subject, nullptr, 0));
66- // 获取目标主机证书
67- // echo -n | openssl s_client -connect gitee.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | openssl x509 -text -noout
68- // 获取目标主机证书中的subjectAltName
69- // https://www.openssl.org/docs/manmaster/man3/X509_get_ext_d2i.html
70- if (auto names = (GENERAL_NAMES *)X509_get_ext_d2i (cert, NID_subject_alt_name, nullptr , nullptr ); names != nullptr )
105+ if (self->verify_fun_ )
71106 {
72-
73- for (int j = 0 ; j < sk_GENERAL_NAME_num (names); j++)
74- {
75- GENERAL_NAME *name = sk_GENERAL_NAME_value (names, j);
76- if (name->type == GEN_DNS )
77- {
78- // 如果是DNS类型的Subject Alternative Name
79- // 获取DNS名称
80- char *dns_name = (char *)ASN1_STRING_get0_data (name->d .dNSName );
81- log::info (" DNS Name: {}" , dns_name);
82- pci.dns_name_ .push_back (dns_name);
83- }
84- // 可以根据需要处理其他类型的Subject Alternative Name
85- }
107+ return self->verify_fun_ (preverified, v_ctx);
86108 }
87-
88- pci.pubkey_ = make_pem_str (X509_get_X509_PUBKEY (cert));
89109 return true ;
90110 }
91111 else
92112 {
93113 return false ;
94114 }
95- // X509_NAME_oneline(X509_get_subject_name(cert), subject_name, sizeof(subject_name)); });
96115 };
97116 ssl_m->set_verify_callback (verify_fun);
98117 co_await ssl_m->async_handshake ();
0 commit comments