Hi folks. PKI-related commands have started to fail on my setup:

    $ ipa cert-find 
    ipa: ERROR: Certificate operation cannot be completed: Unable to 
communicate with CMS (403)

    $ ipa vaultconfig-show
    ipa: ERROR: an internal error has occurred

In /var/log/httpd/error_log I can see, respectively (stripping out the
dates, pids, ip addresses etc):

    ipa: ERROR: ra.find(): Unable to communicate with CMS (403)
    ipa: INFO: [jsonserver_session] [email protected]: cert_find/1(None, 
version='2.245'): CertificateOperationError

and:

    ipa: ERROR: non-public: HTTPError: 403 Client Error: 403 for url: 
https://ipa3.ipa.example.com:443/kra/rest/config/cert/transport                 
                                                                                
               
    Traceback (most recent call last):
      File "/usr/lib/python3.6/site-packages/pki/__init__.py", line 437, in 
handler
        json = exc_val.response.json()
      File "/usr/lib/python3.6/site-packages/requests/models.py", line 897, in 
json
        return complexjson.loads(self.text, **kwargs)
      File "/usr/lib64/python3.6/json/__init__.py", line 354, in loads
        return _default_decoder.decode(s)
      File "/usr/lib64/python3.6/json/decoder.py", line 339, in decode
        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
      File "/usr/lib64/python3.6/json/decoder.py", line 357, in raw_decode
        raise JSONDecodeError("Expecting value", s, err.value) from None
    json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/lib/python3.6/site-packages/ipaserver/rpcserver.py", line 407, 
in wsgi_execute
        result = command(*args, **options)
      File "/usr/lib/python3.6/site-packages/ipalib/frontend.py", line 471, in 
__call__
        return self.__do_call(*args, **options)
      File "/usr/lib/python3.6/site-packages/ipalib/frontend.py", line 499, in 
__do_call
        ret = self.run(*args, **options)
      File "/usr/lib/python3.6/site-packages/ipalib/frontend.py", line 821, in 
run
        return self.execute(*args, **options)
      File "/usr/lib/python3.6/site-packages/ipaserver/plugins/vault.py", line 
1003, in execute
        transport_cert = kra_client.system_certs.get_transport_cert()
      File "/usr/lib/python3.6/site-packages/pki/__init__.py", line 442, in 
handler
        six.reraise(exc_type, exc_val, exc_tb)
      File "/usr/lib/python3.6/site-packages/six.py", line 693, in reraise
        raise value
      File "/usr/lib/python3.6/site-packages/pki/__init__.py", line 431, in 
handler
        return fn_call(inst, *args, **kwargs)
      File "/usr/lib/python3.6/site-packages/pki/systemcert.py", line 62, in 
get_transport_cert
        response = self.connection.get(url, self.headers)
      File "/usr/lib/python3.6/site-packages/pki/client.py", line 55, in wrapper
        return func(self, *args, **kwargs)
      File "/usr/lib/python3.6/site-packages/pki/client.py", line 261, in get
        r.raise_for_status()
      File "/usr/lib/python3.6/site-packages/requests/models.py", line 940, in 
raise_for_status
        raise HTTPError(http_error_msg, response=self)
    requests.exceptions.HTTPError: 403 Client Error: 403 for url: 
https://ipa3.example.com:443/kra/rest/config/cert/transport
    
    ipa: INFO: [jsonserver_session] [email protected]: 
vaultconfig_show/1(version='2.245'): InternalError

The only messages I can find on the PKI server side are in
</var/log/pki/pki-tomcat/localhost_access_log.2022-04-27.txt>:

    2001:db8::1 - - [27/Apr/2022:11:59:14 +0000] "POST 
/ca/rest/certs/search?size=2147483647 HTTP/1.1" 403 618
    2001:db8::1 - - [27/Apr/2022:11:59:17 +0000] "GET 
/kra/rest/config/cert/transport HTTP/1.1" 403 618

So I'm guessing that whatever certificate the IPA API uses to
communicate with the PKI server has expired.

ipa-healthcheck has been telling me about certificates with mismatches
between their NSS databases and their copies within CS.cfg for a while.
I reported these at <https://github.com/dogtagpki/pki/issues/3877> in
the hope that it would lead somewhere, before the warning actually
started causing problems. And then forgot all about it, naturally. :)

Here are the failed checks from ipa-healtcheck, followed by certmonger's
status for each tracking request, and the details of the certificate in
the NSS database and its copy within CS.cfg:

    {
      "source": "pki.server.healthcheck.meta.csconfig",
      "check": "KRADogtagCertsConfigCheck",
      "result": "ERROR",
      "uuid": "38ada44b-ded5-4ae9-9365-6d171bc5b0fa",
      "when": "20220427040032Z",
      "duration": "0.193909",
      "kw": {
        "key": "kra_transport",
        "nickname": "transportCert cert-pki-kra",
        "directive": "kra.transport.cert",
        "configfile": "/var/lib/pki/pki-tomcat/kra/conf/CS.cfg",
        "msg": "Certificate 'transportCert cert-pki-kra' does not match the 
value of kra.transport.cert in /var/lib/pki/pki-tomcat/kra/conf/CS.cfg"
      }
    }
    {
      "source": "ipahealthcheck.dogtag.ca",
      "check": "DogtagCertsConfigCheck",
      "result": "ERROR",
      "uuid": "24b190a9-e445-47d8-9664-742ec413f18e",
      "when": "20220427040033Z",
      "duration": "0.471634",
      "kw": {
        "key": "transportCert cert-pki-kra",
        "directive": "ca.connector.KRA.transportCert",
        "configfile": "/var/lib/pki/pki-tomcat/conf/ca/CS.cfg",
        "msg": "Certificate 'transportCert cert-pki-kra' does not match the 
value of ca.connector.KRA.transportCert in 
/var/lib/pki/pki-tomcat/conf/ca/CS.cfg"
      }
    }

    # getcert list -d /etc/pki/pki-tomcat/alias -n 'transportCert cert-pki-kra'
    Number of certificates and requests being tracked: 12.
    Request ID '20210518174640':
        status: MONITORING
        stuck: no
        key pair storage: 
type=NSSDB,location='/etc/pki/pki-tomcat/alias',nickname='transportCert 
cert-pki-kra',token='NSS Certificate DB',pin set
        certificate: 
type=NSSDB,location='/etc/pki/pki-tomcat/alias',nickname='transportCert 
cert-pki-kra',token='NSS Certificate DB'
        CA: dogtag-ipa-ca-renew-agent
        issuer: CN=Certificate Authority,O=IPA.EXAMPLE.COM
        subject: CN=KRA Transport Certificate,O=IPA.EXAMPLE.COM
        expires: 2023-03-31 21:42:06 UTC
        key usage: 
digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
        eku: id-kp-clientAuth
        profile: caTransportCert
        pre-save command: /usr/libexec/ipa/certmonger/stop_pkicad
        post-save command: /usr/libexec/ipa/certmonger/renew_ca_cert 
"transportCert cert-pki-kra"
        track: yes
        auto-renew: yes

    # certutil -d /etc/pki/pki-tomcat/alias -L -n 'transportCert cert-pki-kra' 
-a | openssl x509 -noout -issuer -serial -subject -dates
    issuer=O = IPA.EXAMPLE.COM, CN = Certificate Authority
    serial=2FFF000B
    subject=O = IPA.EXAMPLE.COM, CN = KRA Transport Certificate
    notBefore=Apr 10 21:42:06 2021 GMT
    notAfter=Mar 31 21:42:06 2023 GMT

    # crudini --get /etc/pki/pki-tomcat/kra/CS.cfg '' kra.transport.cert | 
base64 -d | openssl x509 -inform der -noout -issuer -serial -subject -dates
    issuer=O = IPA.EXAMPLE.COM, CN = Certificate Authority
    serial=0B
    subject=O = IPA.EXAMPLE.COM, CN = KRA Transport Certificate
    notBefore=Mar 18 00:15:01 2019 GMT
    notAfter=Mar  7 00:15:01 2021 GMT

    # crudini --get /var/lib/pki/pki-tomcat/conf/ca/CS.cfg '' 
ca.connector.KRA.transportCert | base64 -d | openssl x509 -inform der -noout 
-issuer -serial -subject -dates
    issuer=O = IPA.EXAMPLE.COM, CN = Certificate Authority
    serial=0B
    subject=O = IPA.EXAMPLE.COM, CN = KRA Transport Certificate
    notBefore=Mar 18 00:15:01 2019 GMT
    notAfter=Mar  7 00:15:01 2021 GMT

    {
      "source": "pki.server.healthcheck.meta.csconfig",
      "check": "KRADogtagCertsConfigCheck",
      "result": "ERROR",
      "uuid": "c90d8174-bf9d-4efe-a24c-4e4ece90d7f9",
      "when": "20220427040032Z",
      "duration": "0.256320",
      "kw": {
        "key": "kra_storage",
        "nickname": "storageCert cert-pki-kra",
        "directive": "kra.storage.cert",
        "configfile": "/var/lib/pki/pki-tomcat/kra/conf/CS.cfg",
        "msg": "Certificate 'storageCert cert-pki-kra' does not match the value 
of kra.storage.cert in /var/lib/pki/pki-tomcat/kra/conf/CS.cfg"
      }
    }

    # getcert list -d /etc/pki/pki-tomcat/alias -n 'storageCert cert-pki-kra'
    Number of certificates and requests being tracked: 12.
    Request ID '20210518174641':
        status: MONITORING
        stuck: no
        key pair storage: 
type=NSSDB,location='/etc/pki/pki-tomcat/alias',nickname='storageCert 
cert-pki-kra',token='NSS Certificate DB',pin set
        certificate: 
type=NSSDB,location='/etc/pki/pki-tomcat/alias',nickname='storageCert 
cert-pki-kra',token='NSS Certificate DB'
        CA: dogtag-ipa-ca-renew-agent
        issuer: CN=Certificate Authority,O=IPA.EXAMPLE.COM
        subject: CN=KRA Storage Certificate,O=IPA.EXAMPLE.COM
        expires: 2023-03-31 21:42:23 UTC
        key usage: 
digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
        eku: id-kp-clientAuth
        profile: caStorageCert
        pre-save command: /usr/libexec/ipa/certmonger/stop_pkicad
        post-save command: /usr/libexec/ipa/certmonger/renew_ca_cert 
"storageCert cert-pki-kra"
        track: yes
        auto-renew: yes

    # certutil -d /etc/pki/pki-tomcat/alias -L -n 'storageCert cert-pki-kra' -a 
| openssl x509 -noout -issuer -serial -subject -dates
    issuer=O = IPA.EXAMPLE.COM, CN = Certificate Authority
    serial=2FFF000D
    subject=O = IPA.EXAMPLE.COM, CN = KRA Storage Certificate
    notBefore=Apr 10 21:42:23 2021 GMT
    notAfter=Mar 31 21:42:23 2023 GMT

    # crudini --get /etc/pki/pki-tomcat/kra/CS.cfg '' kra.storage.cert | base64 
-d | openssl x509 -inform der -noout -issuer -serial -subject -dates
    issuer=O = IPA.EXAMPLE.COM, CN = Certificate Authority
    serial=0C
    subject=O = IPA.EXAMPLE.COM, CN = KRA Storage Certificate
    notBefore=Mar 18 00:15:01 2019 GMT
    notAfter=Mar  7 00:15:01 2021 GMT

    {
      "source": "pki.server.healthcheck.meta.csconfig",
      "check": "KRADogtagCertsConfigCheck",
      "result": "ERROR",
      "uuid": "95187b54-782d-455f-8dae-39d6eaee71e5",
      "when": "20220427040033Z",
      "duration": "0.319186",
      "kw": {
        "key": "kra_audit_signing",
        "nickname": "auditSigningCert cert-pki-kra",
        "directive": "kra.audit_signing.cert",
        "configfile": "/var/lib/pki/pki-tomcat/kra/conf/CS.cfg",
        "msg": "Certificate 'auditSigningCert cert-pki-kra' does not match the 
value of kra.audit_signing.cert in /var/lib/pki/pki-tomcat/kra/conf/CS.cfg"
      }
    }

    # getcert list -d /etc/pki/pki-tomcat/alias -n 'auditSigningCert 
cert-pki-kra'
    Number of certificates and requests being tracked: 12.
    Request ID '20210518174639':
        status: MONITORING
        stuck: no
        key pair storage: 
type=NSSDB,location='/etc/pki/pki-tomcat/alias',nickname='auditSigningCert 
cert-pki-kra',token='NSS Certificate DB',pin set
        certificate: 
type=NSSDB,location='/etc/pki/pki-tomcat/alias',nickname='auditSigningCert 
cert-pki-kra',token='NSS Certificate DB'
        CA: dogtag-ipa-ca-renew-agent
        issuer: CN=Certificate Authority,O=IPA.EXAMPLE.COM
        subject: CN=KRA Audit,O=IPA.EXAMPLE.COM
        expires: 2023-03-31 21:42:08 UTC
        key usage: digitalSignature,nonRepudiation
        profile: caAuditSigningCert
        pre-save command: /usr/libexec/ipa/certmonger/stop_pkicad
        post-save command: /usr/libexec/ipa/certmonger/renew_ca_cert 
"auditSigningCert cert-pki-kra"
        track: yes
        auto-renew: yes


    # certutil -d /etc/pki/pki-tomcat/alias -L -n 'auditSigningCert 
cert-pki-kra' -a | openssl x509 -noout -issuer -serial -subject -dates
    issuer=O = IPA.EXAMPLE.COM, CN = Certificate Authority
    serial=2FFF000C
    subject=O = IPA.EXAMPLE.COM, CN = KRA Audit
    notBefore=Apr 10 21:42:08 2021 GMT
    notAfter=Mar 31 21:42:08 2023 GMT

    # crudini --get /etc/pki/pki-tomcat/kra/CS.cfg '' kra.audit_signing.cert | 
base64 -d | openssl x509 -inform der -noout -issuer -serial -subject -dates
    issuer=O = IPA.EXAMPLE.COM, CN = Certificate Authority
    serial=0D
    subject=O = IPA.EXAMPLE.COM, CN = KRA Audit
    notBefore=Mar 18 00:15:02 2019 GMT
    notAfter=Mar  7 00:15:02 2021 GMT

I'm really not clear exactly what is supposed to be taking the
certificates from the NSS database and updating CS.cfg. At first I
thought it was the renew_ca_cert script, but looking into the code, it
only seems to update CS.cfg for 'caSigningCert cert-pki-ca'.

(Regarding that, there's maybe another issue to solve here. The CA's
CS.cfg file has subsystem.select=Clone; it looks like that will cause
renew_ca_cert to not update CS.cfg when the CA certificate renews in the
distant future. Should I edit CS.cfg by hand, or maybe promote another
server to be the CA renewal master, and see if subsystem.select is set
properly on that server once it's promoted?)

Anyway. The funny thing about all this is that all these certificates
expired last year. And I am pretty sure I used the ipa vault commands a
couple of weeks ago. So perhaps the problem is actually elsewhere, and
I don't know how to debug the PKI server any further, so...

1. Are the expired certs in CS.cfg causing the problem?
2. Which bit of FreeIPA updates the certificate copies in CS.cfg?
3. Where do I look to debug the PKI server further?

As always, I'm grateful for any assistance, thanks :)

-- 
Sam Morris <https://robots.org.uk/>
PGP: rsa4096/CAAA AA1A CA69 A83A 892B  1855 D20B 4202 5CDA 27B9
_______________________________________________
FreeIPA-users mailing list -- [email protected]
To unsubscribe send an email to [email protected]
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedorahosted.org/archives/list/[email protected]
Do not reply to spam on the list, report it: 
https://pagure.io/fedora-infrastructure

Reply via email to