WCF の代替として ServiceStack の使用を検討しています。私の要件の 1 つは、サーバーとクライアントが証明書を使用して相互に認証する必要があることです。クライアントはサービスであるため、ユーザー入力を伴う認証は使用できません。また、クライアントは mono を使用して Linux で実行できる必要があるため、Windows 認証は無効になります。
netsh.exe を使用してサーバー証明書をサーバーのポートにバインドし、クライアントがサーバー証明書を取得しており、wireshark を使用してデータが暗号化されていることを確認しました。ただし、クライアント証明書を要求するようにサーバーを構成する方法を理解することはできません。
一部の人々は、クライアント証明書を検証するために要求フィルターを使用することを提案しましたが、すべての要求がクライアント証明書をチェックするため、非常に非効率的です。パフォーマンスは非常に高い優先度です。カスタム IAuthProvider を作成することは有望に思えますが、すべてのドキュメントと例は、証明書ではなく、ある時点でのユーザー操作を伴う認証タイプを対象としています。
https://github.com/ServiceStack/ServiceStack/wiki/Authentication-and-authorization
証明書を使用して、セルフホステッド ServiceStack サービスでクライアントとサーバーを相互に認証することはできますか?
これが参考のための私のテストサービスです。
public class Host : AppHostHttpListenerBase
{
public Host()
: base("Self-hosted thing", typeof(PutValueService).Assembly)
{
//TODO - add custom IAuthProvider to validate the client certificate?
this.RequestFilters.Add(ValidateRequest);
//add protobuf plugin
//https://github.com/ServiceStack/ServiceStack/wiki/Protobuf-format
Plugins.Add(new ProtoBufFormat());
//register protobuf
base.ContentTypeFilters.Register(ContentType.ProtoBuf,
(reqCtx, res, stream) => ProtoBuf.Serializer.NonGeneric.Serialize(stream, res),
ProtoBuf.Serializer.NonGeneric.Deserialize);
}
public override void Configure(Funq.Container container)
{}
void ValidateRequest(IHttpRequest request, IHttpResponse response, object dto)
{
//TODO - get client certificate?
}
}
[DataContract]
[Route("/putvalue", "POST")]
//dto
public class PutValueMessage : IReturnVoid
{
[DataMember(Order=1)]
public string StreamID { get; set; }
[DataMember(Order=2)]
public byte[] Data { get; set; }
}
//service
public class PutValueService : Service
{
public void Any(PutValueMessage request)
{
//Comment out for performance testing
Console.WriteLine(DateTime.Now);
Console.WriteLine(request.StreamID);
Console.WriteLine(Encoding.UTF8.GetString(request.Data));
}
}