[RADIATOR] TLS Session Resumption Issue

Christian Kratzer ck at cksoft.de
Tue Feb 27 16:05:16 UTC 2018


Hi,

we have another issue also related to storing data between requests. This time
we need to store something between individual sessions with tls session resumption.

The business logic in this setup dictates that we need to pass the certicate issuer and
policy to an external authenticator backend.

We extract the certicate issuer and policy in EAPTLS_CertificateVerifyHook and store them in EAPContext

 	sub {
 		my $matchedcn = $_[0];
 		my $cert = $_[2];
 		my $p = $_[5];

 		my $context = $p->{EAPContext};

 		use Net::SSLeay;
 		use Radius::Context;

 		# get issuer
 		my $issuer = &Net::SSLeay::X509_NAME_oneline(&Net::SSLeay::X509_get_issuer_name($cert));
 		&main::log($main::LOG_DEBUG, "auth-certificate.hook: Peer certificate issuer: $issuer");
 		$context->{'issuer'} = $issuer;

 		# get policies
 		my $rv = Net::SSLeay::X509_get_ext_by_NID($cert, 89, -1);
 		if($rv>=0) {
 			my $ext = Net::SSLeay::X509_get_ext($cert, $rv);
 			my $policies = Net::SSLeay::X509V3_EXT_print($ext);
 			$policies =~ s/.*: //g;
 			chomp $policies;
 			&main::log($main::LOG_DEBUG, "auth-certificate.hook: Peer certificate policies: $policies");
 			$context->{'policies'} = $policies;
 		} else {
 			&main::log($main::LOG_DEBUG, "auth-certificate.hook: Peer certificate policies not found.");
 		}

 		return $matchedcn;
 	}

We are then able to map the issuer and policy into the request in the respective AuthBys AuthHook

         if( defined $request->{EAPContext} ) {
             my $eap_context = $request->{EAPContext};
             if( defined $eap_context->{'issuer'} ) {
                 my $issuer = $eap_context->{'issuer'};
                 $request->add_attr('MY-ISSUER',$issuer) ;
                 &main::log($main::LOG_DEBUG, "auth.hook: Peer certificate issuer: $issuer");
             }
             if( defined $eap_context->{'policies'} ) {
                 my $policies = $eap_context->{'policies'};
                 $request->add_attr('MY-POLICY',$policies) ;
                 &main::log($main::LOG_DEBUG, "auth.hook: Peer certificate policies: $policies");
             }
         }

This works well to allow us to authenticate the first session of EAP_TLS


 	Tue Feb 27 15:26:03 2018 897279: DEBUG: Handling request with Handler 'EAP-Message = /^.{4}\x0d/', Identifier 'TLSauth'
 	Tue Feb 27 15:26:03 2018 897443: DEBUG:  Deleting session for host/FOO-0013.d.XXXX.XX, UNKNOWN, 37765
 	Tue Feb 27 15:26:03 2018 897579: DEBUG: Handling with Radius::AuthFILE: FILEauthTLS
 	Tue Feb 27 15:26:03 2018 897822: DEBUG: Handling with EAP: code 2, 79, 706, 13
 	Tue Feb 27 15:26:03 2018 897959: DEBUG: Response type 13
 	Tue Feb 27 15:26:03 2018 898479: DEBUG: Certificate Issuer Name is /CN=XXX XXXXXX D.XXXX.XX
 	Tue Feb 27 15:26:03 2018 898558: DEBUG: Certificate Subject Name is /CN=FOO-0013.d.XXXX.XX
 	Tue Feb 27 15:26:03 2018 898667: DEBUG: Matched certificate CN FOO-0013.d.XXXX.XX with User-Name host/FOO-0013.d.XXXX.XX or identity host/FOO-0013.d.XXXX.XX
 	Tue Feb 27 15:26:03 2018 898803: DEBUG: Reading users file /etc/radiator/users-tls
 	Tue Feb 27 15:26:03 2018 898967: DEBUG: Radius::AuthFILE looks for match with FOO-0013.d.XXXX.XX [host/FOO-0013.d.XXXX.XX]
 	Tue Feb 27 15:26:03 2018 899080: DEBUG: Radius::AuthFILE REJECT: No such user: FOO-0013.d.XXXX.XX [host/FOO-0013.d.XXXX.XX]
 	Tue Feb 27 15:26:03 2018 899226: DEBUG: Radius::AuthFILE looks for match with DEFAULT [host/FOO-0013.d.XXXX.XX]
 	Tue Feb 27 15:26:03 2018 899332: DEBUG: Radius::AuthFILE ACCEPT: : DEFAULT [host/FOO-0013.d.XXXX.XX]
 	Tue Feb 27 15:26:03 2018 899424: DEBUG: auth-certificate.hook: Peer certificate issuer: /CN=XXX XXXXXX D.XXXX.XX
 	Tue Feb 27 15:26:03 2018 899563: DEBUG: auth-certificate.hook: Peer certificate policies: 1.3.6.1.4.1.311.21.8.6992180.11062261.15289225.13702945.3968342.62.3648519909.238800916
 	Tue Feb 27 15:26:03 2018 901521: DEBUG: EAP TLS Session accepted: TLSv1.2 AES256-GCM-SHA384
 	Tue Feb 27 15:26:03 2018 901778: DEBUG: EAP result: 3, EAP TLS Challenge
 	Tue Feb 27 15:26:03 2018 901910: DEBUG: AuthBy FILE result: CHALLENGE, EAP TLS Challenge
 	Tue Feb 27 15:26:03 2018 902077: DEBUG: postauth.hook: authprotocol: EAP
 	Tue Feb 27 15:26:03 2018 902165: DEBUG: Access challenged for host/FOO-0013.d.XXXX.XX: EAP TLS Challenge

on resumption we see that resumption works

 	Tue Feb 27 15:27:02 2018 992212: DEBUG: Handling request with Handler 'EAP-Message = /^.{4}\x0d/', Identifier 'TLSauth'
 	Tue Feb 27 15:27:02 2018 992432: DEBUG:  Deleting session for host/FOO-0013.d.XXXX.XX, UNKNOWN, 37765
 	Tue Feb 27 15:27:02 2018 992713: DEBUG: Handling with Radius::AuthFILE: FILEauthTLS
 	Tue Feb 27 15:27:02 2018 993127: DEBUG: Handling with EAP: code 2, 78, 61, 13
 	Tue Feb 27 15:27:02 2018 993220: DEBUG: Response type 13
 	Tue Feb 27 15:27:02 2018 993548: DEBUG: EAP TLS Session accepted: TLSv1.2 AES256-GCM-SHA384
 	Tue Feb 27 15:27:02 2018 993743: DEBUG: EAP TLS session resumed

But the auth.hook cannot access issuer and policy in the EAPContext and later authorization fails because they are missing.

The question is how can we store the two strings extracted in EAPTLS_CertificateVerifyHook on first connect so they are 
available for use on session resumption.

Sorry about all the obfuscation.  This configuration is rather complex and it is also hard to simplify the case.

Greetings
Christian

-- 
Christian Kratzer                   CK Software GmbH
Email:   ck at cksoft.de               Wildberger Weg 24/2
Phone:   +49 7032 893 997 - 0       D-71126 Gaeufelden
Fax:     +49 7032 893 997 - 9       HRB 245288, Amtsgericht Stuttgart
Mobile:  +49 171 1947 843           Geschaeftsfuehrer: Christian Kratzer
Web:     http://www.cksoft.de/


More information about the radiator mailing list