SQL Server 自簽名證書 - 沒有私鑰?
我最近使用 SQL 伺服器自簽名證書打開 SSL 加密,然後我開始思考更多關於
- 加密算法、認證方式
似乎使用的加密/散列算法取決於客戶端/伺服器作業系統之間的 SChannel 協商。- 美好的。
- 自簽名證書的密鑰長度。
我試過查詢這個
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