4.3. Multiple Signatures (Mehrere Signaturen)
4.3. Multiple Signatures (Mehrere Signaturen)
Mehrere unterscheidbare Signaturen KÖNNEN in einer Nachricht enthalten sein. Jede MUSS ein eindeutiges Label haben. Sie können alle vom selben Signierenden stammen oder von mehreren. Beispielsweise kann ein Signierende dieselben Nachrichtenkomponenten mit verschiedenen Schlüsseln oder Algorithmen signieren, um Verifizierende mit unterschiedlichen Fähigkeiten zu unterstützen, oder ein Reverse-Proxy kann beim Weiterleiten Felder mit Informationen über den Client ergänzen, einschließlich einer Signatur über die ursprünglichen Signaturwerte des Clients.
Das folgende nicht normative Beispiel beginnt mit einer vom Client signierten Anfrage. Ein Reverse-Proxy nimmt die Anfrage entgegen und validiert die Signatur des Clients:
POST /foo?param=Value&Pet=dog HTTP/1.1
Host: example.com
Date: Tue, 20 Apr 2021 02:07:55 GMT
Content-Type: application/json
Content-Length: 18
Content-Digest: sha-512=:WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+T\
aPm+AbwAgBWnrIiYllu7BNNyealdVLvRwEmTHWXvJwew==:
Signature-Input: sig1=("@method" "@authority" "@path" \
"content-digest" "content-type" "content-length")\
;created=1618884475;keyid="test-key-ecc-p256"
Signature: sig1=:X5spyd6CFnAG5QnDyHfqoSNICd+BUP4LYMz2Q0JXlb//4Ijpzp\
+kve2w4NIyqeAuM7jTDX+sNalzA8ESSaHD3A==:
{"hello": "world"}
Der Proxy ändert die Nachricht vor der Weiterleitung zum Ursprungsserver: Ziel-Host und das Header-Feld Forwarded gemäß [RFC7239]:
POST /foo?param=Value&Pet=dog HTTP/1.1
Host: origin.host.internal.example
Date: Tue, 20 Apr 2021 02:07:56 GMT
Content-Type: application/json
Content-Length: 18
Forwarded: for=192.0.2.123;host=example.com;proto=https
Content-Digest: sha-512=:WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+T\
aPm+AbwAgBWnrIiYllu7BNNyealdVLvRwEmTHWXvJwew==:
Signature-Input: sig1=("@method" "@authority" "@path" \
"content-digest" "content-type" "content-length")\
;created=1618884475;keyid="test-key-ecc-p256"
Signature: sig1=:X5spyd6CFnAG5QnDyHfqoSNICd+BUP4LYMz2Q0JXlb//4Ijpzp\
+kve2w4NIyqeAuM7jTDX+sNalzA8ESSaHD3A==:
{"hello": "world"}
Der Proxy kann die eingehende Signatur des Clients prüfen und dem Ursprungsserver durch eine eigene Signatur über die neue Nachricht eine Aussage über die weitergeleitete Anfrage machen. Er schließt relevante Elemente der Originalnachricht ein. Oft deckt der Proxy dieselben Komponenten ab wie der Client; hier signiert der Proxy den neuen Authority-Wert und nimmt Forwarded in seine Signaturbasis auf. Er identifiziert eigenes Schlüsselmaterial und Algorithmus und setzt in diesem Beispiel expires, um nachgelagerten Systemen ein kurzes Gültigkeitsfenster anzuzeigen. Die Signaturbasis lautet:
"@method": POST
"@authority": origin.host.internal.example
"@path": /foo
"content-digest": sha-512=:WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX\
+TaPm+AbwAgBWnrIiYllu7BNNyealdVLvRwEmTHWXvJwew==:
"content-type": application/json
"content-length": 18
"forwarded": for=192.0.2.123;host=example.com;proto=https
"@signature-params": ("@method" "@authority" "@path" \
"content-digest" "content-type" "content-length" "forwarded")\
;created=1618884480;keyid="test-key-rsa";alg="rsa-v1_5-sha256"\
;expires=1618884540
Signaturausgabewert:
S6ZzPXSdAMOPjN/6KXfXWNO/f7V6cHm7BXYUh3YD/fRad4BCaRZxP+JH+8XY1I6+8Cy\
+CM5g92iHgxtRPz+MjniOaYmdkDcnL9cCpXJleXsOckpURl49GwiyUpZ10KHgOEe11s\
x3G2gxI8S0jnxQB+Pu68U9vVcasqOWAEObtNKKZd8tSFu7LB5YAv0RAGhB8tmpv7sFn\
Im9y+7X5kXQfi8NMaZaA8i2ZHwpBdg7a6CMfwnnrtflzvZdXAsD3LH2TwevU+/PBPv0\
B6NMNk93wUs/vfJvye+YuI87HU38lZHowtznbLVdp770I6VHR6WfgS9ddzirrswsE1w\
5o0LV/g==
Diese Werte fügt der Proxy der HTTP-Anfrage hinzu. Die Originalsignatur des Clients steht unter dem Label sig1, die des Reverse-Proxys unter proxy_sig. Der Proxy verwendet den Schlüssel test-key-rsa und den Algorithmus rsa-v1_5-sha256; die ursprüngliche Client-Signatur wurde mit test-key-rsa-pss und einem RSA-PSS-Algorithmus erzeugt:
POST /foo?param=Value&Pet=dog HTTP/1.1
Host: origin.host.internal.example
Date: Tue, 20 Apr 2021 02:07:56 GMT
Content-Type: application/json
Content-Length: 18
Forwarded: for=192.0.2.123;host=example.com;proto=https
Content-Digest: sha-512=:WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+T\
aPm+AbwAgBWnrIiYllu7BNNyealdVLvRwEmTHWXvJwew==:
Signature-Input: sig1=("@method" "@authority" "@path" \
"content-digest" "content-type" "content-length")\
;created=1618884475;keyid="test-key-ecc-p256", \
proxy_sig=("@method" "@authority" "@path" "content-digest" \
"content-type" "content-length" "forwarded")\
;created=1618884480;keyid="test-key-rsa";alg="rsa-v1_5-sha256"\
;expires=1618884540
Signature: sig1=:X5spyd6CFnAG5QnDyHfqoSNICd+BUP4LYMz2Q0JXlb//4Ijpzp\
+kve2w4NIyqeAuM7jTDX+sNalzA8ESSaHD3A==:, \
proxy_sig=:S6ZzPXSdAMOPjN/6KXfXWNO/f7V6cHm7BXYUh3YD/fRad4BCaRZxP+\
JH+8XY1I6+8Cy+CM5g92iHgxtRPz+MjniOaYmdkDcnL9cCpXJleXsOckpURl49G\
wiyUpZ10KHgOEe11sx3G2gxI8S0jnxQB+Pu68U9vVcasqOWAEObtNKKZd8tSFu7\
LB5YAv0RAGhB8tmpv7sFnIm9y+7X5kXQfi8NMaZaA8i2ZHwpBdg7a6CMfwnnrtf\
lzvZdXAsD3LH2TwevU+/PBPv0B6NMNk93wUs/vfJvye+YuI87HU38lZHowtznbL\
Vdp770I6VHR6WfgS9ddzirrswsE1w5o0LV/g==:
{"hello": "world"}
Die zusätzliche Aufnahme der Signature- und Signature-Input-Werte des Clients in die abgedeckten Komponenten der neuen Signatur wird aufgrund bekannter Schwächen beim Signieren von Signaturwerten (Abschnitt 7.3.7) NICHT EMPFOHLEN. Der Proxy kann die Client-Signatur validieren; seine Änderungen machen die bestehende Signatur für den Ursprungsserver ungültig. Der Ursprungsserver kann zusätzlichen Signaturkontext haben, um Authority-Änderungen zu berücksichtigen (Abschnitt 7.4.4); das erfordert Konfiguration und Sorgfalt. In anderen Fällen kann der Ursprungsserver die Originalsignatur nicht selbst verifizieren, will aber sicherstellen, dass der Proxy die Client-Signatur geprüft hat. Anwendungen, die erfolgreiche Verarbeitung signalisieren müssen, sollten alternative sichere Mechanismen spezifizieren.