{"id":12445,"date":"2026-08-14T13:14:40","date_gmt":"2026-08-14T18:14:40","guid":{"rendered":"https:\/\/www.rushworth.us\/lisa\/?p=12445"},"modified":"2026-08-14T13:14:40","modified_gmt":"2026-08-14T18:14:40","slug":"spire-setup-documentation","status":"publish","type":"post","link":"https:\/\/www.rushworth.us\/lisa\/?p=12445","title":{"rendered":"SPIRE Setup Documentation"},"content":{"rendered":"<h2>Overview<\/h2>\n<p>This setup deploys SPIRE as follows:<\/p>\n<ul>\n<li>SPIRE Server on &lt;SPIRE_SERVER_HOST&gt;<\/li>\n<li>SPIRE Agent on &lt;SPIRE_AGENT_HOST&gt;<\/li>\n<li>Trust domain: &lt;TRUST_DOMAIN&gt;<\/li>\n<li>Server\/agent communication port: &lt;SERVER_PORT&gt;\/tcp<\/li>\n<\/ul>\n<h2>How it works<\/h2>\n<p>SPIRE provides machine and workload identity.<\/p>\n<p>The SPIRE Server on &lt;SPIRE_SERVER_HOST&gt; is the trust authority for the trust domain &lt;TRUST_DOMAIN&gt;.<\/p>\n<p>The SPIRE Agent on &lt;SPIRE_AGENT_HOST&gt; attests to the server using x509pop with an X.509 certificate issued by an enterprise\/internal CA.<\/p>\n<p>Applications on &lt;SPIRE_AGENT_HOST&gt; do not talk directly to the SPIRE Server. They talk to the local SPIRE Agent over the local workload API socket &lt;AGENT_SOCKET_PATH&gt;.<\/p>\n<p>The agent returns an X.509-SVID representing the workload identity.<\/p>\n<h2>Installation Instructions<\/h2>\n<ol>\n<li>Install SPIRE binaries<\/li>\n<\/ol>\n<p>Run on both hosts:<\/p>\n<p>mkdir -p \/opt\/spire<br \/>\ncd \/tmp<br \/>\nwget https:\/\/github.com\/spiffe\/spire\/releases\/download\/v1.15.2\/spire-1.15.2-linux-amd64-musl.tar.gz<br \/>\ntar zxf spire-1.15.2-linux-amd64-musl.tar.gz<br \/>\ncp -r spire-1.15.2\/. \/opt\/spire\/<\/p>\n<p>On the SPIRE Server host:<\/p>\n<p>ln -sf \/opt\/spire\/bin\/spire-server \/usr\/bin\/spire-server<\/p>\n<p>On the SPIRE Agent host:<\/p>\n<p>ln -sf \/opt\/spire\/bin\/spire-agent \/usr\/bin\/spire-agent<\/p>\n<ol>\n<li>Configure SPIRE Server<\/li>\n<\/ol>\n<p>Create directories:<\/p>\n<p>mkdir -p \/opt\/spire\/conf<br \/>\nmkdir -p \/opt\/spire\/data\/server<br \/>\nmkdir -p \/opt\/spire\/conf\/x509pop<\/p>\n<p>Place the CA bundle at:<\/p>\n<p>\/opt\/spire\/conf\/x509pop\/bundle.pem<\/p>\n<p>Contents:<\/p>\n<p>&#8212;&#8211;BEGIN CERTIFICATE&#8212;&#8211;<br \/>\n&lt;REDACTED CA CERTIFICATE&gt;<br \/>\n&#8212;&#8211;END CERTIFICATE&#8212;&#8211;<br \/>\n&#8212;&#8211;BEGIN CERTIFICATE&#8212;&#8211;<br \/>\n&lt;REDACTED CA CERTIFICATE&gt;<br \/>\n&#8212;&#8211;END CERTIFICATE&#8212;&#8211;<br \/>\n&#8212;&#8211;BEGIN CERTIFICATE&#8212;&#8211;<br \/>\n&lt;REDACTED CA CERTIFICATE&gt;<br \/>\n&#8212;&#8211;END CERTIFICATE&#8212;&#8211;<\/p>\n<p>Create \/opt\/spire\/conf\/server.conf:<\/p>\n<p>server {<br \/>\nbind_address = &#8220;0.0.0.0&#8221;<br \/>\nbind_port = &#8220;&lt;SERVER_PORT&gt;&#8221;<br \/>\ntrust_domain = &#8220;&lt;TRUST_DOMAIN&gt;&#8221;<br \/>\ndata_dir = &#8220;\/opt\/spire\/data\/server&#8221;<br \/>\nlog_level = &#8220;INFO&#8221;<br \/>\n}<\/p>\n<p>plugins {<br \/>\nDataStore &#8220;sql&#8221; {<br \/>\nplugin_data {<br \/>\ndatabase_type = &#8220;sqlite3&#8221;<br \/>\nconnection_string = &#8220;\/opt\/spire\/data\/server\/datastore.sqlite3&#8221;<br \/>\n}<br \/>\n}<\/p>\n<p>NodeAttestor &#8220;x509pop&#8221; {<br \/>\nplugin_data {<br \/>\nca_bundle_path = &#8220;\/opt\/spire\/conf\/x509pop\/bundle.pem&#8221;<br \/>\n}<br \/>\n}<\/p>\n<p>KeyManager &#8220;memory&#8221; {<br \/>\nplugin_data {}<br \/>\n}<br \/>\n}<\/p>\n<p>health_checks {<br \/>\nlistener_enabled = true<br \/>\nbind_address = &#8220;127.0.0.1&#8221;<br \/>\nbind_port = &#8220;&lt;HEALTH_PORT&gt;&#8221;<br \/>\n}<\/p>\n<p>Create \/etc\/systemd\/system\/spire-server.service:<\/p>\n<p>[Unit]<br \/>\nDescription=SPIRE Server<br \/>\nAfter=network-online.target<br \/>\nWants=network-online.target<\/p>\n<p>[Service]<br \/>\nType=simple<br \/>\nExecStart=\/opt\/spire\/bin\/spire-server run -config \/opt\/spire\/conf\/server.conf<br \/>\nRestart=on-failure<br \/>\nRestartSec=5<br \/>\nLimitNOFILE=65536<\/p>\n<p>[Install]<br \/>\nWantedBy=multi-user.target<\/p>\n<p>Start server:<\/p>\n<p>systemctl daemon-reload<br \/>\nsystemctl enable &#8211;now spire-server<br \/>\nsystemctl status spire-server &#8211;no-pager<\/p>\n<p>Validate server:<\/p>\n<p>spire-server healthcheck<\/p>\n<ol>\n<li>Configure SPIRE Agent<\/li>\n<\/ol>\n<p>Create directories:<\/p>\n<p>mkdir -p \/opt\/spire\/conf<br \/>\nmkdir -p \/opt\/spire\/data\/agent<br \/>\nmkdir -p \/opt\/spire\/sockets<br \/>\nmkdir -p \/opt\/spire\/conf\/x509pop<\/p>\n<p>Issue a certificate through your enterprise PKI platform. Download as OpenSSL format and split CRT\/KEY files. Copy the node certificate to:<\/p>\n<p>\/opt\/spire\/conf\/x509pop\/agent.crt<\/p>\n<p>Copy the node private key to:<\/p>\n<p>\/opt\/spire\/conf\/x509pop\/agent.key<\/p>\n<p>The private key must be unencrypted PEM.<\/p>\n<p>Set permissions:<\/p>\n<p>chmod 700 \/opt\/spire\/conf\/x509pop<br \/>\nchmod 600 \/opt\/spire\/conf\/x509pop\/agent.key<br \/>\nchmod 644 \/opt\/spire\/conf\/x509pop\/agent.crt<\/p>\n<p>Create \/opt\/spire\/conf\/agent.conf:<\/p>\n<p>agent {<br \/>\ndata_dir = &#8220;\/opt\/spire\/data\/agent&#8221;<br \/>\nlog_level = &#8220;INFO&#8221;<br \/>\ntrust_domain = &#8220;&lt;TRUST_DOMAIN&gt;&#8221;<br \/>\nserver_address = &#8220;&lt;SPIRE_SERVER_HOST&gt;&#8221;<br \/>\nserver_port = &#8220;&lt;SERVER_PORT&gt;&#8221;<br \/>\nsocket_path = &#8220;&lt;AGENT_SOCKET_PATH&gt;&#8221;<br \/>\ninsecure_bootstrap = true<br \/>\n}<\/p>\n<p>plugins {<br \/>\nKeyManager &#8220;disk&#8221; {<br \/>\nplugin_data {<br \/>\ndirectory = &#8220;\/opt\/spire\/data\/agent&#8221;<br \/>\n}<br \/>\n}<\/p>\n<p>WorkloadAttestor &#8220;unix&#8221; {<br \/>\nplugin_data {}<br \/>\n}<\/p>\n<p>NodeAttestor &#8220;x509pop&#8221; {<br \/>\nplugin_data {<br \/>\nprivate_key_path = &#8220;\/opt\/spire\/conf\/x509pop\/agent.key&#8221;<br \/>\ncertificate_path = &#8220;\/opt\/spire\/conf\/x509pop\/agent.crt&#8221;<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>Create \/etc\/systemd\/system\/spire-agent.service:<\/p>\n<p>[Unit]<br \/>\nDescription=SPIRE Agent<br \/>\nAfter=network-online.target<br \/>\nWants=network-online.target<\/p>\n<p>[Service]<br \/>\nType=simple<br \/>\nExecStart=\/opt\/spire\/bin\/spire-agent run -config \/opt\/spire\/conf\/agent.conf<br \/>\nRestart=on-failure<br \/>\nRestartSec=5<br \/>\nLimitNOFILE=65536<\/p>\n<p>[Install]<br \/>\nWantedBy=multi-user.target<\/p>\n<p>Start agent:<\/p>\n<p>systemctl daemon-reload<br \/>\nsystemctl enable &#8211;now spire-agent<br \/>\nsystemctl status spire-agent &#8211;no-pager<\/p>\n<ol>\n<li>Validate x509pop agent attestation<\/li>\n<\/ol>\n<p>On the SPIRE Server host:<\/p>\n<p>spire-server agent list<\/p>\n<p>Expected result:<\/p>\n<ul>\n<li>Agent attestation type is x509pop<\/li>\n<li>Can re-attest is true<\/li>\n<li>Parent ID format resembles:<\/li>\n<\/ul>\n<p>spiffe:\/\/&lt;TRUST_DOMAIN&gt;\/spire\/agent\/x509pop\/&lt;AGENT_HASH&gt;<\/p>\n<ol>\n<li>Create workload registration entry<\/li>\n<\/ol>\n<p>Use the current x509pop agent SPIFFE ID from spire-server agent list.<\/p>\n<p>On the SPIRE Server host:<\/p>\n<p>spire-server entry create \\<br \/>\n-spiffeID spiffe:\/\/&lt;TRUST_DOMAIN&gt;\/workload\/&lt;WORKLOAD_NAME&gt; \\<br \/>\n-parentID spiffe:\/\/&lt;TRUST_DOMAIN&gt;\/spire\/agent\/x509pop\/&lt;AGENT_HASH&gt; \\<br \/>\n-selector unix:uid:0<\/p>\n<p>This authorizes a root-owned process on the SPIRE Agent host.<\/p>\n<ol>\n<li>Fetch workload identity on the SPIRE Agent host<\/li>\n<\/ol>\n<p>\/opt\/spire\/bin\/spire-agent api fetch x509 -socketPath &lt;AGENT_SOCKET_PATH&gt;<\/p>\n<p>Expected SPIFFE ID:<\/p>\n<p>spiffe:\/\/&lt;TRUST_DOMAIN&gt;\/workload\/&lt;WORKLOAD_NAME&gt;<\/p>\n<ol>\n<li>Write certs to disk for testing<\/li>\n<\/ol>\n<p>Create destination directory:<\/p>\n<p>mkdir -p \/etc\/spire\/svid\/test<br \/>\nchmod 700 \/etc\/spire\/svid\/test<\/p>\n<p>Write files:<\/p>\n<p>\/opt\/spire\/bin\/spire-agent api fetch x509 \\<br \/>\n-socketPath &lt;AGENT_SOCKET_PATH&gt; \\<br \/>\n-write \/etc\/spire\/svid\/test<\/p>\n<p>Inspect output:<\/p>\n<p>ls -l \/etc\/spire\/svid\/test<\/p>\n<p>openssl x509 -in \/etc\/spire\/svid\/test\/svid.0.pem -text -noout<\/p>\n<ol>\n<li>Reboot persistence validation<\/li>\n<\/ol>\n<p>Reboot the SPIRE Agent host.<\/p>\n<p>After reboot, validate:<\/p>\n<p>systemctl status spire-agent &#8211;no-pager<\/p>\n<p>ls -l &lt;AGENT_SOCKET_PATH&gt;<\/p>\n<p>\/opt\/spire\/bin\/spire-agent api fetch x509 -socketPath &lt;AGENT_SOCKET_PATH&gt;<\/p>\n<p>Expected behavior:<\/p>\n<ul>\n<li>spire-agent starts automatically<\/li>\n<li>Workload API socket exists<\/li>\n<li>X.509-SVID fetch succeeds<\/li>\n<\/ul>\n<ol>\n<li>Operational notes<\/li>\n<\/ol>\n<ul>\n<li>Current architecture: &lt;SPIRE_SERVER_HOST&gt; = SPIRE Server; &lt;SPIRE_AGENT_HOST&gt; = SPIRE Agent<\/li>\n<li>Current trust domain: &lt;TRUST_DOMAIN&gt;<\/li>\n<li>Current server\/agent path: &lt;SPIRE_AGENT_HOST&gt; to &lt;SPIRE_SERVER_HOST&gt; on TCP &lt;SERVER_PORT&gt;<\/li>\n<li>Current Workload API socket: &lt;AGENT_SOCKET_PATH&gt;<\/li>\n<li>Current example workload selector: unix:uid:0<\/li>\n<li>Current example workload identity: spiffe:\/\/&lt;TRUST_DOMAIN&gt;\/workload\/&lt;WORKLOAD_NAME&gt;<\/li>\n<\/ul>\n<h2>JWT<\/h2>\n<p>Create JWT registration on the SPIRE Server host:<\/p>\n<p>spire-server entry create \\<br \/>\n-spiffeID spiffe:\/\/&lt;TRUST_DOMAIN&gt;\/workload\/&lt;JWT_WORKLOAD_NAME&gt; \\<br \/>\n-parentID spiffe:\/\/&lt;TRUST_DOMAIN&gt;\/spire\/agent\/x509pop\/&lt;AGENT_HASH&gt; \\<br \/>\n-selector unix:uid:0<\/p>\n<p>Fetch JWT-SVID from the SPIRE Agent host:<\/p>\n<p>\/opt\/spire\/bin\/spire-agent api fetch jwt \\<br \/>\n-socketPath &lt;AGENT_SOCKET_PATH&gt; \\<br \/>\n-audience &lt;JWT_AUDIENCE&gt; \\<br \/>\n-spiffeID spiffe:\/\/&lt;TRUST_DOMAIN&gt;\/workload\/&lt;JWT_WORKLOAD_NAME&gt;<\/p>\n<p>Example output:<\/p>\n<p>token(spiffe:\/\/&lt;TRUST_DOMAIN&gt;\/workload\/&lt;JWT_WORKLOAD_NAME&gt;):<br \/>\n&lt;REDACTED JWT-SVID&gt;<\/p>\n<p>bundle(spiffe:\/\/&lt;TRUST_DOMAIN&gt;):<br \/>\n&lt;REDACTED JWKS BUNDLE&gt;<\/p>\n<h2>SPIRE OIDC Discovery Provider<\/h2>\n<p>On the SPIRE Server host:<\/p>\n<p>mkdir -p \/opt\/spire-extras<br \/>\ncd \/tmp<br \/>\nwget https:\/\/github.com\/spiffe\/spire\/releases\/download\/v1.15.2\/spire-extras-1.15.2-linux-amd64-musl.tar.gz<br \/>\ntar zxf spire-extras-1.15.2-linux-amd64-musl.tar.gz<br \/>\ncp -r spire-extras-1.15.2\/ \/opt\/spire-extras\/<\/p>\n<p>ln -sf \/opt\/spire-extras\/bin\/oidc-discovery-provider \/usr\/bin\/oidc-discovery-provider<br \/>\nmkdir -p \/opt\/spire-extras\/conf\/oidc-discovery-provider<\/p>\n<p>Create certificate and key files:<\/p>\n<p>\/opt\/spire-extras\/conf\/oidc-discovery-provider\/tls.crt<br \/>\n\/opt\/spire-extras\/conf\/oidc-discovery-provider\/tls.key<\/p>\n<p>Set permissions:<\/p>\n<p>chmod 644 \/opt\/spire-extras\/conf\/oidc-discovery-provider\/tls.crt<br \/>\nchmod 600 \/opt\/spire-extras\/conf\/oidc-discovery-provider\/tls.key<\/p>\n<p>Create \/opt\/spire-extras\/conf\/oidc-discovery-provider\/oidc-discovery-provider.conf:<\/p>\n<p>log_level = &#8220;INFO&#8221;<\/p>\n<p>domains = [&#8220;&lt;OIDC_DISCOVERY_DOMAIN&gt;&#8221;]<\/p>\n<p>server_api {<br \/>\naddress = &#8220;unix:\/\/&lt;SPIRE_SERVER_API_SOCKET&gt;&#8221;<br \/>\n}<\/p>\n<p>serving_cert_file {<br \/>\ncert_file_path = &#8220;\/opt\/spire-extras\/conf\/oidc-discovery-provider\/tls.crt&#8221;<br \/>\nkey_file_path = &#8220;\/opt\/spire-extras\/conf\/oidc-discovery-provider\/tls.key&#8221;<br \/>\n}<\/p>\n<p>Create \/etc\/systemd\/system\/spire-oidc-discovery-provider.service:<\/p>\n<p>[Unit]<br \/>\nDescription=SPIRE OIDC Discovery Provider<br \/>\nAfter=network-online.target spire-server.service<br \/>\nWants=network-online.target<\/p>\n<p>[Service]<br \/>\nType=simple<br \/>\nExecStart=\/opt\/spire-extras\/bin\/oidc-discovery-provider -config \/opt\/spire-extras\/conf\/oidc-discovery-provider\/oidc-discovery-provider.conf<br \/>\nRestart=on-failure<br \/>\nRestartSec=5<br \/>\nLimitNOFILE=65536<\/p>\n<p>[Install]<br \/>\nWantedBy=multi-user.target<\/p>\n<h2>Ping Integration<\/h2>\n<h3>PingFederate Integration Note for SPIRE JWT Validation<\/h3>\n<h2>Purpose<\/h2>\n<p>Configure PingFederate to trust and validate JWTs issued from the SPIRE environment.<\/p>\n<h2>SPIRE issuer details<\/h2>\n<p>Use these values:<\/p>\n<ul>\n<li>Issuer: https:\/\/&lt;OIDC_DISCOVERY_DOMAIN&gt;<\/li>\n<li>OIDC discovery URL: https:\/\/&lt;OIDC_DISCOVERY_DOMAIN&gt;\/.well-known\/openid-configuration<\/li>\n<li>JWKS URL: https:\/\/&lt;OIDC_DISCOVERY_DOMAIN&gt;\/keys<\/li>\n<\/ul>\n<h2>Trust model<\/h2>\n<p>PingFederate should validate JWT signatures using the JWKS published by the SPIRE OIDC Discovery Provider.<\/p>\n<p>Ping does not need to call the SPIRE server directly for every token validation. It should use the discovery\/JWKS metadata from the OIDC Discovery Provider.<\/p>\n<h2>Expected JWT characteristics<\/h2>\n<h2>Issuer<\/h2>\n<p>Ping should require:<\/p>\n<p>iss = https:\/\/&lt;OIDC_DISCOVERY_DOMAIN&gt;<\/p>\n<h2>Audience<\/h2>\n<p>Recommended audience value:<\/p>\n<p>&lt;PING_AUDIENCE&gt;<\/p>\n<p>Clients requesting JWT-SVIDs from SPIRE should request them with this audience.<\/p>\n<h2>Subject<\/h2>\n<p>The workload identity will be in:<\/p>\n<p>sub<\/p>\n<p>Example:<\/p>\n<p>spiffe:\/\/&lt;TRUST_DOMAIN&gt;\/workload\/&lt;WORKLOAD_NAME&gt;<\/p>\n<p>This is the primary identity claim Ping should use to identify the calling workload.<\/p>\n<h2>Recommended validation rules in Ping<\/h2>\n<p>Validate:<\/p>\n<ul>\n<li>JWT signature against SPIRE JWKS<\/li>\n<li>iss matches https:\/\/&lt;OIDC_DISCOVERY_DOMAIN&gt;<\/li>\n<li>aud contains &lt;PING_AUDIENCE&gt;<\/li>\n<li>token is within validity window (exp, iat)<\/li>\n<li>sub is an allowed SPIFFE ID or matches allowed policy rules<\/li>\n<\/ul>\n<h2>Example workload identity currently in use<\/h2>\n<p>Current example SPIFFE ID:<\/p>\n<p>spiffe:\/\/&lt;TRUST_DOMAIN&gt;\/workload\/&lt;WORKLOAD_NAME&gt;<\/p>\n<h2>Client-side JWT retrieval model<\/h2>\n<p>A workload on the SPIRE Agent host should obtain its JWT from the local SPIRE agent, not from the SPIRE server directly.<\/p>\n<p>Local agent socket:<\/p>\n<p>&lt;AGENT_SOCKET_PATH&gt;<\/p>\n<h2>Example operational flow<\/h2>\n<ol>\n<li>Workload on the SPIRE Agent host requests a JWT-SVID from the local SPIRE agent.<\/li>\n<li>JWT-SVID is issued with:<\/li>\n<\/ol>\n<ul>\n<li>issuer = https:\/\/&lt;OIDC_DISCOVERY_DOMAIN&gt;<\/li>\n<li>audience = &lt;PING_AUDIENCE&gt;<\/li>\n<li>subject = workload SPIFFE ID<\/li>\n<\/ul>\n<ol>\n<li>Workload presents JWT to PingFederate.<\/li>\n<li>PingFederate validates the JWT using SPIRE OIDC discovery\/JWKS.<\/li>\n<li>PingFederate maps the SPIFFE workload identity to access policy, token issuance, or downstream application authorization.<\/li>\n<\/ol>\n<h2>Suggested placeholder legend<\/h2>\n<p>| Placeholder | Meaning |<br \/>\n|&#8212;|&#8212;|<\/p>\n<p>| &lt;SPIRE_SERVER_HOST&gt; | SPIRE server hostname |<\/p>\n<p>| &lt;SPIRE_AGENT_HOST&gt; | SPIRE agent hostname |<\/p>\n<p>| &lt;TRUST_DOMAIN&gt; | SPIRE trust domain |<\/p>\n<p>| &lt;SERVER_PORT&gt; | SPIRE server listener port |<\/p>\n<p>| &lt;HEALTH_PORT&gt; | Health check port |<\/p>\n<p>| &lt;AGENT_SOCKET_PATH&gt; | Local SPIRE Agent workload API socket |<\/p>\n<p>| &lt;AGENT_HASH&gt; | x509pop parent\/agent hash |<\/p>\n<p>| &lt;WORKLOAD_NAME&gt; | Example X.509 workload name |<\/p>\n<p>| &lt;JWT_WORKLOAD_NAME&gt; | Example JWT workload name |<\/p>\n<p>| &lt;JWT_AUDIENCE&gt; | JWT audience used by client |<\/p>\n<p>| &lt;PING_AUDIENCE&gt; | Audience PingFederate validates |<\/p>\n<p>| &lt;OIDC_DISCOVERY_DOMAIN&gt; | Public\/abstracted OIDC issuer hostname |<\/p>\n<p>| &lt;SPIRE_SERVER_API_SOCKET&gt; | SPIRE server private API socket |<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Overview This setup deploys SPIRE as follows: SPIRE Server on &lt;SPIRE_SERVER_HOST&gt; SPIRE Agent on &lt;SPIRE_AGENT_HOST&gt; Trust domain: &lt;TRUST_DOMAIN&gt; Server\/agent communication port: &lt;SERVER_PORT&gt;\/tcp How it works SPIRE provides machine and workload identity. The SPIRE Server on &lt;SPIRE_SERVER_HOST&gt; is the trust authority for the trust domain &lt;TRUST_DOMAIN&gt;. The SPIRE Agent on &lt;SPIRE_AGENT_HOST&gt; attests to the server using &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2114],"tags":[2118,2216],"class_list":["post-12445","post","type-post","status-publish","format-standard","hentry","category-pingfederate","tag-pingfederate","tag-spire"],"_links":{"self":[{"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/posts\/12445","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12445"}],"version-history":[{"count":1,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/posts\/12445\/revisions"}],"predecessor-version":[{"id":12446,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=\/wp\/v2\/posts\/12445\/revisions\/12446"}],"wp:attachment":[{"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12445"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12445"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rushworth.us\/lisa\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}