Add issuer options to cert-show and cert-find

Add options to cert-show and cert-find for specifying the issuer as
a DN, or a CA name.

Also add the issuer DN to the output of cert-find.

Part of: https://fedorahosted.org/freeipa/ticket/4559

Reviewed-By: Jan Cholasta <jcholast@redhat.com>
Reviewed-By: Martin Babinsky <mbabinsk@redhat.com>
This commit is contained in:
Fraser Tweedale
2016-05-10 13:56:40 +10:00
committed by Jan Cholasta
parent ae6d5b79fb
commit 08e0aa23b0
4 changed files with 63 additions and 4 deletions

View File

@@ -730,11 +730,13 @@ output: Entry('result')
output: Output('summary', type=[<type 'unicode'>, <type 'NoneType'>]) output: Output('summary', type=[<type 'unicode'>, <type 'NoneType'>])
output: PrimaryKey('value') output: PrimaryKey('value')
command: cert_find command: cert_find
args: 0,17,4 args: 0,19,4
option: Flag('all', autofill=True, cli_name='all', default=False) option: Flag('all', autofill=True, cli_name='all', default=False)
option: Str('cacn?', autofill=False, cli_name='ca')
option: Flag('exactly?', autofill=True, default=False) option: Flag('exactly?', autofill=True, default=False)
option: Str('issuedon_from?', autofill=False) option: Str('issuedon_from?', autofill=False)
option: Str('issuedon_to?', autofill=False) option: Str('issuedon_to?', autofill=False)
option: Str('issuer?', autofill=False)
option: Int('max_serial_number?', autofill=False) option: Int('max_serial_number?', autofill=False)
option: Int('min_serial_number?', autofill=False) option: Int('min_serial_number?', autofill=False)
option: Flag('raw', autofill=True, cli_name='raw', default=False) option: Flag('raw', autofill=True, cli_name='raw', default=False)
@@ -774,8 +776,9 @@ option: Int('revocation_reason', autofill=True, default=0)
option: Str('version?') option: Str('version?')
output: Output('result') output: Output('result')
command: cert_show command: cert_show
args: 1,2,1 args: 1,3,1
arg: Str('serial_number') arg: Str('serial_number')
option: Str('cacn?', autofill=False, cli_name='ca')
option: Str('out?') option: Str('out?')
option: Str('version?') option: Str('version?')
output: Output('result') output: Output('result')

View File

@@ -90,5 +90,5 @@ IPA_DATA_VERSION=20100614120000
# # # #
######################################################## ########################################################
IPA_API_VERSION_MAJOR=2 IPA_API_VERSION_MAJOR=2
IPA_API_VERSION_MINOR=183 IPA_API_VERSION_MINOR=184
# Last change: ftweedal - add --ca option to cert-request # Last change: ftweedal - add issuer options to cert-show and cert-find

View File

@@ -610,6 +610,13 @@ class cert_show(VirtualCommand):
) )
takes_options = ( takes_options = (
Str('cacn?',
cli_name='ca',
query=True,
label=_('Issuing CA'),
doc=_('Name of issing CA'),
autofill=False,
),
Str('out?', Str('out?',
label=_('Output filename'), label=_('Output filename'),
doc=_('File to store the certificate in.'), doc=_('File to store the certificate in.'),
@@ -631,8 +638,24 @@ class cert_show(VirtualCommand):
raise acierr raise acierr
hostname = get_host_from_principal(bind_principal) hostname = get_host_from_principal(bind_principal)
issuer_dn = None
if 'cacn' in options:
ca_obj = api.Command.ca_show(options['cacn'])['result']
issuer_dn = ca_obj['ipacasubjectdn'][0]
# Dogtag lightweight CAs have shared serial number domain, so
# we don't tell Dogtag the issuer (but we check the cert after).
#
result=self.Backend.ra.get_certificate(serial_number) result=self.Backend.ra.get_certificate(serial_number)
cert = x509.load_certificate(result['certificate']) cert = x509.load_certificate(result['certificate'])
if issuer_dn is not None and DN(unicode(cert.issuer)) != DN(issuer_dn):
# DN of cert differs from what we requested
raise errors.NotFound(
reason=_("Certificate with serial number %(serial)s "
"issued by CA '%(ca)s' not found")
% dict(serial=serial_number, ca=options['cacn']))
result['subject'] = unicode(cert.subject) result['subject'] = unicode(cert.subject)
result['issuer'] = unicode(cert.issuer) result['issuer'] = unicode(cert.issuer)
result['valid_not_before'] = unicode(cert.valid_not_before_str) result['valid_not_before'] = unicode(cert.valid_not_before_str)
@@ -734,6 +757,18 @@ class cert_find(Command):
doc=_('Subject'), doc=_('Subject'),
autofill=False, autofill=False,
), ),
Str('cacn?',
cli_name='ca',
query=True,
label=_('Issuing CA'),
doc=_('Name of issing CA'),
autofill=False,
),
Str('issuer?',
label=_('Issuer'),
doc=_('Issuer DN'),
autofill=False,
),
Int('revocation_reason?', Int('revocation_reason?',
label=_('Reason'), label=_('Reason'),
doc=_('Reason for revoking the certificate (0-10). Type ' doc=_('Reason for revoking the certificate (0-10). Type '
@@ -818,6 +853,18 @@ class cert_find(Command):
def execute(self, **options): def execute(self, **options):
ca_enabled_check() ca_enabled_check()
if 'cacn' in options:
ca_obj = api.Command.ca_show(options['cacn'])['result']
ca_sdn = unicode(ca_obj['ipacasubjectdn'][0])
if 'issuer' in options:
if DN(ca_sdn) != DN(options['issuer']):
# client has provided both 'ca' and 'issuer' but
# issuer DNs don't match; result must be empty
return dict(result=[], count=0, truncated=False)
else:
options['issuer'] = ca_sdn
ret = dict( ret = dict(
result=self.Backend.ra.find(options) result=self.Backend.ra.find(options)
) )

View File

@@ -1809,6 +1809,10 @@ class ra(rabase.rabase):
node.text = options['subject'] node.text = options['subject']
booloptions['subjectInUse'] = True booloptions['subjectInUse'] = True
if 'issuer' in options:
node = etree.SubElement(page, 'issuerDN')
node.text = options['issuer']
if 'revocation_reason' in options: if 'revocation_reason' in options:
node = etree.SubElement(page, 'revocationReason') node = etree.SubElement(page, 'revocationReason')
node.text = unicode(options['revocation_reason']) node.text = unicode(options['revocation_reason'])
@@ -1897,6 +1901,11 @@ class ra(rabase.rabase):
dn = cert.xpath('SubjectDN') dn = cert.xpath('SubjectDN')
if len(dn) == 1: if len(dn) == 1:
response_request['subject'] = unicode(dn[0].text) response_request['subject'] = unicode(dn[0].text)
issuer_dn = cert.xpath('IssuerDN')
if len(dn) == 1:
response_request['issuer'] = unicode(issuer_dn[0].text)
status = cert.xpath('Status') status = cert.xpath('Status')
if len(status) == 1: if len(status) == 1:
response_request['status'] = unicode(status[0].text) response_request['status'] = unicode(status[0].text)