簡體   English   中英

Npgsql連接.net核心ssl證書web api

[英]Npgsql connection with ssl certificates in .net core web api

我正在為 .net 核心 web api 項目使用 NpgSqlConnection。 當前 PostgreSQL 服務器已移至另一台,需要使用客戶端證書進行連接。 我們提供了 3 個證書文件,分別名為 client-cert.pem、client-key.pem 和 server-ca.pem。 我能夠通過瀏覽器的 pgAdmin 使用客戶端證書和密鑰文件連接到服務器。 但是,我無法通過我的代碼進行連接。 從 inte.net 嘗試了幾種方法,但我仍然收到以下錯誤。

{“28000:連接需要有效的客戶端證書”}

下面給出了我正在嘗試的代碼片段。

var connectionString = "User ID=" + _dOptions.Value.AuthenticationCredentials.UserName
               + ";Password=" + _dOptions.Value.AuthenticationCredentials.PassWord
               + ";Server=" + _dOptions.Value.Server
               + ";Port=" + _dOptions.Value.Port.ToString()
               + ";Database=" + _dOptions.Value.Database
               + ";Integrated Security=true;Pooling=true;SSL Mode=Require;Trust Server Certificate=true";

_con = new NpgsqlConnection(connectionString);
_con.ProvideClientCertificatesCallback += new ProvideClientCertificatesCallback(MyClientCertificates);
private void MyClientCertificates(X509CertificateCollection certificates)
{
      var cert = new X509Certificate("C:\\Users\\c-Anish\\Documents\\cloud_sql_replica_certs\\DEV\\client-cert.pem");
      certificates.Add(cert);
}

另外,這里我們只使用名為 client-cert.pem 的客戶端證書,但是,我認為我們可能需要使用 client-key.pem? 如果是這樣,我該如何添加? 我在這里錯過了什么?

任何幫助將不勝感激,因為我遇到了這個問題。

我為此找到了解決方案,並考慮將其張貼在這里,這可能會幫助面臨類似問題的其他人。

它不適用於 .pem 文件。 我已使用以下命令將其轉換為 a.pfx 文件,並且開始正常工作。

openssl pkcs12 -inkey C:\Certs\client-key.pem -in C:\Certs\client-cert.pem -export -out C:\Certs\client-cert.pfx

參考:證書認證支持

編輯

我沒有創建物理 pfx 文件,而是能夠合並這兩個 pem 文件並讓它工作。 下面給出代碼片段,供以后參考。

public X509Certificate2 GetCombinedCertificateAndKey(string certificatePath, string privateKeyPath)
    {
        using var publicKey = new X509Certificate2(certificatePath);

        var privateKeyText = System.IO.File.ReadAllText(privateKeyPath);
        var privateKeyBlocks = privateKeyText.Split("-", StringSplitOptions.RemoveEmptyEntries);
        var privateKeyBytes = Convert.FromBase64String(privateKeyBlocks[1]);
        using var rsa = RSA.Create();

        if (privateKeyBlocks[0] == "BEGIN PRIVATE KEY")
        {
            rsa.ImportPkcs8PrivateKey(privateKeyBytes, out _);
        }
        else if (privateKeyBlocks[0] == "BEGIN RSA PRIVATE KEY")
        {
            rsa.ImportRSAPrivateKey(privateKeyBytes, out _);
        }

        var keyPair = publicKey.CopyWithPrivateKey(rsa);
        var Certificate = new X509Certificate2(keyPair.Export(X509ContentType.Pfx));
        return Certificate;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM