Sql-Server

SQL Server 自簽名證書 - 沒有私鑰?

  • June 16, 2020

我最近使用 SQL 伺服器自簽名證書打開 SSL 加密,然後我開始思考更多關於

  1. 加密算法、認證方式

似乎使用的加密/散列算法取決於客戶端/伺服器作業系統之間的 SChannel 協商。- 美好的。

  1. 自簽名證書的密鑰長度。

我試過查詢這個

select  name, pvt_key_encryption_type_desc from sys.certificates

##MS_SQLResourceSigningCertificate##    NO_PRIVATE_KEY
##MS_SQLReplicationSigningCertificate## NO_PRIVATE_KEY
##MS_SQLAuthenticatorCertificate##  NO_PRIVATE_KEY
##MS_AgentSigningCertificate##  NO_PRIVATE_KEY
##MS_PolicySigningCertificate## NO_PRIVATE_KEY
##MS_SmoExtendedSigningCertificate##    NO_PRIVATE_KEY
##MS_SchemaSigningCertificate990F36EF1B3577FE5687C7465F0A5135DE9E6834## NO_PRIVATE_KEY

q1) 我可以檢查用於 SSL 加密的證書是否是 MS_SQLAuthenticatorCertifcate 嗎?

q2) SSL 加密/CERT 如何與“NO PRIVATE KEY”一起使用?據我所知,證書/非對稱加密將涉及用於加密的公鑰(在證書中提供),並且證書的所有者將擁有其用於解密的私鑰?

為什麼這裡不是這種情況?

這對於 Sean 的回答來說太大了,所以讓我補充一下。

q1) 我可以檢查用於 SSL 加密的證書是否是 MS_SQLAuthenticatorCertifcate 嗎?

根據Principals (Database Engine) doc,##MS_SQLAuthenticatorCertificate## 證書用於基於內部證書的登錄。

至少據我所知,在實例啟動期間生成的自簽名證書不會被 DMV 公開。**編輯:**此外,肖恩在他的回答中提到,此證書僅駐留在 SQL Server 程序記憶體空間中,出於安全原因,在 SQL Server 關閉時將其刪除。

q2) SSL 加密/CERT 如何與“NO PRIVATE KEY”一起使用?據我所知,證書/非對稱加密將涉及用於加密的公鑰(在證書中提供),並且證書的所有者將擁有其用於解密的私鑰?

實際的 SQL Server 自簽名證書是帶有公鑰/私鑰對的 X509 證書。但是,請注意,出於性能原因,TLS 使用對稱密鑰(用於加密和解密的密鑰相同)通過線路加密/解密消息。此會話特定密鑰在 TLS 握手期間生成,自簽名證書(或預置證書)用於生成和保護交換的秘密,而不是加密後續消息。此 Microsoft 文件 ( https://technet.microsoft.com/en-us/library/dn786441(v=ws.11).aspx ) 描述了傳輸層安全 (TLS) 協議的工作原理,並提供了 IETF RFC 的連結TLS 1.0、TLS 1.1 和 TLS 1.2。

您可以從此擴展事件跟踪中找到有關實際協商的 TLS 協議和密碼的更多詳細資訊,但這需要 SQL Server 2016 SP1 或更高版本:

CREATE EVENT SESSION [tls] ON SERVER 
ADD EVENT sqlsni.trace(
   WHERE ([sqlserver].[equal_i_sql_ansi_string]([function_name],'Ssl::Handshake') AND [sqlserver].[like_i_sql_unicode_string]([text],N'%TLS%')))
ADD TARGET package0.event_file(SET filename=N'tls_trace')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF);

下面是使用來自針對 SQL Server 2017 的跟踪的自簽名證書的事件文本欄位範例

SNISecurity Handshake Handshake succeeded. Protocol: TLS1.2 (1024), Cipher: AES 256 (26128), Cipher Strength: 256, Hash: SHA 384 (32781), Hash Strength: 0, PeerAddr: ::1 

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