javascript - 如何获取Web浏览器的公钥(用于HTTPS)

标签 javascript c# asp.net asp.net-web-api

我正在开发一个程序,围绕浏览器对值进行数字签名。

计划是使用浏览器内置的 HTTPS 证书进行签名,但整个方法取决于能否访问浏览器的 HTTPS 证书的公钥。

如何在 Javascript 或 ASP.NET 服务代码中访问它?

我在 Google 上一无所获(我能找到的最好的办法是允许通过自定义证书进行通信,但不允许浏览器用于 HTTPS 的证书)。

最佳答案

通常我们使用 .crt 文件中存在的公钥签署我们的请求。与该域相对应,我们有 .pfx 文件,其中包含私钥并与服务器一起存在。

通过下面的代码您可以获得完整的证书链。通常我们有一个函数 ServerCertificateValidationCallback 用于验证证书链,但在这里我们使用它来访问我们正在验证的证书。因此,我们需要为我们的请求注册回调“ServerCertificateValidationCallback”。

下面是返回我们证书的控制台代码:

public static void Main(string[] args)
{
    GetCertificate("https://www.facebook.com", "");
}
/// <summary>
/// Get and write certificate from URL into file in path
/// </summary>
/// <param name="_URL">URL of website with certficate</param>
/// <param name="_path">Path where you want to store certificate</param>
private static void GetCertificate(string url, string path)
{

        var request = (HttpWebRequest)WebRequest.Create(url);
        request.AllowAutoRedirect = false;
        request.ServerCertificateValidationCallback = ServerCertificateValidationCallback;

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        response.Close();
        Console.ReadLine();

}

private static bool ServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    foreach (var cert in chain.ChainElements)
    {
        Console.WriteLine(cert.Certificate.FriendlyName);
        Console.WriteLine(ExportToPem(cert.Certificate));
    }

    return true;
}

/// <summary>
/// Export a certificate to a PEM format string
/// </summary>
/// <param name="_cert">The certificate to export</param>
/// <returns>A PEM encoded string</returns>
public static string ExportToPem(X509Certificate2 cert)
{
    StringBuilder strBuilder = new StringBuilder();

    try
    {
        strBuilder.AppendLine("-----BEGIN CERTIFICATE-----");
        strBuilder.AppendLine(Convert.ToBase64String(cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks));
        strBuilder.AppendLine("-----END CERTIFICATE-----");

    }
    catch (Exception)
    {
    }

    return strBuilder.ToString();
}

关于javascript - 如何获取Web浏览器的公钥(用于HTTPS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53528958/

相关文章:

c# - SslStream.ReadAsync 从不调用 InnerStream.ReadAsync

c# - 如何解决未将对象引用设置为对象实例的问题。?

c# - 如何处理同时用于桌面和 Web 的库中的静态变量?

c# - Server.MapPath 在使用网络图像裁剪库时抛出错误

javascript - 如何在 async.each 内具有 async.waterfall 的外部函数中调用 async.each

javascript - 输出 HTML 代码

Javascript 正则表达式分组

javascript - Css 类名不适用于 React 组件

C# 和 MongoDB 使用 ObjectId 列表删除记录

c# - 由于其保护级别而无法访问