Jelajahi Sumber

tls: get local/remote issuer line via $tls(key)

- new keys: m_issuer_line, p_issuer_line
Daniel-Constantin Mierla 3 tahun lalu
induk
melakukan
b3f77460ff
1 mengubah file dengan 22 tambahan dan 2 penghapusan
  1. 22 2
      src/modules/tls/tls_select.c

+ 22 - 2
src/modules/tls/tls_select.c

@@ -1263,6 +1263,13 @@ int pv_parse_tls_name(pv_spec_p sp, str *in)
 		return -1;
 
 	switch(in->len) {
+		case 13:
+			if(strncmp(in->s, "m_issuer_line", 13)==0)
+				sp->pvp.pvn.u.isname.name.n = 1001;
+			else if(strncmp(in->s, "p_issuer_line", 13)==0)
+				sp->pvp.pvn.u.isname.name.n = 5001;
+			else goto error;
+		break;
 		case 14:
 			if(strncmp(in->s, "m_subject_line", 14)==0)
 				sp->pvp.pvn.u.isname.name.n = 1000;
@@ -1309,9 +1316,9 @@ int pv_get_tls(struct sip_msg *msg, pv_param_t *param,
 					: SSL_get_peer_certificate(ssl);
 	if (cert == NULL) {
 		if (param->pvn.u.isname.name.n < 5000) {
-			LM_ERR("Unable to retrieve my TLS certificate from SSL structure\n");
+			LM_ERR("failed to retrieve my TLS certificate from SSL structure\n");
 		} else {
-			LM_ERR("Unable to retrieve peer TLS certificate from SSL structure\n");
+			LM_ERR("failed to retrieve peer TLS certificate from SSL structure\n");
 		}
 		goto error;
 	}
@@ -1325,8 +1332,21 @@ int pv_get_tls(struct sip_msg *msg, pv_param_t *param,
 			if(X509_NAME_oneline(X509_get_subject_name(cert), sv.s, sv.len)==NULL) {
 				goto error;
 			}
+			tcpconn_put(c);
+			return pv_get_strzval(msg, param, res, sv.s);
+		break;
+
+		case 1001:
+		case 5001:
+			sv.s = pv_get_buffer();
+			sv.len = pv_get_buffer_size() - 1;
+			if(X509_NAME_oneline(X509_get_issuer_name(cert), sv.s, sv.len)==NULL) {
+				goto error;
+			}
+			tcpconn_put(c);
 			return pv_get_strzval(msg, param, res, sv.s);
 		break;
+
 		default:
 			goto error;
 	}