diff --git a/Pal.Client/.gitignore b/Pal.Client/.gitignore
index 9b1c8b1..e6b5067 100644
--- a/Pal.Client/.gitignore
+++ b/Pal.Client/.gitignore
@@ -1 +1,2 @@
/dist
+/Secrets.cs
diff --git a/Pal.Client/Pal.Client.csproj b/Pal.Client/Pal.Client.csproj
index 623ce5f..8fba640 100644
--- a/Pal.Client/Pal.Client.csproj
+++ b/Pal.Client/Pal.Client.csproj
@@ -3,7 +3,7 @@
net6.0-windows
9.0
- 1.10.0.0
+ 1.11.0.0
enable
@@ -17,8 +17,18 @@
dist
+ none
+ false
+
+
+
+
+
+
+
+
diff --git a/Pal.Client/RemoteApi.cs b/Pal.Client/RemoteApi.cs
index 3082fa1..a0f4614 100644
--- a/Pal.Client/RemoteApi.cs
+++ b/Pal.Client/RemoteApi.cs
@@ -1,13 +1,14 @@
using Account;
using Grpc.Core;
-using Grpc.Core.Interceptors;
using Grpc.Net.Client;
using Palace;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
+using System.Net.Security;
using System.Numerics;
+using System.Security.Cryptography.X509Certificates;
using System.Threading;
using System.Threading.Tasks;
@@ -39,6 +40,7 @@ namespace Pal.Client
HttpHandler = new SocketsHttpHandler
{
ConnectTimeout = TimeSpan.FromSeconds(5),
+ SslOptions = GetSslClientAuthenticationOptions(),
}
});
await _channel.ConnectAsync(cancellationToken);
@@ -159,6 +161,36 @@ namespace Pal.Client
{ "User-Agent", UserAgent },
};
+ private SslClientAuthenticationOptions? GetSslClientAuthenticationOptions()
+ {
+#if !DEBUG
+ var secrets = typeof(RemoteApi).Assembly.GetType("Pal.Client.Secrets");
+ if (secrets == null)
+ return null;
+
+ var pass = secrets.GetProperty("CertPassword")?.GetValue(null) as string;
+ if (pass == null)
+ return null;
+
+ var manifestResourceStream = typeof(RemoteApi).Assembly.GetManifestResourceStream("Pal.Client.Certificate.pfx");
+ if (manifestResourceStream == null)
+ return null;
+
+ var bytes = new byte[manifestResourceStream.Length];
+ manifestResourceStream.Read(bytes, 0, bytes.Length);
+
+ return new SslClientAuthenticationOptions
+ {
+ ClientCertificates = new X509CertificateCollection()
+ {
+ new X509Certificate2(bytes, pass, X509KeyStorageFlags.DefaultKeySet),
+ },
+ };
+#else
+ return null;
+#endif
+ }
+
public void Dispose()
{
_channel?.Dispose();