diff --git a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs
index b2b2b178..369cd979 100644
--- a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs
+++ b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs
@@ -2797,6 +2797,15 @@ namespace ServiceLib.Resx {
}
}
+ ///
+ /// 查找类似 Fetch Certificate Chain 的本地化字符串。
+ ///
+ public static string TbFetchCertChain {
+ get {
+ return ResourceManager.GetString("TbFetchCertChain", resourceCulture);
+ }
+ }
+
///
/// 查找类似 Fingerprint 的本地化字符串。
///
diff --git a/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx b/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx
index 21012c12..f6a41e04 100644
--- a/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx
+++ b/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx
@@ -1609,4 +1609,7 @@ Do not use the "Fetch Certificate" button when "Allow Insecure" is enabled.
Fetch Certificate
+
+ Fetch Certificate Chain
+
\ No newline at end of file
diff --git a/v2rayN/ServiceLib/Resx/ResUI.fr.resx b/v2rayN/ServiceLib/Resx/ResUI.fr.resx
index 97e2dc19..a8ec6931 100644
--- a/v2rayN/ServiceLib/Resx/ResUI.fr.resx
+++ b/v2rayN/ServiceLib/Resx/ResUI.fr.resx
@@ -1606,4 +1606,7 @@ Do not use the "Fetch Certificate" button when "Allow Insecure" is enabled.
Fetch Certificate
+
+ Fetch Certificate Chain
+
\ No newline at end of file
diff --git a/v2rayN/ServiceLib/Resx/ResUI.hu.resx b/v2rayN/ServiceLib/Resx/ResUI.hu.resx
index 6b0957b2..677b2f6e 100644
--- a/v2rayN/ServiceLib/Resx/ResUI.hu.resx
+++ b/v2rayN/ServiceLib/Resx/ResUI.hu.resx
@@ -1609,4 +1609,7 @@ Do not use the "Fetch Certificate" button when "Allow Insecure" is enabled.
Fetch Certificate
+
+ Fetch Certificate Chain
+
\ No newline at end of file
diff --git a/v2rayN/ServiceLib/Resx/ResUI.resx b/v2rayN/ServiceLib/Resx/ResUI.resx
index 422a1fd5..337f3dc6 100644
--- a/v2rayN/ServiceLib/Resx/ResUI.resx
+++ b/v2rayN/ServiceLib/Resx/ResUI.resx
@@ -1609,4 +1609,7 @@ Do not use the "Fetch Certificate" button when "Allow Insecure" is enabled.
Fetch Certificate
+
+ Fetch Certificate Chain
+
\ No newline at end of file
diff --git a/v2rayN/ServiceLib/Resx/ResUI.ru.resx b/v2rayN/ServiceLib/Resx/ResUI.ru.resx
index 600f4fcb..550cfca1 100644
--- a/v2rayN/ServiceLib/Resx/ResUI.ru.resx
+++ b/v2rayN/ServiceLib/Resx/ResUI.ru.resx
@@ -1609,4 +1609,7 @@ Do not use the "Fetch Certificate" button when "Allow Insecure" is enabled.
Fetch Certificate
+
+ Fetch Certificate Chain
+
\ No newline at end of file
diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx
index 5581f88a..d9e50057 100644
--- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx
+++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx
@@ -1606,4 +1606,7 @@
获取证书
+
+ 获取证书链
+
\ No newline at end of file
diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx
index d7605d2c..afdc06c2 100644
--- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx
+++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx
@@ -1606,4 +1606,7 @@ Do not use the "Fetch Certificate" button when "Allow Insecure" is enabled.
Fetch Certificate
+
+ Fetch Certificate Chain
+
\ No newline at end of file
diff --git a/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs b/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs
index d42c4db3..ae9d7249 100644
--- a/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs
+++ b/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs
@@ -12,6 +12,7 @@ public class AddServerViewModel : MyReactiveObject
public string Cert { get; set; }
public ReactiveCommand FetchCertCmd { get; }
+ public ReactiveCommand FetchCertChainCmd { get; }
public ReactiveCommand SaveCmd { get; }
public AddServerViewModel(ProfileItem profileItem, Func>? updateView)
@@ -23,6 +24,10 @@ public class AddServerViewModel : MyReactiveObject
{
await FetchCert();
});
+ FetchCertChainCmd = ReactiveCommand.CreateFromTask(async () =>
+ {
+ await FetchCertChain();
+ });
SaveCmd = ReactiveCommand.CreateFromTask(async () =>
{
await SaveServerAsync();
@@ -117,4 +122,24 @@ public class AddServerViewModel : MyReactiveObject
}
Cert = await Utils.GetCertPem(domain, serverName);
}
+
+ private async Task FetchCertChain()
+ {
+ if (SelectedSource.StreamSecurity != Global.StreamSecurity)
+ {
+ return;
+ }
+ var domain = SelectedSource.Address;
+ var serverName = SelectedSource.Sni.IsNullOrEmpty() ? SelectedSource.Address : SelectedSource.Sni;
+ if (!Utils.IsDomain(serverName))
+ {
+ return;
+ }
+ if (SelectedSource.Port > 0)
+ {
+ domain += $":{SelectedSource.Port}";
+ }
+ var certs = await Utils.GetCertChainPem(domain, serverName);
+ Cert = string.Join("\n", certs);
+ }
}
diff --git a/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml b/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml
index f9848f63..721db784 100644
--- a/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml
+++ b/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml
@@ -607,10 +607,10 @@