class ZTSImpl implements KeyStore, ZTSHandler {

    @Override
    public Response postSSHCertRequest(ResourceContext ctx, SSHCertRequest certRequest) {

        final String caller = ctx.getApiName();
        final String principalDomain = logPrincipalAndGetDomain(ctx);

        if (readOnlyMode) {
            throw requestError("Server in Maintenance Read-Only mode. Please try your request later",
                    caller, ZTSConsts.ZTS_UNKNOWN_DOMAIN, principalDomain);
        }

        validateRequest(ctx.request(), principalDomain, caller);
        validate(certRequest, TYPE_SSH_CERT_REQUEST, principalDomain, caller);

        // for consistent handling of all requests, we're going to convert
        // all incoming object values into lower case (e.g. domain, role,
        // policy, service, etc name)

        AthenzObject.SSH_CERT_REQUEST.convertToLowerCase(certRequest);

        // get our principal and domain values

        final Principal principal = ((RsrcCtxWrapper) ctx).principal();
        final String domainName = principal.getDomain();
        setRequestDomain(ctx, domainName);

        // generate our certificate. the ssh signer interface throws
        // rest ResourceExceptions so we'll catch and log those

        SSHCertificates certs;
        try {
            certs = instanceCertManager.generateSSHCertificates(principal, certRequest);
        } catch (com.yahoo.athenz.common.server.rest.ResourceException ex) {
            throw error(ex.getCode(), ex.getMessage(), caller, domainName, principalDomain);
        }

        return Response.status(ResourceException.CREATED).entity(certs).build();
    }

    public  ZTSImpl();
    public  ZTSImpl(CloudStore implCloudStore, DataStore implDataStore);

}