Python

在 PostgreSQL 數據庫中儲存 X509 證書的最佳方法是什麼?

  • August 31, 2018

我正在開發網路身份驗證系統,使用者將對隨機令牌進行數字簽名,並將使用儲存在伺服器上的 X509 證書進行檢查。

因此,我必須在 PostgreSQL 數據庫中儲存幾個 X509 證書(PEM 或 DER 格式)。聽起來很簡單,但我希望能夠搜尋具有主題、頒發者、notBefore、notAfter 和類似條件的證書。

我的想法是在數據庫中有以下列:X509data、notAfter、notBefore、subject、issuer 等。然後我將使用 add_new_X509()、find_X509(search criteria) 等方法創建表示 X509 證書的對象(在 SQL alchemy 中)。所以每當我將使用 add_new_X509() 方法添加新證書,它將自動從證書中讀取所有數​​據並填充其餘列並將原始證書放入 X509data 列。

不幸的是,這個解決方案有兩個缺點:

  1. 我將兩次儲存相同的資訊(在 X509 證書本身和單獨的列中以便於搜尋)
  2. 每當我想讀取 X509 證書時,我的應用程序必須交叉檢查 notAfter、notBefore、subject、issuer 以及儲存在原始證書中的資訊(這是出於安全原因,以防有人試圖修改此欄位)。

所以..有人有更好的想法或建議嗎?也許有人看到此解決方案可能出現的任何其他安全問題?

複製並不理想,但在這種情況下可能是最佳選擇。設置表權限,以便表所有者不是您的應用程序執行的日常數據庫使用者,並且只有GRANT您的應用程序能夠寫入證書數據列,而不是具有到期等的“記憶體”列。有一個SECURITY DEFINER觸發器函式攔截寫入證書欄位並作為特權使用者更新索引記憶體列,方法是使用 X.509 庫在驗證後從證書中提取欄位。

或者,您可以編寫一個 PL/Python、PL/Perl,甚至是一個呼叫 X.509 證書解析器庫來提取欄位並返回它們的 C SQL 函式。所以你會說extract_x509_field(cert, 'subject')。或者甚至可能是一個行返回形式,例如SELECT subject, issuerName FROM (SELECT extract_x509_fields(cert) FROM the_table)whereextract_x509_fields返回一行所有相關證書數據。使用這種方法,您可以創建CREATE INDEX cert_issuer ON certificate_table( extract_x509_field(cert,'issuer') );可用於匹配WHERE表達式的功能索引。您根本不需要為提取的數據提供表列。缺點是這可能會更慢,因為證書會在索引創建期間、索引重新檢查等期間被多次解析。

無論哪種方式,您的應用程序都必須作為 PostgreSQL 使用者執行,該使用者不是數據庫所有者,不是超級使用者,也不是相關表和索引的所有者。它應該是GRANT必要的最低權利,僅此而已。如果您有完全不同的任務(例如,只讀與寫入和更新),請考慮為它們使用不同的數據庫使用者,這樣即使您的應用程序的“讀取”部分被欺騙嘗試寫入欄位/更新證書/etc,它沒有權限。

引用自:https://dba.stackexchange.com/questions/36416