{"id":689,"date":"2018-11-02T14:17:04","date_gmt":"2018-11-02T13:17:04","guid":{"rendered":"https:\/\/www.bastelbude.eu\/?p=689"},"modified":"2018-11-02T16:19:02","modified_gmt":"2018-11-02T15:19:02","slug":"eigenen-ocsp-server-erstellen-mit-openssl","status":"publish","type":"post","link":"https:\/\/www.bastelbude.eu\/index.php\/eigenen-ocsp-server-erstellen-mit-openssl\/","title":{"rendered":"Eigenen OCSP-Server erstellen mit OpenSSL"},"content":{"rendered":"<p><strong>Erkl\u00e4rung<\/strong><\/p>\n<p>Ein OCSP-Server liefert bei verschl\u00fcsselten Verbindung dem aufrufenden Client eine Best\u00e4tigung ob das Zertifikat g\u00fcltig ist. Wenn eine CA Zertifikate ausstellt kann sie \u00fcber diesen Dienst dem Client mitteilen ob das Zertifikat noch g\u00fcltig ist, wenn dieser eine verschl\u00fcsselte Webseite aufruft. Diese Variante ist eine Art der &#8222;Certificate-Transparency&#8220;. Der Vorg\u00e4nger davon war die CRL-Liste. Hier wurde im Zertifikat ein HTTP-Pfad angegeben wo man diese Datei runterladen kann. Im OCSP-System ist die Aushandlung der \u00dcberpr\u00fcfung<br \/>\n\u00fcber ein &#8222;Nonce&#8220; vorgesehen. Beide Systeme stehen meistens in einem Zertifikat:<\/p>\n<p><strong>Eintrag der CRL-Sperrliste<\/strong><\/p>\n<p>Diesen Eintrag findet man unter &#8222;CRL-Verteilungspunkte&#8220; oder &#8222;Zertifizierungsstellen-Informations-Zugriff&#8220;<\/p>\n<p><code>URI: http:\/\/crl.example.io\/123.crl<\/code><\/p>\n<p><strong>Eintrag des OCSP-Server<\/strong><\/p>\n<p>Diesen Eintrag findet man unter &#8222;Zertifizierungsstelen-Informations-Zugriff&#8220;<\/p>\n<p><code>OCSP: URI: http:\/\/ocsp.example.io\/123<\/code><\/p>\n<p><strong>Ablauf der Abfrage<\/strong><\/p>\n<p>Der Client ruft eine Webseite per HTTPS auf. Die Gegenseite (Server) schickt dann sein \u00f6ffentliches Zertifikat mit den oben genannten Angaben f\u00fcr den Eintrag des OCSP-Server und der CRL-Sperrliste. Bei diesen Drittadressen fragt der Client dann nach ob das Zertifikat g\u00fcltig ist oder widerrufen wurde. Wurde es wieder widerrufen, dann verweigert der Client<br \/>\nden Seitenaufbau. Der Nachteil dieser Methode ist die Anfrage bei der Drittinstanz. Es gibt zwar eine Zeitregel in dem Protokoll, aber die Drittinstanz wei\u00df \u00fcber den Aufruf der Webseite bescheid. daf\u00fcr gibt es f\u00fcr den Serverbetreiber die Funktion OCSP-Stapling. Mit dieser Variante fragt der Server der<br \/>\nWebseite die G\u00fcltigkeit ab und meldet sie an den Client mit. Dadurch ist dieser wieder anonym.<\/p>\n<p><strong>Der Crux bei Microsoft<\/strong><\/p>\n<p>Microsoft unterst\u00fctzt laut seinen Angaben sowohl OCSP als auch CRL. Allerdings gibt es hier einen Bug. Nutzt man als OCSP Server OpenSSL, dann wird die Aushandlung per Nonce gemacht oder als Fallback eine Art CRL \u00fcber OCSP. OpenSSL liefert aber in der CRL-Liste \u00fcber OCSP nur ein expired Datum und kein Startdatum, dadurch gibt Windows in allen Versionen die Behauptung zur\u00fcck, dass Zertifikat ist abgelaufen. Nur unter Windows-Server gibt es als Opt-IN die Funktion eine Nonce zu nutzen. Im Technet wird sich dazu wie folgt ge\u00e4u\u00dfert:<\/p>\n<p>I believe you might misunderstand how Microsoft OCSP (and OCSP in general) works. Microsoft OCSP Responder is a server service that reads a CA&#8217;s CRL.<br \/>\nIt uses this information as the authoritative source of revocation details for the CA. When a client queries the server (which is called the responder)<br \/>\nit provides an OCSP response to the client. If the OCSP Server\/Responder can&#8217;t access the CRL, it can&#8217;t provide any revocation details to the client properly.<br \/>\nSo in your case, your responder only has old\/expired CRL information available to it. You will need to make sure your OCSP Responder can access the CRL.<\/p>\n<p>If you are using a third party OCSP, you&#8217;d have to look into its configuration and details. One thing that could be going, just as a speculation, is your OCSP<br \/>\nResponder using NONCE for it&#8217;s responses? If so, Windows clients do not suppose NONCE.<\/p>\n<p>Den kompletten Thread findet man unter folgender <a href=\"https:\/\/social.technet.microsoft.com\/Forums\/en-US\/abca5de5-d741-45aa-a61c-3e39a8d8b5ca\/certutil-ocsp-issues-expired-quotocspquot-time-0?forum=winserversecurity\">Quelle<\/a>.<\/p>\n<p>Leider entzieht sich mir die Sinnhaftigkeit dieser Aussage. Warum nutzt man nicht einfach den Modus der Nonce wie jeder Browser oder Andere bei OCSP? Der Vorteil w\u00e4re auch ein massiver Geschwindigkeitsgewinn mit OCSP-Stapling, da wir nicht immer eine Datei runterladen m\u00fcssen. Witzigerweise kann Windows Server selber einen OCSP Server erstellen und der IIS OCSP Stapling. Nur die Clientversionen haben diesen Bug, was meines Erachtens keinen Sinn macht.<\/p>\n<p><strong>Einrichtung eines OCSP Servers mit OpenSSL<\/strong><\/p>\n<p>Mit OpenSSL kann man seine eigene CA bauen und einen OCSP Server betreiben. Grundkenntnisse in der Verwendung von OpenSSL sind hier hilfreich.<\/p>\n<p><strong>Root CA erstellen<\/strong><\/p>\n<p>Wir erstellen uns als erstes eine Root-CA. Als erstes brauchen wir einen Privatekey:<\/p>\n<p><code>openssl genrsa -aes256 -out ca-key.pem 4096<\/code><\/p>\n<p>und setzen darauf das Zertifikat auf mit:<\/p>\n<p><code>openssl req -x509 -new -nodes -extensions v3_ca -key ca-key.pem -days 1460 -out ca-root.pem -sha384<\/code><\/p>\n<p>Beim Request werden Standardfragen gestellt f\u00fcr zus\u00e4tzliche Informationen. Im Feld &#8222;Common Name (e.g. server FQDN or YOUR name)&#8220; tr\u00e4gt man den Name seiner CA. Anders als bei den Clientzertifikaten ist hier keine Domain notwendig.<br \/>\nNun hat man seine Root CA.<\/p>\n<p><strong>Zertifikate f\u00fcr OCSP Server erstellen<\/strong><\/p>\n<p>Da der OCSP Server eine eigenes Zertifikat braucht, muss man hier den Vorgang noch mal wiederholen mit der \u00c4nderung, dass dieses Zertifikat verifiziert wird.<\/p>\n<p>Wir f\u00fchren in der Konfig von OpenSSL eine Erweiterung durch <code>etc\/ssl\/openss.cnf<\/code>. Es wird der neue Bereich:<\/p>\n<p><code>[ v3_OCSP ]<br \/>\n#basicContraints = CA:FALSE<br \/>\n#keyusage = nonRepudiation, digitalSignature, keyEncipherment<br \/>\nextendedKeyUsage = OCSPSigning<\/code><\/p>\n<p>und erg\u00e4nzt unter dem Punkt <code>[usr_cert]<\/code><\/p>\n<p><code>authorityInfoAccess = OCSP;URI:http:\/\/ocsp.example.io<\/code><\/p>\n<p>Die beiden Punkte mit der # m\u00fcssen im Bereich <code>usr_cert<\/code> aktiviert werden f\u00fcr die Erstellung der Zertifikate, da sonst eine Doppelnennung bem\u00e4ngelt wird.<\/p>\n<p>Leider haben bei mir diese Erg\u00e4nzungen nicht gewirkt, da die Konfig teilweise von <code>usr\/lib\/openssl<\/code> geladen wird, was aber nur ein Symlink ist auf die OpenSSL-Konfig. Also habe ich mir eine zweite Konfig f\u00fcr das OCSP-Serverzertifikat gebaut <code>ocsp.cnf<\/code> mit dem Inhalt:<\/p>\n<p><code># Subdomains<br \/>\nsubjectAltName=DNS:ocsp.example.io,DNS:testsystem.example.io<br \/>\n# OCSP Server<br \/>\nbasicConstraints = CA:FALSE<br \/>\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment<br \/>\nextendedKeyUsage = OCSPSigning<br \/>\nauthorityInfoAccess = OCSP;URI:http:\/\/ocsp.example.io<br \/>\nsubjectKeyIdentifier=hash<br \/>\nauthorityKeyIdentifier=keyid,issuer<\/code><\/p>\n<p>Nun erstellen wir wieder einen privaten Schl\u00fcssel mit:<br \/>\n<code><br \/>\nopenssl genrsa -aes256 -out ocsp.key 4096<\/code><\/p>\n<p>und erstellen eine CSR-Anfrage mit:<\/p>\n<p><code>openssl req -sha384 -new -out ocsp.csr -key ocsp.key -extensions v3_OCSP<\/code><\/p>\n<p>Jetzt wird das Zertifikat gegen die Root signiert:<\/p>\n<p><code>openssl x509 -sha384 -req -in ocsp.csr -CA ca-root.pem -CAkey ca-key.pem -CAcreateserial -out ocsp.crt -days 1024 -sha384 -extfile ocsp.cnf -ocspid -ocsp_uri<\/code><br \/>\n<strong><br \/>\nErstellung eines Client-Zertifikat<\/strong><\/p>\n<p>Nun k\u00f6nnen wir Zertifikate ausstellen f\u00fcr einen Client. Wir erzeugen wieder einen Private Key:<\/p>\n<p><code>openssl genrsa -aes256 -out client.key 4096<\/code><\/p>\n<p>und erstellen die CSR wieder:<\/p>\n<p><code>openssl req -sha384 -new -out client.csr -key client.key<\/code><\/p>\n<p>Jetzt brauchen wir eine weitere Konfig. Wir legen eine Datei mit an <code>daten.cnf<\/code> und geben der folgenden Inhalt:<\/p>\n<p><code><br \/>\n# G\u00fcltigkeit eines Zertfikats f\u00fcr mehrere Subdomains<br \/>\nsubjectAltName=DNS:test.example.io<br \/>\n# OCSP Server<br \/>\nbasicConstraints = CA:FALSE<br \/>\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment<br \/>\nauthorityInfoAccess = OCSP;URI:http:\/\/ocsp.example.io<br \/>\nsubjectKeyIdentifier=hash<br \/>\nauthorityKeyIdentifier=keyid,issuer<br \/>\n# Weitere Einschr nkung der Nutzbarkeit des zu erstellenden Zertfikats<br \/>\nextendedKeyUsage=serverAuth,clientAuth<\/code><\/p>\n<p>Jetzt wird wieder das Zertifikat signiert:<\/p>\n<p><code>openssl x509 -sha384 -req -in client.csr -CA ca-root.pem -CAkey ca-key.pem -CAcreateserial -out client.crt -days 1024 -sha384 -extfile daten.cnf -ocspid -ocsp_uri<\/code><\/p>\n<p><strong>Datenbank des OCSP Server erstellen<\/strong><\/p>\n<p>Damit der OCSP Server gestartet werden kann, m\u00fcssen wir eine Datenbank erstellen f\u00fcr diesen. Wichtig ist erstmal die Einrichtung der Pfade, da wir dies am Anfang noch nicht gemacht haben, sonst gibt es Fehlermeldungen:<\/p>\n<p>In der Datei <code>openssl.cnf<\/code> ist dies die Rubrik:<\/p>\n<p><code>[ CA_default ]<\/p>\n<p>dir = .\/ # Where everything is kept<br \/>\ncerts = $dir\/certs # Where the issued certs are kept<br \/>\ncrl_dir = $dir\/crl # Where the issued crl are kept<br \/>\ndatabase = $dir\/index.txt # database index file.<br \/>\n#unique_subject = no # Set to 'no' to allow creation of<br \/>\n# several certs with same subject.<br \/>\nnew_certs_dir = $dir\/newcerts # default place for new certs.<\/p>\n<p>certificate = $dir\/cacert.pem # The CA certificate<br \/>\nserial = $dir\/serial # The current serial number<br \/>\ncrlnumber = $dir\/crlnumber # the current crl number<br \/>\n# must be commented out to leave a V1 CRL<br \/>\ncrl = $dir\/crl.pem # The current CRL<br \/>\nprivate_key = $dir\/private\/cakey.pem# The private key<br \/>\nRANDFILE = $dir\/private\/.rand # private random number file<\/code><\/p>\n<p>und erstellen 2 Dateien mit den Namen <code>touch index.txt<\/code> und <code>touch index.txt.attr<\/code>. Die letztere bekommt den Inhalt:<\/p>\n<p><code>unique_subject = yes<\/code><\/p>\n<p>Normalerweise erstellt OpenSSL beim ersten Mal diese Dateien selber. Manchmal m\u00fcssen sie aber schon da sein und werden dann erneuert.<\/p>\n<p>Wir tragen nun unsere Zertifikate ein mit:<\/p>\n<p><code>openssl ca -valid \/etc\/ssl\/private\/client.crt<br \/>\nopenssl ca -valid \/etc\/ssl\/private\/ocsp.crt<\/code><\/p>\n<p>Schaut man sich nun die <code>index.txt<\/code> dann stehen dort folgende Daten:<\/p>\n<p><code>V 210822092405Z D3A7DB29FCF2DAF7 unknown \/C=AU\/ST=Test\/L=es\/O=s\/OU=s\/CN=ocsp.example.io<br \/>\nV 210822093129Z D3A7DB29FCF2DAF8 unknown \/C=AU\/ST=Some-State\/O=Internet Widgits Pty Ltd\/CN=test.example.io<\/code><\/p>\n<p>&#8211; Das V gibt steht Status, f\u00fcr valid. Ist dort ein R, dann wurde das Zertifikat zur\u00fcckgezogen<br \/>\n&#8211; Die Reihenfolge &#8222;210822093129Z&#8220; ist das Ablaufdatum der G\u00fcltigkeit eines Zertifikates. Es wird R\u00fcckw\u00e4rts gelesen. 2021.08.22 um 9:31:29 Zuluzeit l\u00e4uft das Zertifikat ab (GMT+0)<br \/>\n&#8211; Die hexadezimale Zahlenfolge ist die Seriennummer des Zertifikates fortlaufend hier &#8222;D3A7DB29FCF2DAF7&#8220;<\/p>\n<p>Gegebenfalls noch mal ein Update der Datenbank mit <code>openssl ca -updatedb<\/code><\/p>\n<p><strong>OCSP Server starten<\/strong><\/p>\n<p>Nun starten wir den OCSP-Server mit<\/p>\n<p><code>openssl ocsp -index \/etc\/ssl\/index.txt -port 80 -rsigner \/etc\/ssl\/private\/ocsp.crt -rkey \/etc\/ssl\/private\/ocsp.key -CA \/etc\/ssl\/cacert.pem -text -out log.txt<\/code><\/p>\n<p>Die Ausgabe am Ende legt ein Log-Datei an, wo man die Anfragen sieht. Im produktiven Betrieb nicht unbedingt notwendig. Wir nehmen Port 80, da wir in der URI keinen speziellen Port angegeben haben. Beim Start wird das Passwort f\u00fcr den<br \/>\nKey abgefragt vom OCSP Zertifikat! Man sollte auch den Server nicht als Root laufen lassen. Am besten ist ein eigener Nutzer \u00fcber eine Screeninstanz.<\/p>\n<p><strong>Pr\u00fcfung der Funktion<\/strong><\/p>\n<p>Um die Funktion zu \u00fcberpr\u00fcfen \u00f6ffnen wir eine zweite Instanz und schauen als erstes unser Zertifikat an mit:<\/p>\n<p><code>openssl x509 -text -in client.crt<\/code><\/p>\n<p>Hier muss folgendes drinne stehen:<\/p>\n<p><code>X509v3 extensions:<br \/>\nX509v3 Subject Alternative Name:<br \/>\nDNS:test.example.io<br \/>\nX509v3 Basic Constraints:<br \/>\nCA:FALSE<br \/>\nX509v3 Key Usage:<br \/>\nDigital Signature, Non Repudiation, Key Encipherment<br \/>\nAuthority Information Access:<br \/>\nOCSP - URI:http:\/\/ocsp.example.io<\/p>\n<p>X509v3 Subject Key Identifier:<br \/>\n75:36:F9:AF:02:18:E5:62:5F:1F:08:C3:FF:5B:D3:F3:05:08:34:F6<br \/>\nX509v3 Authority Key Identifier:<br \/>\nkeyid:21:8B:BA:1C:23:EB:28:B2:74:EC:81:9E:83:3E:18:89:20:AB:3D:8 7<\/p>\n<p>X509v3 Extended Key Usage:<br \/>\nTLS Web Server Authentication, TLS Web Client Authentication<\/code><\/p>\n<p>Man sieht hier sauber die Adresse des OCSP-Server.<\/p>\n<p>Nun pr\u00fcfen wir gegen den OCSP-Server. Da wir kein DNS haben, pr\u00fcfen wir gegen 127.0.0.1 folgenderma\u00dfen:<\/p>\n<p><code>openssl ocsp -CAfile \/etc\/ssl\/cacert.pem -issuer \/etc\/ssl\/cacert.pem -cert \/etc\/ssl\/private\/client.crt -url http:\/\/127.0.0.1 -resp_text<\/code><\/p>\n<p>hier sind folgende Angaben wichtig am Ende:<\/p>\n<p><code>Response verify OK<br \/>\n\/etc\/ssl\/private\/client.crt: good<br \/>\nThis Update: Nov 2 11:56:19 2018 GMT<\/code><\/p>\n<p>Dies teilt dem Client die G\u00fcltigkeit mit und wann ein Update gemacht wurde, also die Anfrage der G\u00fcltigkeit. Unser Zertifikat ist sauber. Die sieht man an der Angabe <code>\/etc\/ssl\/private\/client.crt: good<\/code><\/p>\n<p><strong>Zertifikat \u00fcber einen OCSP-Server zur\u00fcckziehen<\/strong><\/p>\n<p>Um ein Zertifikat zur\u00fcckzuziehen, muss man die Serverinstanz stoppen und folgendes eingegeben:<\/p>\n<p><code>openssl ca -revoke \/etc\/ssl\/private\/client.crt<\/code><\/p>\n<p>Gegebenfalls noch mal ein Update der Datenbank mit <code>openssl ca -updatedb<\/code>. Fragt man nun die <code>index.txt<\/code> ab, dann steht dort folgendes:<\/p>\n<p><code>R 210822093129Z 181102120445Z D3A7DB29FCF2DAF8<\/code><\/p>\n<p>Man sieht die Zeit des R\u00fcckruf noch dazu nun. Wir starten den OCSP-Server wieder mit:<\/p>\n<p><code>openssl ocsp -index \/etc\/ssl\/index.txt -port 80 -rsigner \/etc\/ssl\/private\/ocsp.crt -rkey \/etc\/ssl\/private\/ocsp.key -CA \/etc\/ssl\/cacert.pem -text -out log.txt<\/code><\/p>\n<p>und fragen das Zertifikat ab:<\/p>\n<p><code>openssl ocsp -CAfile \/etc\/ssl\/cacert.pem -issuer \/etc\/ssl\/cacert.pem -cert \/etc\/ssl\/private\/client.crt -url http:\/\/127.0.0.1 -resp_text<\/code><\/p>\n<p>Wir erhalten folgende Angabe am Ende der Abfrage:<\/p>\n<p><code>Response verify OK<br \/>\n\/etc\/ssl\/private\/client.crt: revoked<br \/>\nThis Update: Nov 2 12:09:15 2018 GMT<br \/>\nRevocation Time: Nov 2 12:04:45 2018 GMT<\/code><\/p>\n<p>Das Zertifikat wurde widerrufen siehe <code>\/etc\/ssl\/private\/client.crt: revoked<\/code>. Auch ist die Angabe vorhanden wann. Man kann ein zur\u00fcckgerufenes Zertifikat nicht wieder aktivieren, da die Seriennummer eindeutig sein muss. Es muss dann ein neues erstellt werden.<\/p>\n<p><strong>Fehler bei der Einrichtung<\/strong><\/p>\n<p>Sollten beim Ausf\u00fchren der Befehle immer wieder Fehler auftauchen wie:<\/p>\n<p><code>Can't open .\/\/cacert.pem for reading, No such file or directory<br \/>\n140183270937856:error:02001002:system library:fopen:No such file or directory:..\/crypto\/bio\/bss_file.c:74:fopen('.\/\/cacert.pem','r')<br \/>\n140183270937856:error:2006D080:BIO routines:BIO_new_file:no such file:..\/crypto\/bio\/bss_file.c:81:<\/code><\/p>\n<p>stimmen die Pfadangaben nicht der Dateien. Gegebenfalls die Konfig anpassen f\u00fcr OpenSSL.<\/p>\n<p>Der Fehler:<\/p>\n<p><code>Error Loading extension section v3_OCSP<br \/>\n140186064438528:error:22097082:X509 V3 routines:do_ext_nconf:unknown extension name:..\/crypto\/x509v3\/v3_conf.c:78:<br \/>\n140186064438528:error:22098080:X509 V3 routines:X509V3_EXT_nconf:error in extension:..\/crypto\/x509v3\/v3_conf.c:47:name=basicContraints, value=CA:FALSE<\/code><\/p>\n<p>Meldet das Vorhandensein von doppelten Argumenten in der OpenSSL durch das Laden der Erweiterung. Die hier genannten Argumente stehen schon im Bereich <code>[ usr_cert ]<\/code>.<\/p>\n<p><strong>Zusatz<\/strong><\/p>\n<p>Die Anleitung wurde in einer Testumgebung erstellt und ist so nicht f\u00fcr den produktiven Betrieb geeignet! M\u00f6chte man diese im produktiven Betrieb nutzen, sollten Vorkehrungen getroffen zum Schutz der privaten Schl\u00fcssel und nat\u00fcrlich der CA.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Erkl\u00e4rung Ein OCSP-Server liefert bei verschl\u00fcsselten Verbindung dem aufrufenden Client eine Best\u00e4tigung ob das Zertifikat g\u00fcltig ist. Wenn eine CA Zertifikate ausstellt kann sie \u00fcber diesen Dienst dem Client mitteilen ob das Zertifikat noch g\u00fcltig ist, wenn dieser eine verschl\u00fcsselte Webseite aufruft. Diese Variante ist eine Art der &#8222;Certificate-Transparency&#8220;. Der\u2026 <a class=\"continue-reading-link\" href=\"https:\/\/www.bastelbude.eu\/index.php\/eigenen-ocsp-server-erstellen-mit-openssl\/\">Continue reading<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[47,46],"tags":[49,48],"class_list":["post-689","post","type-post","status-publish","format-standard","hentry","category-openssl","category-sicherheit","tag-ocsp","tag-openssl"],"_links":{"self":[{"href":"https:\/\/www.bastelbude.eu\/index.php\/wp-json\/wp\/v2\/posts\/689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bastelbude.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bastelbude.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bastelbude.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bastelbude.eu\/index.php\/wp-json\/wp\/v2\/comments?post=689"}],"version-history":[{"count":6,"href":"https:\/\/www.bastelbude.eu\/index.php\/wp-json\/wp\/v2\/posts\/689\/revisions"}],"predecessor-version":[{"id":695,"href":"https:\/\/www.bastelbude.eu\/index.php\/wp-json\/wp\/v2\/posts\/689\/revisions\/695"}],"wp:attachment":[{"href":"https:\/\/www.bastelbude.eu\/index.php\/wp-json\/wp\/v2\/media?parent=689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bastelbude.eu\/index.php\/wp-json\/wp\/v2\/categories?post=689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bastelbude.eu\/index.php\/wp-json\/wp\/v2\/tags?post=689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}