125 static void update_error_state(TLS_SESS_STATE *TLScontext,
int depth,
126 X509 *errorcert,
int errorcode)
129 if (TLScontext->errordepth >= 0 && TLScontext->errordepth <= depth)
138 if (TLScontext->errorcert != 0)
139 X509_free(TLScontext->errorcert);
141 X509_up_ref(errorcert);
142 TLScontext->errorcert = errorcert;
143 TLScontext->errorcode = errorcode;
144 TLScontext->errordepth = depth;
149 int tls_verify_certificate_callback(
int ok, X509_STORE_CTX *ctx)
151 char buf[CCERT_BUFSIZ];
157 TLS_SESS_STATE *TLScontext;
160 cert = X509_STORE_CTX_get_current_cert(ctx);
161 err = X509_STORE_CTX_get_error(ctx);
162 con = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
163 TLScontext = SSL_get_ex_data(con, TLScontext_index);
164 depth = X509_STORE_CTX_get_error_depth(ctx);
167 if (ok && TLScontext->tadepth > 0 && depth > TLScontext->tadepth)
184 max_depth = SSL_get_verify_depth(con) - 1;
192 if (max_depth >= 0 && depth > max_depth) {
193 X509_STORE_CTX_set_error(ctx, err = X509_V_ERR_CERT_CHAIN_TOO_LONG);
197 update_error_state(TLScontext, depth, cert, err);
199 if (TLScontext->log_mask & TLS_LOG_VERBOSE) {
201 X509_NAME_oneline(X509_get_subject_name(cert), buf,
sizeof(buf));
203 strcpy(buf,
"<unknown>");
204 msg_info(
"%s: depth=%d verify=%d subject=%s",
205 TLScontext->namaddr, depth, ok,
printable(buf,
'?'));
212 void tls_log_verify_error(TLS_SESS_STATE *TLScontext)
214 char buf[CCERT_BUFSIZ];
215 int err = TLScontext->errorcode;
216 X509 *cert = TLScontext->errorcert;
217 int depth = TLScontext->errordepth;
219 #define PURPOSE ((depth>0) ? "CA": TLScontext->am_server ? "client": "server")
221 if (err == X509_V_OK)
228 case X509_V_ERR_CERT_UNTRUSTED:
234 msg_info(
"certificate verification failed for %s: "
235 "not trusted by local or TLSA policy", TLScontext->namaddr);
237 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
238 msg_info(
"certificate verification failed for %s: "
239 "self-signed certificate", TLScontext->namaddr);
241 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
242 case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
250 X509_NAME_oneline(X509_get_issuer_name(cert), buf,
sizeof(buf));
252 strcpy(buf,
"<unknown>");
253 msg_info(
"certificate verification failed for %s: untrusted issuer %s",
254 TLScontext->namaddr,
printable(buf,
'?'));
256 case X509_V_ERR_CERT_NOT_YET_VALID:
257 case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
258 msg_info(
"%s certificate verification failed for %s: certificate not"
259 " yet valid", PURPOSE, TLScontext->namaddr);
261 case X509_V_ERR_CERT_HAS_EXPIRED:
262 case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
263 msg_info(
"%s certificate verification failed for %s: certificate has"
264 " expired", PURPOSE, TLScontext->namaddr);
266 case X509_V_ERR_INVALID_PURPOSE:
267 msg_info(
"certificate verification failed for %s: not designated for "
268 "use as a %s certificate", TLScontext->namaddr, PURPOSE);
270 case X509_V_ERR_CERT_CHAIN_TOO_LONG:
271 msg_info(
"certificate verification failed for %s: "
272 "certificate chain longer than limit(%d)",
273 TLScontext->namaddr, depth - 1);
276 msg_info(
"%s certificate verification failed for %s: num=%d:%s",
277 PURPOSE, TLScontext->namaddr, err,
278 X509_verify_cert_error_string(err));
290 static char *tls_text_name(X509_NAME *name,
int nid,
const char *label,
291 const TLS_SESS_STATE *TLScontext,
int gripe)
293 const char *myname =
"tls_text_name";
295 X509_NAME_ENTRY *entry;
296 ASN1_STRING *entry_str;
299 unsigned char *utf8_value;
303 if (name == 0 || (pos = X509_NAME_get_index_by_NID(name, nid, -1)) < 0) {
305 msg_warn(
"%s: %s: peer certificate has no %s",
306 myname, TLScontext->namaddr, label);
317 if (X509_NAME_get_index_by_NID(name, nid, pos) >= 0) {
318 msg_warn(
"%s: %s: multiple %ss in peer certificate",
319 myname, TLScontext->namaddr, label);
324 if ((entry = X509_NAME_get_entry(name, pos)) == 0) {
326 msg_warn(
"%s: %s: error reading peer certificate %s entry",
327 myname, TLScontext->namaddr, label);
331 if ((entry_str = X509_NAME_ENTRY_get_data(entry)) == 0) {
333 msg_warn(
"%s: %s: error reading peer certificate %s data",
334 myname, TLScontext->namaddr, label);
350 asn1_type = ASN1_STRING_type(entry_str);
351 if ((utf8_length = ASN1_STRING_to_UTF8(&utf8_value, entry_str)) < 0) {
352 msg_warn(
"%s: %s: error decoding peer %s of ASN.1 type=%d",
353 myname, TLScontext->namaddr, label, asn1_type);
362 #define TLS_TEXT_NAME_RETURN(x) do { \
363 char *__tls_text_name_temp = (x); \
364 OPENSSL_free(utf8_value); \
365 return (__tls_text_name_temp); \
372 #define TRIM0(s, l) do { while ((l) > 0 && (s)[(l)-1] == 0) --(l); } while (0)
374 TRIM0(utf8_value, utf8_length);
380 if (utf8_length >= CCERT_BUFSIZ) {
381 msg_warn(
"%s: %s: peer %s too long: %d",
382 myname, TLScontext->namaddr, label, utf8_length);
383 TLS_TEXT_NAME_RETURN(0);
390 if (utf8_length != strlen((
char *) utf8_value)) {
391 msg_warn(
"%s: %s: NULL character in peer %s",
392 myname, TLScontext->namaddr, label);
393 TLS_TEXT_NAME_RETURN(0);
403 for (cp = utf8_value; (ch = *cp) != 0; cp++) {
405 msg_warn(
"%s: %s: non-printable content in peer %s",
406 myname, TLScontext->namaddr, label);
407 TLS_TEXT_NAME_RETURN(0);
410 TLS_TEXT_NAME_RETURN(
mystrdup((
char *) utf8_value));
415 const char *tls_dns_name(
const GENERAL_NAME * gn,
416 const TLS_SESS_STATE *TLScontext)
418 const char *myname =
"tls_dns_name";
427 if (gn->type != GEN_DNS)
428 msg_panic(
"%s: Non DNS input argument", myname);
434 if (ASN1_STRING_type(gn->d.ia5) != V_ASN1_IA5STRING) {
435 msg_warn(
"%s: %s: invalid ASN1 value type in subjectAltName",
436 myname, TLScontext->namaddr);
443 dnsname = (
const char *) ASN1_STRING_get0_data(gn->d.ia5);
444 len = ASN1_STRING_length(gn->d.ia5);
454 if (len != strlen(dnsname)) {
455 msg_warn(
"%s: %s: internal NUL in subjectAltName",
456 myname, TLScontext->namaddr);
466 if (*dnsname && !
allprint(dnsname)) {
468 msg_warn(
"%s: %s: non-printable characters in subjectAltName: %.100s",
469 myname, TLScontext->namaddr,
printable(cp,
'?'));
478 char *tls_peer_CN(X509 *peercert,
const TLS_SESS_STATE *TLScontext)
482 cn = tls_text_name(X509_get_subject_name(peercert), NID_commonName,
489 char *tls_issuer_CN(X509 *peer,
const TLS_SESS_STATE *TLScontext)
494 name = X509_get_issuer_name(peer);
500 if ((cn = tls_text_name(name, NID_commonName,
502 cn = tls_text_name(name, NID_organizationName,
503 "issuer Organization", TLScontext,
DONT_GRIPE);
char * mystrdup(const char *str)
NORETURN msg_panic(const char *fmt,...)
void msg_warn(const char *fmt,...)
int allprint(const char *string)
char * printable(char *string, int replacement)
void msg_info(const char *fmt,...)