I'm trying to use public/private keys instead of a shared secret for client secrets with IdentityServer4. This approach is documented here.
If it was a shared secret, the request would contain the secret
in plain text. e.g.
curl -X POST \
http://<identityserver>/connect/token \
-F client_id=abc \
-F client_secret=secret \
-F grant_type=client_credentials \
-F scope=api1 api2
My question is: What should be passed in as the secret
with the public/private key authentication method?
To give some background, a Client using public/key authentication will register with IdentityServer with the following steps
Client generates a
.crt
file e.g.// create key $ openssl genrsa -des3 -passout pass:x -out client.pass.key 2048 $ openssl rsa -passin pass:x -in client.pass.key -out client.key // create certificate request (csr) $ openssl req -new -key client.key -out client.csr // create certificate (crt) $ openssl x509 -req -sha256 -days 365 -in client.csr -signkey client.key -out client.crt // export pfx file from key and crt $ openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt
Client will share the
client.crt
file with the IdentityServerIdentityServer will register the Client by
var client = new Client { ClientId = "abc", ClientSecrets = { new Secret { Type = IdentityServerConstants.SecretTypes.X509CertificateBase64, Value = "MIIDF...." <================= contents of the crt file } }, AllowedGrantTypes = GrantTypes.ClientCredentials, AllowedScopes = { "api1", "api2" } };
server.crt
file. Is it a typo or is it a distinct file? And which is the crt file used as client secret (I guessclient.crt
)? – Unkindly