在 PostgreSQL 數據庫中儲存 X509 證書的最佳方法是什麼?
我正在開發網路身份驗證系統,使用者將對隨機令牌進行數字簽名,並將使用儲存在伺服器上的 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 列。
不幸的是,這個解決方案有兩個缺點:
- 我將兩次儲存相同的資訊(在 X509 證書本身和單獨的列中以便於搜尋)
- 每當我想讀取 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,它沒有權限。