Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
SSS-CERTMAP(5)		  File Formats and Conventions		  SSS-CERTMAP(5)

NAME
     sss-certmap - SSSD Certificate Matching and Mapping Rules

DESCRIPTION
     The  manual  page	describes  the rules which can be used by SSSD and other
     components to match X.509 certificates and map them to accounts.

     Each rule has four components, a "priority", a "matching rule", a	"mapping
     rule"  and  a "domain list". All components are optional. A missing "prior-
     ity" will add the rule with the  lowest  priority.  The  default  "matching
     rule"  will  match  certificates  with  the  digitalSignature key usage and
     clientAuth extended key usage. If the "mapping rule" is empty the	certifi-
     cates  will be searched in the userCertificate attribute as DER encoded bi-
     nary. If no domains are given only the local domain will be searched.

     To allow extensions or completely different style of rule the "mapping" and
     "matching rules" can contain a prefix separated with a ':'  from  the  main
     part  of the rule. The prefix may only contain upper-case ASCII letters and
     numbers. If the prefix is omitted the default type will be  used  which  is
     'KRB5' for the matching rules and 'LDAP' for the mapping rules.

     The  'sssctl'  utility  provides the 'cert-eval-rule' command to check if a
     given certificate matches a matching rules and how the output of a  mapping
     rule would look like.

RULE COMPONENTS
   PRIORITY
     The  rules  are processed by priority while the number '0' (zero) indicates
     the highest priority. The higher the number the lower is  the  priority.  A
     missing  value  indicates	the  lowest  priority.	The  rules processing is
     stopped when a matched rule is found and no further rules are checked.

     Internally the priority is treated as unsigned 32bit integer, using a  pri-
     ority value larger than 4294967295 will cause an error.

     If multiple rules have the same priority and only one of the related match-
     ing  rules  applies,  this rule will be chosen. If there are multiple rules
     with the same priority which matches, one is chosen but which one is  unde-
     fined.  To avoid this undefined behavior either use different priorities or
     make the matching rules more specific e.g. by using distinct <ISSUER>  pat-
     terns.

   MATCHING RULE
     The matching rule is used to select a certificate to which the mapping rule
     should   be  applied.  It	uses  a  system  similar  to  the  one	used  by
     "pkinit_cert_match" option of MIT Kerberos. It consists of  a  keyword  en-
     closed  by  '<'  and '>' which identified a certain part of the certificate
     and a pattern which should be found for the rule to match. Multiple keyword
     pattern pairs can be either joined with '&&' (and) or '||' (or).

     Given the similarity to MIT Kerberos the  type  prefix  for  this	rule  is
     'KRB5'.  But  'KRB5'  will also be the default for "matching rules" so that
     "<SUBJECT>.*,DC=MY,DC=DOMAIN"  and  "KRB5:<SUBJECT>.*,DC=MY,DC=DOMAIN"  are
     equivalent.

     The available options are:

     <SUBJECT>regular-expression
	 With  this  a	part or the whole subject name of the certificate can be
	 matched. For the matching POSIX Extended Regular Expression  syntax  is
	 used, see regex(7) for details.

	 For  the matching the subject name stored in the certificate in DER en-
	 coded ASN.1 is converted into a string  according  to	RFC  4514.  This
	 means	the  most  specific name component comes first. Please note that
	 not all possible attribute names are covered by RFC 4514. The names in-
	 cluded are 'CN', 'L', 'ST', 'O', 'OU', 'C', 'STREET', 'DC'  and  'UID'.
	 Other	attribute names might be shown differently on different platform
	 and by different tools. To avoid confusion those  attribute  names  are
	 best not used or covered by a suitable regular-expression.

	 Example: <SUBJECT>.*,DC=MY,DC=DOMAIN

	 Please  note  that the characters "^.[$()|*+?{\" have a special meaning
	 in regular expressions and must be escaped with the  help  of	the  '\'
	 character so that they are matched as ordinary characters.

	 Example: <SUBJECT>^CN=.* \(Admin\),DC=MY,DC=DOMAIN$

     <ISSUER>regular-expression
	 With  this  a	part  or the whole issuer name of the certificate can be
	 matched. All comments for <SUBJECT> apply her as well.

	 Example: <ISSUER>^CN=My-CA,DC=MY,DC=DOMAIN$

     <KU>key-usage
	 This option can be used to specify which key usage values the	certifi-
	 cate should have. The following values can be used in a comma separated
	 list:

	 *   digitalSignature

	 *   nonRepudiation

	 *   keyEncipherment

	 *   dataEncipherment

	 *   keyAgreement

	 *   keyCertSign

	 *   cRLSign

	 *   encipherOnly

	 *   decipherOnly

	 A  numerical value in the range of a 32bit unsigned integer can be used
	 as well to cover special use cases.

	 Example: <KU>digitalSignature,keyEncipherment

     <EKU>extended-key-usage
	 This option can be used to specify which extended key	usage  the  cer-
	 tificate  should have. The following value can be used in a comma sepa-
	 rated list:

	 *   serverAuth

	 *   clientAuth

	 *   codeSigning

	 *   emailProtection

	 *   timeStamping

	 *   OCSPSigning

	 *   KPClientAuth

	 *   pkinit

	 *   msScLogin

	 Extended key usages which are not listed above can  be  specified  with
	 their OID in dotted-decimal notation.

	 Example: <EKU>clientAuth,1.3.6.1.5.2.3.4

     <SAN>regular-expression
	 To  be compatible with the usage of MIT Kerberos this option will match
	 the Kerberos principals in  the  PKINIT  or  AD  NT  Principal  SAN  as
	 <SAN:Principal> does.

	 Example: <SAN>.*@MY\.REALM

     <SAN:Principal>regular-expression
	 Match the Kerberos principals in the PKINIT or AD NT Principal SAN.

	 Example: <SAN:Principal>.*@MY\.REALM

     <SAN:ntPrincipalName>regular-expression
	 Match the Kerberos principals from the AD NT Principal SAN.

	 Example: <SAN:ntPrincipalName>.*@MY.AD.REALM

     <SAN:pkinit>regular-expression
	 Match the Kerberos principals from the PKINIT SAN.

	 Example: <SAN:ntPrincipalName>.*@MY\.PKINIT\.REALM

     <SAN:dotted-decimal-oid>regular-expression
	 Take  the value of the otherName SAN component given by the OID in dot-
	 ted-decimal notation, interpret it  as  string  and  try  to  match  it
	 against the regular expression.

	 Example: <SAN:1.2.3.4>test

     <SAN:otherName>base64-string
	 Do  a	binary	match with the base64 encoded blob against all otherName
	 SAN components. With this option it is possible to match against custom
	 otherName components with special encodings which could not be  treated
	 as strings.

	 Example: <SAN:otherName>MTIz

     <SAN:rfc822Name>regular-expression
	 Match the value of the rfc822Name SAN.

	 Example: <SAN:rfc822Name>.*@email\.domain

     <SAN:dNSName>regular-expression
	 Match the value of the dNSName SAN.

	 Example: <SAN:dNSName>.*\.my\.dns\.domain

     <SAN:x400Address>base64-string
	 Binary match the value of the x400Address SAN.

	 Example: <SAN:x400Address>MTIz

     <SAN:directoryName>regular-expression
	 Match	the  value  of the directoryName SAN. The same comments as given
	 for <ISSUER> and <SUBJECT> apply here as well.

	 Example: <SAN:directoryName>.*,DC=com

     <SAN:ediPartyName>base64-string
	 Binary match the value of the ediPartyName SAN.

	 Example: <SAN:ediPartyName>MTIz

     <SAN:uniformResourceIdentifier>regular-expression
	 Match the value of the uniformResourceIdentifier SAN.

	 Example: <SAN:uniformResourceIdentifier>URN:.*

     <SAN:iPAddress>regular-expression
	 Match the value of the iPAddress SAN.

	 Example: <SAN:iPAddress>192\.168\..*

     <SAN:registeredID>regular-expression
	 Match the value of the registeredID SAN as dotted-decimal string.

	 Example: <SAN:registeredID>1\.2\.3\..*

   MAPPING RULE
     The mapping rule is used to associate a certificate with one  or  more  ac-
     counts.  A  Smartcard with the certificate and the matching private key can
     then be used to authenticate as one of those accounts.

     Currently SSSD basically only supports LDAP to lookup user information (the
     exception is the proxy provider which is not of relevance here). Because of
     this the mapping rule is based on LDAP search filter syntax with  templates
     to  add  certificate  content to the filter. It is expected that the filter
     will only contain the specific data needed for the  mapping  and  that  the
     caller  will embed it in another filter to do the actual search. Because of
     this the filter string should start and stop with '(' and ')' respectively.

     In general it is recommended to use attributes from the certificate and add
     them to special attributes to the LDAP user object. E.g. the 'altSecurityI-
     dentities' attribute in AD or the 'ipaCertMapData' attribute for IPA can be
     used.

     This should be preferred to read user specific data  from	the  certificate
     like e.g. an email address and search for it in the LDAP server. The reason
     is  that  the  user  specific data in LDAP might change for various reasons
     would break the mapping. On the other hand it would be hard  to  break  the
     mapping on purpose for a specific user.

     The default "mapping rule" type is 'LDAP' which can be added as a prefix to
     a	rule  like  e.g. 'LDAP:(userCertificate;binary={cert!bin})'. There is an
     extension called 'LDAPU1' which offer more templates for more  flexibility.
     To  allow older versions of this library to ignore the extension the prefix
     'LDAPU1' must be used when using the new templates in a "mapping rule" oth-
     erwise the old version of this library will fail with a parsing error.  The
     new  templates  are  described in section the section called "LDAPU1 exten-
     sion".

     The templates to add certificate data to the search  filter  are  based  on
     Python-style  formatting strings. They consist of a keyword in curly braces
     with an optional sub-component specifier separated by a '.' or an	optional
     conversion/formatting option separated by a '!'. Allowed values are:

     {issuer_dn[!((ad|ad_x500)|ad_ldap|nss_x500|(nss|nss_ldap))]}
	 This template will add the full issuer DN converted to a string accord-
	 ing  to  RFC  4514. If X.500 ordering (most specific RDN comes last) an
	 option with the '_x500' prefix should be used.

	 The conversion options starting with 'ad_' will use attribute names  as
	 used by AD, e.g. 'S' instead of 'ST'.

	 The conversion options starting with 'nss_' will use attribute names as
	 used by NSS.

	 The  default conversion option is 'nss', i.e. attribute names according
	 to NSS and LDAP/RFC 4514 ordering.

	 Example: (ipacertmapdata=X509:<I>{issuer_dn!ad}<S>{subject_dn!ad})

     {subject_dn[!((ad|ad_x500)|ad_ldap|nss_x500|(nss|nss_ldap))]}
	 This template will add the full subject DN converted to string  accord-
	 ing  to  RFC  4514. If X.500 ordering (most specific RDN comes last) an
	 option with the '_x500' prefix should be used.

	 The conversion options starting with 'ad_' will use attribute names  as
	 used by AD, e.g. 'S' instead of 'ST'.

	 The conversion options starting with 'nss_' will use attribute names as
	 used by NSS.

	 The  default conversion option is 'nss', i.e. attribute names according
	 to NSS and LDAP/RFC 4514 ordering.

	 Example:	    (ipacertmapdata=X509:<I>{issuer_dn!nss_x500}<S>{sub-
	 ject_dn!nss_x500})

     {cert[!(bin|base64)]}
	 This template will add the whole DER encoded certificate as a string to
	 the  search  filter. Depending on the conversion option the binary cer-
	 tificate is either converted  to  an  escaped	hex  sequence  '\xx'  or
	 base64.  The  escaped	hex sequence is the default and can e.g. be used
	 with the LDAP attribute 'userCertificate;binary'.

	 Example: (userCertificate;binary={cert!bin})

     {subject_principal[.short_name]}
	 This template will add the Kerberos principal	which  is  taken  either
	 from  the  SAN  used  by pkinit or the one used by AD. The 'short_name'
	 component represents the first part of the  principal	before	the  '@'
	 sign.

	 Example:     (|(userPrincipal={subject_principal})(samAccountName={sub-
	 ject_principal.short_name}))

     {subject_pkinit_principal[.short_name]}
	 This template will add the Kerberos principal which is given by the SAN
	 used by pkinit. The 'short_name' component represents the first part of
	 the principal before the '@' sign.

	 Example:	  (|(userPrincipal={subject_pkinit_principal})(uid={sub-
	 ject_pkinit_principal.short_name}))

     {subject_nt_principal[.short_name]}
	 This template will add the Kerberos principal which is given by the SAN
	 used  by AD. The 'short_name' component represent the first part of the
	 principal before the '@' sign.

	 Example:	(|(userPrincipalName={subject_nt_principal})(samAccount-
	 Name={subject_nt_principal.short_name}))

     {subject_rfc822_name[.short_name]}
	 This  template  will  add  the string which is stored in the rfc822Name
	 component of the SAN, typically an email address. The 'short_name' com-
	 ponent represents the first part of the address before the '@' sign.

	 Example:			(|(mail={subject_rfc822_name})(uid={sub-
	 ject_rfc822_name.short_name}))

     {subject_dns_name[.short_name]}
	 This template will add the string which is stored in the dNSName compo-
	 nent	of   the   SAN,  typically  a  fully-qualified	host  name.  The
	 'short_name' component represents the first part of the name before the
	 first '.' sign.

	 Example:			  (|(fqdn={subject_dns_name})(host={sub-
	 ject_dns_name.short_name}))

     {subject_uri}
	 This template will add the string which is stored in the uniformResour-
	 ceIdentifier component of the SAN.

	 Example: (uri={subject_uri})

     {subject_ip_address}
	 This template will add the string which is stored in the iPAddress com-
	 ponent of the SAN.

	 Example: (ip={subject_ip_address})

     {subject_x400_address}
	 This  template  will  add  the value which is stored in the x400Address
	 component of the SAN as escaped hex sequence.

	 Example: (attr:binary={subject_x400_address})

     {subject_directory_name[!((ad|ad_x500)|ad_ldap|nss_x500|(nss|nss_ldap))]}
	 This template will add the DN string of the value which  is  stored  in
	 the directoryName component of the SAN.

	 Example: (orig_dn={subject_directory_name})

     {subject_ediparty_name}
	 This  template  will  add the value which is stored in the ediPartyName
	 component of the SAN as escaped hex sequence.

	 Example: (attr:binary={subject_ediparty_name})

     {subject_registered_id}
	 This template will add the OID which is stored in the registeredID com-
	 ponent of the SAN as a dotted-decimal string.

	 Example: (oid={subject_registered_id})

     LDAPU1 extension

	 The following templates are available when using  the	'LDAPU1'  exten-
	 sion:

	 {serial_number[!(dec|hex[_ucr])]}
	     This template will add the serial number of the certificate. By de-
	     fault  it	will  be printed as a hexadecimal number with lower-case
	     letters.

	     With the formatting option '!dec' the number  will  be  printed  as
	     decimal  string.  The  hexadecimal  output  can be printed with up-
	     per-case letters ('!hex_u'), with a colon separating the  hexadeci-
	     mal bytes ('!hex_c') or with the hexadecimal bytes in reverse order
	     ('!hex_r').  The  postfix	letters  can  be  combined  so that e.g.
	     '!hex_uc' will produce a colon-separated  hexadecimal  string  with
	     upper-case letters.

	     Example: LDAPU1:(serial={serial_number})

	 {subject_key_id[!hex[_ucr]]}
	     This  template  will  add the subject key id of the certificate. By
	     default it will be printed as a hexadecimal number with  lower-case
	     letters.

	     The  hexadecimal  output  can  be	printed  with upper-case letters
	     ('!hex_u'),  with	a  colon  separating   the   hexadecimal   bytes
	     ('!hex_c')   or   with  the  hexadecimal  bytes  in  reverse  order
	     ('!hex_r'). The postfix  letters  can  be	combined  so  that  e.g.
	     '!hex_uc'	will  produce  a colon-separated hexadecimal string with
	     upper-case letters.

	     Example: LDAPU1:(ski={subject_key_id})

	 {cert[!DIGEST[_ucr]]}
	     This template will add the hexadecimal digest/hash of the	certifi-
	     cate  where  DIGEST must be replaced with the name of a digest/hash
	     function supported by OpenSSL, e.g. 'sha512'.

	     The hexadecimal output  can  be  printed  with  upper-case  letters
	     ('!sha512_u'),  with  a  colon  separating  the  hexadecimal  bytes
	     ('!sha512_c') or  with  the  hexadecimal  bytes  in  reverse  order
	     ('!sha512_r').  The  postfix  letters  can be combined so that e.g.
	     '!sha512_uc' will produce a colon-separated hexadecimal string with
	     upper-case letters.

	     Example: LDAPU1:(dgst={cert!sha256})

	 {subject_dn_component[(.attr_name|[number]]}
	     This template will add an attribute value of  a  component  of  the
	     subject DN, by default the value of the most specific component.

	     A	different  component  can  be selected by either attribute name,
	     e.g.  {subject_dn_component.uid}  or  by	position,   e.g.   {sub-
	     ject_dn_component.[2]}  where  positive numbers start counting from
	     the most specific component and  negative	numbers  start	counting
	     from  the least specific component. Attribute name and the position
	     can be combined as e.g. {subject_dn_component.uid[2]}  which  means
	     that the name of the second component must be 'uid'.

	     Example: LDAPU1:(uid={subject_dn_component.uid})

	 {issuer_dn_component[(.attr_name|[number]]}
	     This template will add an attribute value of a component of the is-
	     suer DN, by default the value of the most specific component.

	     See 'subject_dn_component' for details about the attribute name and
	     position specifiers.

	     Example:  LDAPU1:(domain={issuer_dn_component.[-2]}.{issuer_dn_com-
	     ponent.dc[-1]})

	 {sid[.rid]}
	     This template will add the SID if the corresponding  extension  in-
	     troduced  by  Microsoft with the OID 1.3.6.1.4.1.311.25.2 is avail-
	     able. With the '.rid' selector only the last  component,  i.e.  the
	     RID, will be added.

	     Example: LDAPU1:(objectsid={sid})

   DOMAIN LIST
     If the domain list is not empty users mapped to a given certificate are not
     only searched in the local domain but in the listed domains as well as long
     as they are know by SSSD. Domains not know to SSSD will be ignored.

AUTHORS
     The SSSD upstream - https://github.com/SSSD/sssd/

SSSD				   08/27/2026			  SSS-CERTMAP(5)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=sss-certmap&sektion=5&manpath=FreeBSD+Ports+15.1.quarterly>

home | help