在使用 SSL 時,我終生無法弄清楚如何為 Google SQL PostgreSQL 實體準備作業連接字串。它適用于公共 IP。但是我不知道在使用 SSL 時如何為 Npgsql 準備正確的連接字串。
不確定問題是我的客戶端機器配置還是連接字串引數。
消毒版:
包括錯誤詳細資訊=True;客戶端證書=client-cert.pem;根證書=server-ca.pem;客戶端證書密鑰=client-key.pem;信任服務器證書=true;SSL 模式=首選;持久安全資訊=True ;密碼=[秘密];用戶名=[秘密];資料庫=[秘密];主機=[秘密];
錯誤和堆疊跟蹤:
28000:連接需要 Npgsql.NpgsqlConnector 處的有效客戶端證書。<g__ReadMessageLong|194_0>d.MoveNext() --- 從先前引發例外的位置結束堆疊跟蹤 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Npgsql.NpgsqlConnector.d__0.MoveNext() --- 在 System.Runtime 中從先前拋出例外的位置結束堆疊跟蹤。 CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任務任務)在 Npgsql.NpgsqlConnector.d__175。MoveNext() --- 從先前引發例外的位置結束堆疊跟蹤 --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Npgsql 的 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) .ConnectorPool.d__41.MoveNext() --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)在 Npgsql.ConnectorPool.<>c__DisplayClass38_0.<g__RentAsync|0>d.MoveNext() --- 從先前拋出例外的位置結束堆疊跟蹤---在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)在 System.Runtime.CompilerServices.TaskAwaiter。HandleNonSuccessAndDebuggerNotification(Task task) at Npgsql.NpgsqlConnection.<>c__DisplayClass41_0.<g__OpenAsync|0>d.MoveNext() --- 在 System.Runtime.CompilerServices.TaskAwaiter 上一個拋出例外的位置結束堆疊跟蹤。 ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Npgsql.NpgsqlConnection.Open() at MavPeople.Common.GetAuthObject(String login) in C:\Projects\MavPeople\MavPeople\Common.vb :C:\Projects\MavPeople\MavPeople\MainForm.vb 中 MavPeople.MainForm.MainForm_Load(Object sender, EventArgs e) 的第 326 行:第 86 行Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Npgsql.NpgsqlConnection.Open() at MavPeople.Common.GetAuthObject(String login) in C:\Projects\MavPeople \MavPeople\Common.vb:C:\Projects\MavPeople\MavPeople\MainForm.vb 中 MavPeople.MainForm.MainForm_Load(Object sender, EventArgs e) 的第 326 行:第 86 行Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Npgsql.NpgsqlConnection.Open() at MavPeople.Common.GetAuthObject(String login) in C:\Projects\MavPeople \MavPeople\Common.vb:C:\Projects\MavPeople\MavPeople\MainForm.vb 中 MavPeople.MainForm.MainForm_Load(Object sender, EventArgs e) 的第 326 行:第 86 行
所有證書均從 Google Cloud Console 下載:*.pem 檔案。
uj5u.com熱心網友回復:
好吧,終于找到了穿過這個老鼠窩的路。為了其他人的利益,我將嘗試描述完成這項作業所需的條件。
首先,簡要描述一下我們正在嘗試做的事情:
我們有一個 WinForms .Net Framework(不是 .Net Core)應用程式,它使用 PostgreSQL 的 Npgsql 提供程式連接到配置為需要 SSL/TLS 連接的 Google SQL PostgreSQL 實體:服務器配置
作為上述服務器配置的一部分,您將下載:
- client-key.pem - 客戶端密鑰檔案
- client-cert.pem - 客戶端證書檔案
- server-ca.pem - 根證書檔案
在我們可以在我們的應用程式中使用這些檔案之前,我們需要以我們的應用程式可以使用的格式生成證書(PEM 格式檔案僅在 .Net Framework 5 及更高版本中可用)。我們將轉換為 pkcs12 格式。
為此,我們將使用 Git Bash 環境(可能有其他實用程式可以執行此操作,但我花了 2 天時間才弄清楚這一點,并且可行!)。
在下載 pem 證書的檔案夾中打開 Git Bash 環境。
假設檔案如上所示命名,執行以下命令生成新的 pkcs12 證書:
winpty openssl pkcs12 -export -out client.pfx -inkey client-key.pem -in client-cert.pem -certfile server-ca.pem
作為處理的一部分,您將被要求創建一個密碼來簽署生成的檔案,并被要求確認。
生成的證書(在我的例子中是 client.pfx)和密碼可以在我們的應用程式連接字串中使用。
現在,這可能不是最安全的方法,但它對我有用。我有人有更好的方法來做到這一點,請分享:
我將 client.pfx 添加到我的專案中并將其屬性設定為:
- 構建動作 = 內容
- 復制到輸出目錄 = 如果更新則復制
這可確保 client.pfx 與我的應用程式一起部署,并且在運行時可用于我的資料庫連接字串。
現在,對于我用于 Npgsql 提供程式的資料庫連接字串。我將以串列形式顯示連接字串引數:
- 包括錯誤細節=真;
- SSL證書=client.pfx;
- SSL 密碼=[您指定的密碼];
- 信任服務器證書=true;
- SSL 模式=要求;
- 持久安全資訊=真;
- 密碼=[秘密];
- 用戶名=[秘密];
- 資料庫=[秘密];
- 主機=[秘密];
完整(已清理)形式的連接字串:
Include Error Detail=True;SSL Certificate=client.pfx;SSL Password=[無論您指定什么密碼];Trust Server Certificate=true;SSL Mode=Require;Persist Security Info=True;Password=[secret];Username= [秘密];資料庫=[秘密];主機=[秘密];
特別感謝 @shay 和 Npgsql 提供者的貢獻者。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/511463.html
標籤:Google Cloud Collective ssl谷歌云平台npgsql
上一篇:如何從CSR中提取替代名稱資料?
